一、innodb的臟頁刷新機制說明:
1、當innodb中的臟頁比例超過innodb_max_dirty_pages_pct_lwm的值時,這個時候innodb就會開始刷新臟頁到磁盤。
2、當innodb中的臟頁比例超過innodb_max_dirty_pages_pct_lwm的值,而且還超過innodb_max_dirty_pages_pct時
innodb就會進入勤快刷新模式(agressively flush)這個模式下innodb會把臟頁更快的刷新到磁盤。
3、還有一種情況叫做sharp checkpoint ,當innodb要重用它之前的redo文件時,就會把innodb_buffer_pool中所有與這
個文件有關的頁面都要刷新到磁盤;這樣做就有可能引起磁盤的IO風暴了,輕者影響性能,重者影響可用性。
二、對上面機制的再次說明:
1、臟頁刷新是innodb后台執行的確定性工作,默認情況下每秒都會有(check point);innodb的臟頁刷新就有點像現實生
活中的呼吸一樣,通常是以固定的頻率進行的,一.1 就好比是安靜的情況下,一.2就好比是運動的情況下,一.3就好比
你在水中閉氣一分中后剛探出頭一樣。
三、對於控制刷新機制的各個參數的說明:
1、innodb_max_dirty_pages_pct默認值為75,也就是說當臟頁比例超過75%時才會進入勤快刷新模式。
2、innodb_max_dirty_pages_pct_lwm默認值是0,0對於innodb_max_dirty_pages_pct_lwm來說是一個特殊值,它表示
不啟用這個功能;由於沒有啟用這個功能,也就是說innodb_buffer_pool中的臟頁比例會操持在75%左右。
四、一.3的情況MySQL如何解決:
1、對於第三種情況MySQL的解決思路是這樣的,IO風暴是由redo 文件重用時要刷新整個redo文件對應的innodb_buffer_pool頁面,
也就是說風暴發生的時刻是重用redo日志是發生的;針對這一問題Mysql的解決方案是根據redo的生成速率,實時的刷新
innodb_buffer_pool中的頁面到磁盤,這樣在redo日志文件重用時就不要刷新過多的頁面,也就沒有IO風暴了。由於頁面的刷新
是根據redo的生成速率自動調整的,所以這個方案的名字叫innodb_adaptive_flushing;
2、由於innodb_adaptive_flushing 會自動的刷新,它基本上把一.1中的情況也給解決了,所以默認情況下mysql會把
innodb_max_dirty_pages_pct_lwm=0,0在這里是一個特殊值,在這里表示關閉的意思。
----
學習交流