mysql之抖動

flush: 就是把內(nèi)存里的數(shù)據(jù)寫入磁盤的過程。
臟頁:當(dāng)內(nèi)存數(shù)據(jù)頁跟磁盤數(shù)據(jù)頁內(nèi)容不一致的時候。
干凈頁:內(nèi)存數(shù)據(jù)寫入到磁盤后,內(nèi)存和磁盤上的數(shù)據(jù)頁的內(nèi)容一致的時候。
臟頁和干凈頁都是在內(nèi)存中。

1、數(shù)據(jù)庫的flush場景

  • 對應(yīng)的redo log日志滿了,系統(tǒng)會停止所有更新操作,把checkpoint往前推進(jìn),redo log日志留出空間繼續(xù)寫。
  • 對應(yīng)的系統(tǒng)內(nèi)存不足,當(dāng)需要新的內(nèi)存頁,而內(nèi)存不夠用的時候,就要淘汰一些數(shù)據(jù)頁,空出內(nèi)存給別的數(shù)據(jù)頁使用。如果淘汰的是臟頁,就要先將臟頁寫到磁盤。InnoDB用緩沖池(buffer pool)管理內(nèi)存,緩沖池中的內(nèi)存頁有3種狀態(tài):
    1、還沒有使用的
    2、使用了并且是干凈頁
    3、使用了并且是臟頁
  • mysql系統(tǒng)空閑的時候,刷一點(diǎn)臟頁。
  • mysql正常關(guān)閉的時候,mysql會把內(nèi)存的臟頁都flush到磁盤上。

2、InnoDB刷臟頁的控制策略

innodb_io_capacity <75%進(jìn)行參數(shù)設(shè)置,可以設(shè)置InnoDB刷臟頁的控制策略。
根據(jù)上述算得的 F1(M) 和 F2(N) 兩個值,取其中較大的值記為 R,之后引擎就可以按照 innodb_io_capacity 定義的能力乘以 R% 來控制刷臟頁的速度。
臟頁比例:Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total
mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty'; select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'; select @a/@b;

InnoDB刷臟頁速度策略:


InnoDB刷臟頁速度策略

測試磁盤隨機(jī)讀寫的命令:fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
redo log狀態(tài)圖:

redo log狀態(tài)圖

更新和flush過程:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容