MySQL之突然執行變慢

2021-10-07 18:54:26 字數 1933 閱讀 1534

為何會有這種情況?

這種情況的發生,有可能是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 ...