InnoDBストレージエンジン(engine)メインスレッド(master thread)ワークフロー分析
本文は《MySQL技術内幕InnoDB記憶エンジン》の中のmaster threadソースコードの分析理解に基づいて、整理する.この本の作者が提供したmaster threadの偽コード:
説明:
log buffer flush to disk REDOログキャッシュ(redo log)をログファイル(log file)にリフレッシュ
merge insert bufferは、InnoDBエンジン特有の非集計インデックスの挿入または更新を指し、インデックス・ページに直接挿入するのではなく、挿入された非集計インデックスがバッファ・プールにあるかどうかを判断します.ある場合は、直接挿入します.存在しない場合は、メインの挿入キャッシュ領域に配置してから、バッファと非集計インデックスページのサブノードのマージ操作を一定の頻度で挿入します.通常、複数の挿入が1つの操作にマージされます.
full purgeフルクリーンアップ操作とは、不要なUndoページを削除することです.テーブルに対してupdate、deleteのような操作を実行すると、元のローは削除とマークされますが、コンシステンシリード(consistent read)の関係で、これらのローバージョンの情報を保持する必要があります.しかし、full purgeプロセスでは、InnoDBストレージエンジンは、現在のトランザクションシステムで削除されたローが削除できるかどうかを判断します.たとえば、以前のバージョンのUndo情報を読み込むクエリー操作がある場合があります.できれば、InnoDBはすぐに削除します.注意full purgeは、使用されなくなったUndoページのみを消去します.
buffer pool flush dirty pageディスク上のデータブロックと比較して、バッファプールで変更したデータページ(変更したdata page、つまり汚れたページdirty page)をハードディスクにリフレッシュすることを指します.
fuzzy checkpointはファジイチェックポイントを生成し、windowsオペレーティングシステムのシステム復元ポイントに似ているチェックポイントは、最古のログシーケンス番号(LSN)のページをハードディスクに書きます.
innodb_max_dirty_pages_pct InnoDBストレージエンジンの動的変数で、バッファプール内の汚れたページの割合を指します.理論的にはより小さな値、より大きなIO.
InnoDB Pluginからshow engine innodb statusで現在のmaster threadのステータス情報を表示できます.
1 void master_thread(){
2 goto loop;
3 loop:
4 for(int i = 0; i<10; i++){
5 thread_sleep(1) // sleep 1 second
6 do log buffer flush to disk
7 if ( last_one_second_ios < 5 )
8 do merge at most 5 insert buffer
9 if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct )
10 do buffer pool flush 100 dirty page
11 if ( no user activity )
12 goto backgroud loop
13 }
14 if ( last_ten_second_ios < 200 )
15 do buffer pool flush 100 dirty page
16 do merge at most 5 insert buffer
17 do log buffer flush to disk
18 do full purge
19 if ( buf_get_modified_ratio_pct > 70% )
20 do buffer pool flush 100 dirty page
21 else
22 buffer pool flush 10 dirty page
23 do fuzzy checkpoint
24 goto loop
25 background loop:
26 do full purge
27 do merge 20 insert buffer
28 if not idle:
29 goto loop:
30 else:
31 goto flush loop
32 flush loop:
33 do buffer pool flush 100 dirty page
34 if ( buf_get_modified_ratio_pct> innodb_max_dirty_pages_pct )
35 goto flush loop
36 goto suspend loop
37 suspend loop:
38 suspend_thread()
39 waiting event
40 goto loop;
説明:
log buffer flush to disk REDOログキャッシュ(redo log)をログファイル(log file)にリフレッシュ
merge insert bufferは、InnoDBエンジン特有の非集計インデックスの挿入または更新を指し、インデックス・ページに直接挿入するのではなく、挿入された非集計インデックスがバッファ・プールにあるかどうかを判断します.ある場合は、直接挿入します.存在しない場合は、メインの挿入キャッシュ領域に配置してから、バッファと非集計インデックスページのサブノードのマージ操作を一定の頻度で挿入します.通常、複数の挿入が1つの操作にマージされます.
full purgeフルクリーンアップ操作とは、不要なUndoページを削除することです.テーブルに対してupdate、deleteのような操作を実行すると、元のローは削除とマークされますが、コンシステンシリード(consistent read)の関係で、これらのローバージョンの情報を保持する必要があります.しかし、full purgeプロセスでは、InnoDBストレージエンジンは、現在のトランザクションシステムで削除されたローが削除できるかどうかを判断します.たとえば、以前のバージョンのUndo情報を読み込むクエリー操作がある場合があります.できれば、InnoDBはすぐに削除します.注意full purgeは、使用されなくなったUndoページのみを消去します.
buffer pool flush dirty pageディスク上のデータブロックと比較して、バッファプールで変更したデータページ(変更したdata page、つまり汚れたページdirty page)をハードディスクにリフレッシュすることを指します.
fuzzy checkpointはファジイチェックポイントを生成し、windowsオペレーティングシステムのシステム復元ポイントに似ているチェックポイントは、最古のログシーケンス番号(LSN)のページをハードディスクに書きます.
innodb_max_dirty_pages_pct InnoDBストレージエンジンの動的変数で、バッファプール内の汚れたページの割合を指します.理論的にはより小さな値、より大きなIO.
InnoDB Pluginからshow engine innodb statusで現在のmaster threadのステータス情報を表示できます.