亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

InnoDB后臺線程介紹(一)

2023-08-18 06:50:12
22
0

一、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
	}
0條評論
作者已關閉評論
lawen
12文章數
1粉絲數
lawen
12 文章 | 1 粉絲
原創

InnoDB后臺線程介紹(一)

2023-08-18 06:50:12
22
0

一、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
	}
文章來自個人專欄
文章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0