innodb master執行緒的工作機制
由幾個loop組成:
Loop
Background loop
Flush loop
Suspend loop
Loop
分為兩大部分:per-second和per-10-second
Per-second:
重新整理日誌緩衝--
合併插入緩衝—如果前1秒的IO次數小於5,innodb會認為當前IO壓力小,就會執行此操作
重新整理100個髒頁—如果當前髒頁比例超過innodb_max_dirty_pages_pct,則重新整理髒頁
如果當前沒有active操作,則切換到background loop
--相應虛擬碼
For ( I = 0; I < 10; i++) {
Thread_sleep(1);
Do log flush to disk;
If ( last_one_second_ios < 5)
Do merge insert buffer
If ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct )
Flush dirty page innodb_io_capacity
If ( no user actitivity)
Goto background loop
}
注:當系統負載較大時,可能每次迴圈間隙小於1秒,由InnoDB自動調整
Show engine innodb status相應輸出片斷
-------------------
BACKGROUND THREAD
-------------------
Srv_master_thread loops: 45 1_second, 45 sleeps, 4 10_second, 6 background, 6 flush --系統空閒時候
Srv_master_thread loops: 2188 1_second, 1537 sleeps, 218 10_second, 2 background, 2 flush --繁忙,並非每次1_second都sleep 1秒
Per-10second:
重新整理100個髒頁— 如果過去10秒IO操作小於200次,則重新整理髒頁
合併至多5個插入緩衝—
重新整理重做日誌緩衝—
刪除無用的undo頁— 執行full purge,判斷標誌為deleted的行是否可以清除
重新整理100或10個髒頁—如果buf_get_modified_ratio_pct > 70% 重新整理100個髒頁,否則重新整理10個髒頁
生成checkpoint—將最老的LSN頁寫入磁碟
--相應虛擬碼
If ( last_10_second_ios < 200 )
Flush dirty page innodb_io_capacity
Do merge insert buffer
Flush log buffer
Do full purge
Background loop
若當前沒有使用者活動,或關閉資料庫時執行,依次執行如下操作:
刪除無用的undo頁
合併20個插入緩衝
如果有active活動,跳回loop;否則重新整理100個髒頁,如果buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct,則跳轉至flush loop;
Flush loop
每次重新整理100個頁,直到符合條件為止(buf_get_modified_ratio_pct < innodb_max_dirty_pages_pct)
如果flush loop無事可做,則跳轉至suspend_loop
Suspend loop
將mater thread掛起,等待被觸發
上述每次重新整理100個髒頁或執行N個insert buffer全是hard coding,innodb plugin提供了patch,可透過引數控制這一數字
Innodb_io_capacity:一次重新整理的髒頁數量,預設200;而每次合併插入緩衝的數量=innodb_io_capacity * 5%
Innodb_adaptive_flushing:透過buf_flush_get_desired_flush_rate判斷需要重新整理髒頁的數量,透過判斷redo log生成速度決定可重新整理髒頁的數量,即使比例< innodb_max_dirty_pages_pct,也可能重新整理髒頁;
以上資訊來源於
《MySQL技術內幕 –InnoDB儲存引擎》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-757902/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 配置InnoDB的併發執行緒MySql執行緒
- java 多執行緒 master worker模式Java執行緒AST模式
- MySQL:Innodb purge執行緒略解MySql執行緒
- MySQL:Innodb page clean 執行緒 (二) 解析MySql執行緒
- InnoDB儲存引擎——後臺執行緒儲存引擎執行緒
- 執行緒同步機制執行緒
- quartz的執行緒池機制quartz執行緒
- MySQL:Innodb page clean 執行緒 (一) 基礎MySql執行緒
- MySQL 配置InnoDB主執行緒I/O速率MySql執行緒
- 執行緒間的協作機制執行緒
- JavaScript執行緒機制與事件機制JavaScript執行緒事件
- MySQL 配置後臺InnoDB I/O執行緒數MySql執行緒
- 一起分析執行緒的狀態及執行緒通訊機制執行緒
- 執行緒鎖 -賣票機制執行緒
- java synchronize - 執行緒同步機制Java執行緒
- 第九篇:Map/Reduce 工作機制分析 - 作業的執行流程
- 大話Android多執行緒(三) 執行緒間的通訊機制之HandlerAndroid執行緒
- 怎麼利用執行緒的機制,請教執行緒
- 解析Java的多執行緒機制(2)(轉)Java執行緒
- 解析Java的多執行緒機制(1)(轉)Java執行緒
- 分析.Net裡執行緒同步機制執行緒
- 多執行緒之等待通知機制執行緒
- JAVA多執行緒與鎖機制Java執行緒
- 執行緒同步機制-包裝類執行緒
- FlutterEngine執行緒管理與DartIsolate機制Flutter執行緒Dart
- ORACLE的工作機制Oracle
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 執行緒的建立及執行緒池執行緒
- java多執行緒:執行緒體往外丟擲異常的處理機制實踐Java執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- ArkUI中的執行緒和看門狗機制UI執行緒
- 深入理解 OpenMP 執行緒同步機制執行緒
- RxJava(RxAndroid)執行緒切換機制RxJavaAndroid執行緒
- java多執行緒系列之future機制Java執行緒