XtraDB 5.7: Key Performance Algorithms
Laurynas Biveinis Alexey Stroganov Percona firstname.lastname@percona.com
XtraDB 5.7: Key Performance Algorithms Laurynas Biveinis Alexey - - PowerPoint PPT Presentation
XtraDB 5.7: Key Performance Algorithms Laurynas Biveinis Alexey Stroganov Percona firstname.lastname@percona.com XtraDB 5.7 Key Performance Algorithms Focus on the buffer pool , flushing , the doublewrite buffer Talk assumes
Laurynas Biveinis Alexey Stroganov Percona firstname.lastname@percona.com
buffer
data structures
(space_id; page_id) ? Hash array Data page lists
Fold
Clean page INSERT INTO foo VALUES(bar) Dirty page, LSN = 42 Dirty page, LSN = 25 Dirty page, LSN = 32 Dirty page, LSN = 42
Flush list tail:
Dirty page, LSN = 5 Dirty page, LSN = 7 Dirty page, LSN = 12
Flush list head:
Flush up to LSN 10 Clean page Clean page Dirty page, LSN = 12
Flush list head:
(making them young):
Dirty page Clean page Dirty page Clean page Clean page Page access Dirty page Clean page Dirty page Clean page Clean page
to read currently non-present pages. Reading:
Free page Free page Free page Free page Free page Page read Free page Free page Free page Free page Clean page
putting them on the free list:
Dirty page Clean page Dirty page Clean page Clean page Free page Free page Free page Free page Dirty page Dirty page Clean page Clean page Free page Free page Free page Free page Free page
Data page Doublewrite buffer in disk Data file Doublewrite buffer in memory
Add Flush Write
Step 1 Step 2 Step 3
flush list LRU list free list page hash misc. buffer pool mutex flush list mutex page hash latch
flush list LRU list free list page hash misc. buffer pool mutex flush list mutex page hash latch buffer pool instance 0 flush list LRU list free list page hash misc. buffer pool mutex flush list mutex page hash latch buffer pool instance 1
hot
evenly spread out.”
flush list page hash flush list mutex page hash latch LRU list LRU list mutex free list free list mutex misc misc mutex / atomics
Patch contributed to MySQL, and merged in 8.0.0 http://bugs.mysql.com/bug.php?id=75534
flush list page hash flush list mutex page hash latch LRU list LRU list mutex free list free list mutex misc misc mutex / atomics buffer pool instance 0 buffer pool instance 1 flush list page hash flush list mutex page hash latch LRU list LRU list mutex free list free list mutex misc misc mutex / atomics
Improvement by the buffer pool mutex split Improvement by adaptive flushing
performance stability, not necessarily by peak performance
contention by X%, observe TPS increase by ~0%
Time Master thread Query thread 1 Query thread 2
flush list flush flush list flush flush list flush make page young make page young LRU list flush make page young LRU list flush make page young
Time Cleaner thread Query thread 1 Query thread 2
flush list flush flush list flush flush list flush make page young make page young LRU list flush make page young LRU list flush make page young LRU list flush
granularity are still important, but
important now
LRU instance #0 flush list instance #0 LRU instance #1 flush list instance #1 LRU instance #2 flush list instance #2 coordinator thread worker thread #0 worker thread #1 time 0 s 1 s LRU… LRU… LRU…
660 pthread_cond_wait,enter (ib0mutex.h:850), buf_dblwr_write_single_page (ib0mutex.h:850),buf_flush_write_block_low(buf0flu.cc:1096),buf_flush_page (buf0flu.cc1096),buf_flush_single_page_from_LRU (buf0flu.cc:2217), buf_LRU_get_free_block(buf0lru.cc:1401),... 631 pthread_cond_wait,buf_dblwr_write_single_page (buf0dblwr.cc:1213), buf_flush_write_block_low(buf0flu.cc:1096),buf_flush_page (buf0flu.cc:1096), buf_flush_single_page_from_LRU (buf0flu.cc:2217), buf_LRU_get_free_block(buf0lru.cc:1401),... 337 pthread_cond_wait,PolicyMutex<TTASEventMutex<GenericPolicy> (ut0mutex.ic:89),get_next_redo_rseg (trx0trx.cc:1185), trx_assign_rseg_low(trx0trx.cc:1278),trx_set_rw_mode (trx0trx.cc:1278), lock_table(lock0lock.cc:4076),...
631 pthread_cond_wait,buf_dblwr_write_single_page
Is free page available?
Single-page flush Take a free page from the free list Query thread needs a free page
Yes No
Single-page doublewrite Query thread has a free page
XtraDB innodb_empty_free_list_algorithm=backoff
Is free page available?
Wait Take a free page from the free list Query thread needs a free page
Yes No
Single-page doublewrite Query thread has a free page Single-page flush
LRU instance #0 flush list instance #0 LRU instance #1 flush list instance #1 LRU instance #2 flush list instance #2 coordinator thread worker thread #0 worker thread #1 time 0 s 1 s LRU… LRU… LRU… free pages Single page flushes! free pages
LRU flusher #0 LRU flusher #1 LRU instance #0 LRU instance #0 LRU… free pages LRU instance #1 LRU… free pages flush list instance #0 flush list instance #1 coordinator worker #0 time 0 s 1 s flush… flush…
2678 nanosleep (libpthread.so.0), … ,buf_LRU_get_free_block (buf0lru.cc:1435), ... 867 pthread_cond_wait,...,log_write_up_to(log0log.cc:1293),... 396 pthread_cond_wait,…, mtr_t::s_lock(sync0rw.ic:433), btr_cur_search_to_nth_level(btr0cur.cc:1022),... 337 libaio::??(libaio.so.1),LinuxAIOHandler::collect (os0file.cc: 2325), ... 240 poll(libc.so. 6),...,Protocol_classic::read_packet(protocol_classic.cc:810),...
2678 nanosleep, …, buf_LRU_get_free_block
139 libaio::??(libaio.so.1),LinuxAIOHandler::collect (os0file.cc:2448), LinuxAIOHandler::poll(os0file.cc:2594),... 56 pthread_cond_wait,…,buf_dblwr_add_to_batch (buf0dblwr.cc:1111),…,buf_flush_LRU_list_batch (buf0flu.cc:1555), ...,buf_lru_manager(buf0flu.cc:2334),... 25 pthread_cond_wait,…,os_event_wait_low (os0event.cc:534),buf_flush_page_cleaner_worker(buf0flu.cc:3482),... 21 pthread_cond_wait, …, PolicyMutex<TTASEventMutex<GenericPolicy> (ut0mutex.ic:89),buf_page_io_complete (buf0buf.cc:5966), fil_aio_wait(fil0fil.cc:5754),io_handler_thread(srv0start.cc:330),... 8 pthread_cond_timedwait,…,buf_flush_page_cleaner_coordinator (buf0flu.cc:2726),...
56 pthread_cond_wait, …, buf_dblwr_add_to_batch
112 libaio::??(libaio.so.1),LinuxAIOHandler::collect (os0file.cc:2455),...,io_handler_thread(srv0start.cc:330),... 54 pthread_cond_wait,…,buf_dblwr_flush_buffered_writes (buf0dblwr.cc:1287),…,buf_flush_LRU_list (buf0flu.cc:2341),buf_lru_manager(buf0flu.cc:2341),... 35 pthread_cond_wait, …, PolicyMutex<TTASEventMutex<GenericPolicy> (ut0mutex.ic:89), buf_page_io_complete(buf0buf.cc:5986), …, io_handler_thread(srv0start.cc:330),... 27 pthread_cond_wait,...,buf_flush_page_cleaner_worker(buf0flu.cc:3489),... 10 pthread_cond_wait,…,enter(ib0mutex.h:845), buf_LRU_block_free_non_file_page(ib0mutex.h:845), buf_LRU_block_free_hashed_page(buf0lru.cc:2567), …,buf_page_io_complete(buf0buf.cc:6070), …,io_handler_thread (srv0start.cc:330),...
provided by LRU batch flushing or single-page flushing
44