void master_thread(){
? ? ? ? ? ? ? ? ? ? ? goto loop;
? ? ? ? ? ? ? ? ? ? ? loop:
? ? ? ? ? ? ? ? ? ? ? for(int i=0;i<10;i++){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thread_sleep(1)//sleep 1 second
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do log buffer flush to disk? #重做日志緩沖刷新到重做日記文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(last_one_second_ios<5%innodb_io_capacity)? ? #一秒內的IO次數小于innodb_io_capacity值的5%
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do merge 5%innodb_io_capacity insert buffer? ? #合并5%插入緩沖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct)? ? #緩沖池中臟頁比例超過設定的innodb_max_dirty_pages_pct
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush 100%innodb_io_capacity dirty page? ? ? #從緩沖區(qū)刷新臟頁時,刷新臟頁的數量為innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if enable adaptive flush? ? ? #如果開啟innodb_adaptive_flushing自適應刷新
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush desired amount dirty page? ? #刷新緩沖區(qū)所需數量的臟頁但壮,由desired amount dirty page決定
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(no user activity)? ? #沒有用戶活動(數據庫空閑)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto backgroud loop? ? ? #切換到background loop循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(last_ten_second_ios<innodb_io_capacity)? #十秒內的IO操作小于innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush 100%innodb_io_capacity dirty page? ? #從緩沖區(qū)刷新臟頁時饮醇,刷新臟頁的數量為innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do merge 5%innodb_io_capacity insert buffer? ? #合并5%插入緩沖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do log buffer flush to disk? ? #重做日志緩沖刷新到重做日記文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do full purge? ? #刪除無用的Undo頁
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(buf_get_modified_ratio_pct>70%)? ? #緩沖池中臟頁比例大于70%
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush 100%innodb_io_capacity dirty page? ? #從緩沖區(qū)刷新臟頁時杂曲,刷新臟頁的數量為innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush 10%innodb_io_capacity dirty page? ? #從緩沖區(qū)刷新臟頁時脾猛,刷新臟頁的數量為10%innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto loop? #跳回主循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? background loop:? #跳轉到background loop循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do full purge? ? #刪除無用的Undo頁
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do merge 100%innodb_io_capacity insert buffer? ##合并100%插入緩沖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if not idle:? ? ? #無用戶活動
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto loop:? ? #跳回主循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto flush loop? ? #跳到flush loop
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flush loop:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? do buffer pool flush 100%innodb_io_capacity dirty page? #從緩沖區(qū)刷新臟頁時,刷新臟頁的數量為10%innodb_io_capacity
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct)? ? #緩沖池中臟頁比例超過設定的innodb_max_dirty_pages_pct
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? go to flush loop?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto suspend loop? #切換到suspend loop
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? suspend loop:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? suspend_thread()? ? #進程掛起
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? waiting event? ? ? #等待事件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto loop;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
以上偽代碼摘自《MySQL技術內幕:InnoDB存儲引擎(第2版)》 — 姜承堯
新版本的InnoDB對于刷新臟頁的操作塘砸,從Master Thread線程分離到一個單獨的Page Cleaner Thread足淆,從而減輕了Master Thread的工作,同時進一步提高了系統的并發(fā)性丧裁。其余工作原理不變护桦。