髒頁刷盤策略,導致應用寫日誌阻塞,響應時間變長

2021-08-28 10:40:38 字數 1170 閱讀 9215

今天大資料組的同學與測試組的同學對系統做壓測,發現qps怎麼也上不去,於是去幫忙看了一下;

根據統計,發現介面響應時間不穩定,時好時壞,好的時候幾十毫秒,不好的時候好幾秒,差別非常大,而且幾次壓測完成後,最後的一些請求時間全都是兩三秒的樣子;於是使用greys去定位了一下相應慢的**,發現竟然是寫日誌操作,難道是日誌列印太多了,系統寫日誌將io打滿了?於是又重新做了一輪壓測,壓測的同時使用iostat命令監控系統的io狀況,然後就問題了,通過iostat發現,連續幾秒鐘基本沒有什麼io操作,然後突然出現幾秒鐘的io的寫操作將io打滿,整個壓測過程中都是這樣;

這就解釋清楚了為什麼壓測時有時候請求響應時間只需要幾十毫秒,有時候連續的好多請求響應時間要好幾秒,好幾秒的情況是系統刷盤,將io寫操作阻塞了;被阻塞的請求要等待刷盤結束後才能繼續執行;

我們的寫操作通常不會直接寫入硬碟,而是先寫入到記憶體的cache中,當dirty頁到達一定數量的時候才會執行寫盤操作,那麼何時會往硬碟上寫呢?其中兩個引數非常重要:

這裡有兩個相關的引數控制著髒頁的刷盤策略,通過sysctl -a

[root@vm_0_6_centos ~]# sysctl -a| grep vm.dirty

vm.dirty_background_bytes = 0

vm.dirty_background_ratio = 10

vm.dirty_bytes = 0

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 30

vm.dirty_writeback_centisecs = 500

vm.dirty_background_ratio = 10

當檔案系統快取髒頁數量達到系統記憶體10%時就會觸發pdflush/flush/kdmflush等後台回寫程序執行,將一定快取的髒頁非同步地刷入硬碟;

vm.dirty_ratio = 30

當檔案系統快取髒頁數量達到系統記憶體30%

時,系統開始同步的將快取髒頁刷入硬碟,同時會阻塞其他程序的寫操作;

10與30這兩個值是系統預設值,這也就解釋清楚了為什麼通過iostat觀察到io操作一會有,一會沒有,同時應用請求時而請求時間非常短,時而請求時間變成了好幾秒的情況,因為系統髒頁超過30%,所有寫日誌的io操作被阻塞了;這裡的兩個值是百分比,所以要根據記憶體的大小設定乙個合理的值;

mysql 檢視 髒頁 MySQL 刷髒頁

1.髒頁,乾淨頁 當記憶體資料頁和磁碟資料頁上的內容不一致時,我們稱這個記憶體頁為髒頁 記憶體資料寫入磁碟後,記憶體頁上的資料和磁碟頁上的資料就一致了,我們稱這個記憶體頁為乾淨頁。2.刷髒頁的時機 2.1 redo log redo log 是迴圈寫的,當redo log 寫滿了,即 write p...

MySQL 刷髒頁問題

mysql的刷髒頁問題 平時的工作中,不知道你有沒有遇到過這樣的場景,一條 sql 語句,正常執行的時候特別快,但是有時也不知道怎麼回事,它就會變得特別慢,並且這樣的場景很難復現,它不只隨機,而且持續時間還很短。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到...

Mysql的刷髒頁問題

平時的工作中,不知道你有沒有遇到過這樣的場景,一條 sql 語句,正常執行的時候特別快,但是有時也不知道怎麼回事,它就會變得特別慢,並且這樣的場景很難復現,它不只隨機,而且持續時間還很短。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的...