為何會有這種情況?
這種情況的發生,有可能是mysql把記憶體中髒頁的資料寫入到磁碟中引起的。
那麼何為髒頁?
髒頁的意思就是記憶體中的資料頁跟磁碟中的資料頁內容不一致,這記憶體中的頁就被稱為髒頁。同理可得,如果記憶體中的資料頁和磁碟中的資料頁內容一致,就稱為乾淨頁。
抖的原因
更新髒頁的過程在什麼情況下會出現?
上述四種場景對效能方面的影響? 第
三、第四種場景。屬於正常情況。所以對效能不影響,主要來看第
一、第二種情況。
第一種情況,重新整理髒頁到磁碟中的時候,會導致整個系統不能再接受更新,效能影響很大。
第二種情況,記憶體不夠用,要把資料頁寫到磁碟(淘汰)。innodb中用緩衝池(buffer pool)來管理記憶體,緩衝池中的資料頁在記憶體中有三種狀態:
在乙個查詢中,如果資料頁不在記憶體中,那就需要把磁碟中的資料頁讀取到記憶體中,這個時候就有可能引發記憶體不足的情況。如果這個查詢導致淘汰的資料頁太多,對效能的影響就很大。
innodb刷髒頁的控制策略
先來看幾個引數:
fio -filename=$filename -direct=
1-iodepth 1
-thread -rw=randrw -ioengine=psync -bs=
16k -size=
500m -numjobs=
10-runtime=
10-group_reporting -name=mytest
這個值的設定要適當,如果太低的話innodb會認為你的磁碟讀寫能力很差,這個時候將髒頁資料同步到磁碟中的速度就會變得很慢。
雖然我們已經定義全力刷髒頁的行為,但是畢竟磁碟不止是用來同步髒頁的資料,還需要完成其他業務請求的。所以接下來我們來看看innodb關於控制刷髒頁的速度的策略。
innodb控制刷髒頁的速度的策略
首先說到速度,先來看看速度慢可能引發的情況:1、記憶體中髒頁太多 2、redo log寫滿
根據上面的兩種情況,可得出要考慮兩個因素:1、記憶體中的髒頁比例。2、redo log的寫盤速度
mysql會根據這兩個因素單獨算出兩個數字,看看這兩個數字怎麼算出來的
數字1:有乙個引數innodb_max_dirty_pages_pct是髒頁比例上限,預設是75%,mysql會根據當前的髒頁比例,算出乙個在0-100之間的數字,這個就是數字1,記為f(1)。
數字2:innodb每次寫日誌都有乙個序號,寫入的序號跟checkpoint之間的差值,設為n,innodb根據這個n算出乙個範圍在0-100之間的數字,這就是數字2,記為f(2)
可以看出,數字1是與記憶體中髒頁的比例相關的,數字2是與redo log的寫盤速度相關的。innodb會根據innodb_io_capacity的能力乘r%來控制髒頁的速度。
上述中提到乙個髒頁比例,mysql中可以通過以下方式來檢視髒頁比例。
mysql>
select variable_value into
@afrom global_status where variable_name =
'innodb_buffer_pool_pages_dirty'
;select variable_value into
@bfrom global_status where variable_name =
'innodb_buffer_pool_pages_total'
;select@a/
@b;
mysql中還有乙個連坐機制,如果在同步乙個髒頁的時候,這個髒頁的隔壁也是髒頁,這個時候就會把隔壁的髒頁也給同步了。這種行為可能會導致效率更低下,可以通過innodb_flush_neighbors引數來控制這個行為,值為0的時候表示不會連坐。
參考《mysql實戰》
排查Mysql突然變慢
剛開始得到是系統慢的反饋,沒有將問題點定位到資料庫上,查了半天服務是否正常 因為之前有一次dubbo記憶體洩漏 在將應用服務日誌檢視了一遍後,沒有發現任何異常,只是打了幾個警告的日誌。於是又檢視了業務執行時的日誌,看到日誌都提示了乙個lock wait timeout exceeded try re...
mysql筆記系列 十 sql執行突然變慢的原因
14.sql執行突然變慢的原因,有時候,一條語句執行很快,有時候又執行很慢。mysql在執行更新操作的時候,寫磁碟的時候,是寫的redolog和記憶體,寫完就返回更新成功,此時資料檔案並沒有被更新。記憶體資料和磁碟資料就不一致,這時候記憶體頁也叫髒頁,記憶體資料寫入到磁碟之後,這個時候記憶體資料頁就...
程式呼叫mysql突然變慢 排查Mysql突然變慢
定位問題 剛開始得到是系統慢的反饋,沒有將問題點定位到資料庫上,查了半天服務是否正常 因為之前有一次dubbo記憶體洩漏 在將應用服務日誌檢視了一遍後,沒有發現任何異常,只是打了幾個警告的日誌。於是又檢視了業務執行時的日誌,看到日誌都提示了乙個 lock wait timeout exceeded ...