一、srv_master_thread
文件:srv0srv.cc : srv_master_thread
master thread 主要工作(每隔一秒,不絕對一秒,因為下面的工作是串行的):
-
在后臺清理alter table遺留的表,一次清理一張表
-
檢查是否需要刷redo log buffer或做checkpoint, 確保redo log buffer 有足夠空間
-
insert buffer merge
-
刷 redo log buffer 到文件并fsync到磁盤
-
從table cache 中清除至多50%不使用的表 (server空閑的時候每秒,不空閑的時候每隔一段時間進行一次)
-
做checkpoint (server空閑的時候每秒,不空閑的時候每隔一段時間進行一次)
代碼堆棧如下:
while(!shutdown): # 無限循環,直到shutdown
sleep(1s) # 睡眠1秒
if server is active:
srv_master_do_active_tasks() # 如果server處于活動狀態
else
srv_master_do_idle_tasks() # 如果server處于idle狀態
srv_master_do_active_tasks()
|- row_drop_tables_for_mysql_in_background() # 在后臺清理 ALTER TABLE 遺留的表lazy drop,一次操作drop一個表
|- log_free_check() # 檢查是否需要刷redo log buffer或做checkpoint,確保redo log buffer 有足夠空間
|- ibuf_merge_in_background() # insert buffer merge
|- srv_sync_log_buffer_in_background() # flush redo log buffer
|- srv_master_evict_from_table_cache() # 不是每秒做一次,每隔一段時間,從table cache 中清除至多50%不使用的表緩存
|- log_checkpoint() # 不是每秒做一次,每隔一段時間,做checkpoint
srv_master_do_idle_tasks()
|- row_drop_tables_for_mysql_in_background() # 在后臺清理 ALTER TABLE 遺留的表lazy drop
|- log_free_check() # 確保redo log文件有足夠reusable空間
|- ibuf_merge_in_background() # insert buffer merge
|- srv_master_evict_from_table_cache(50) # 從table cache 中清除至多50%不使用的表
|- srv_sync_log_buffer_in_background # 刷 redo log buffer 到文件并fsync到磁盤
|- log_checkpoint(TRUE, FALSE) # 做checkpoint
row_drop_tables_for_mysql_in_background() # 后臺drop 表,一次操作drop一個表
|- UT_LIST_GET_FIRST(row_mysql_drop_list) # 獲取第一個需要drop的表
|- dict_table_open_on_name() # 打開第一個drop的表
|- row_drop_table_for_mysql_in_background # 在后臺刪除表
| |- trx_allocate_for_background() # 分配一個后臺事務對象
| |- row_drop_table_for_mysql() # 在innodb中刪除表
| |- log_buffer_flush_to_disk() # redo log 刷盤
| |- trx_commit_for_mysql() # 事務提交
| |- trx_free_for_background() # 釋放事務對象
log_free_check() # 檢查是否需要刷redo log buffer或做checkpoint,確保redo log buffer 有足夠空間
|- log_check_margins()
| |- log_flush_margin()
| | |- buf_free > max_buf_free log_write_up_to(false) # 刷redo log buffer到文件,不fsync
| |- log_checkpoint_margin()
log_free_check() # 檢查是否需要刷redo log buffer或做checkpoint,確保redo log buffer 有足夠空間
|- log_check_margins()
| |- log_flush_margin()
| | |- buf_free > max_buf_free log_write_up_to(false) # 刷redo log buffer到文件,不fsync
| |- log_checkpoint_margin()
srv_master_evict_from_table_cache(50)
|- dict_make_room_in_cache(table_definition_cache,50%) # 從table cache 中清除至多50%不使用的表緩存
二、io_handler_thread
文件:srv0start.cc : io_handler_thread
io thread的主要作用:
-
innodb相關的異步IO操作
線程數量:
srv_n_file_io_threads = read_io_threads + write_io_threads + 2 (log and ibuf IO threads)
線程種類:
read_io_thread
write_io_thread
log io thread
ibuf io thread
while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS
|| buf_page_cleaner_is_active
|| !os_aio_all_slots_free()) {
fil_aio_wait(segment); # Waits for an aio operation to complete
}
三、buf_flush_page_cleaner_worker
文件:buf0flu.cc
page cleaner worker的主要作用:
-
真正的buffer pool刷臟線程
線程數量:srv_n_page_cleaners = innodb_page_cleaners > innodb_buffer_pool_instance ? innodb_buffer_pool_instance : innodb_page_cleaners
while (true) {
os_event_wait(page_cleaner->is_requested);
if (!page_cleaner->is_running) {
break;
}
pc_flush_slot(); # flush one slot
}