MySQL儲存寫入效能嚴重抖動分析

2022-03-31 19:41:16 字數 4229 閱讀 8319

案例描述:

通過iostat發現儲存的寫效能長期維持在10mb左右,而且因為寫效能差已經導致資料庫效能變差;

兩個小時以後,iostat發現系統的寫效能已經能夠到100mb以上,資料庫效能也恢復正常。

也就是說,在對系統、資料庫監控中,出現了效能波谷,儲存寫入效能嚴重抖動,為什麼?

一、原理過程

由上原理圖,進行過程解析:

1、事務提交,修改buffer_pool中的資料形成髒頁,並且同時生成redo日誌,將日誌寫入磁碟redo log中;

2、事務提交成功;

假設,有三組redo log檔案,

3、繼續事務提交,修改資料,寫redo log,如果innodb_log_file_size的數值很小,但是產生的redo日誌資訊很大,這樣第一組redo日誌很快就會被寫滿,就要進行日誌檔案切換;

4、如果三組redo log檔案都被寫滿了,就需要進行日誌覆蓋;

5、如果需要覆蓋的redo log日誌檔案記錄的髒頁資訊還沒有寫入到磁碟中,資料庫就會主動加大寫的力度將髒頁資訊刷到磁碟裡;

6、在將redo日誌檔案對應的髒頁刷入磁碟的過程中,事務沒有辦法提交,影響業務。

二、原理分析

1、通過對redo log的修改時間檢視日誌檔案切換時間

通過shell> ls -l /mydata/ib_logfile*,檢視開始修改的時間和最後修改的時間,計算logfile切換時間。

2、如果redo日誌檔案切換時間過短,也就是切換頻繁,就很容易導致寫抖動

1、正常業務繁忙的會是10-20分鐘;

2、如果是比一般的時間短,說明檔案小,切換頻繁。

三、解決寫抖動問題

1、增加redo日誌檔案數量

mysql> show global variables like 'innodb_log_files_in_group';

+---------------------------+-------+

| variable_name | value |

+---------------------------+-------+

| innodb_log_files_in_group | 2 |

+---------------------------+-------+

1 row in set (0.01 sec)

2、擴大日誌檔案容量

mysql> show global variables like 'innodb_log_file_size';

+----------------------+----------+

| variable_name | value |

+----------------------+----------+

| innodb_log_file_size | 50331648 |

+----------------------+----------+

1 row in set (0.01 sec)

3、提高log file的寫效能:將日誌檔案放到寫效能優質的磁碟上

mysql> show global variables like 'innodb_log_group_home_dir';

+---------------------------+-------+

| variable_name | value |

+---------------------------+-------+

| innodb_log_group_home_dir | ./ |

+---------------------------+-------+

1 row in set (0.01 sec)

注意:上面的這三個引數都非動態引數,需要在配置檔案/etc/my.cnf中進行修改儲存,再重新啟動資料庫例項才能生效。

@author:

案例描述:

通過iostat發現儲存的寫效能長期維持在10mb左右,而且因為寫效能差已經導致資料庫效能變差;

兩個小時以後,iostat發現系統的寫效能已經能夠到100mb以上,資料庫效能也恢復正常。

也就是說,在對系統、資料庫監控中,出現了效能波谷,儲存寫入效能嚴重抖動,為什麼?

一、原理過程

由上原理圖,進行過程解析:

1、事務提交,修改buffer_pool中的資料形成髒頁,並且同時生成redo日誌,將日誌寫入磁碟redo log中;

2、事務提交成功;

假設,有三組redo log檔案,

3、繼續事務提交,修改資料,寫redo log,如果innodb_log_file_size的數值很小,但是產生的redo日誌資訊很大,這樣第一組redo日誌很快就會被寫滿,就要進行日誌檔案切換;

4、如果三組redo log檔案都被寫滿了,就需要進行日誌覆蓋;

5、如果需要覆蓋的redo log日誌檔案記錄的髒頁資訊還沒有寫入到磁碟中,資料庫就會主動加大寫的力度將髒頁資訊刷到磁碟裡;

6、在將redo日誌檔案對應的髒頁刷入磁碟的過程中,事務沒有辦法提交,影響業務。

二、原理分析

1、通過對redo log的修改時間檢視日誌檔案切換時間

通過shell> ls -l /mydata/ib_logfile*,檢視開始修改的時間和最後修改的時間,計算logfile切換時間。

2、如果redo日誌檔案切換時間過短,也就是切換頻繁,就很容易導致寫抖動

1、正常業務繁忙的會是10-20分鐘;

2、如果是比一般的時間短,說明檔案小,切換頻繁。

三、解決寫抖動問題

1、增加redo日誌檔案數量

mysql> show global variables like 'innodb_log_files_in_group';

+---------------------------+-------+

| variable_name | value |

+---------------------------+-------+

| innodb_log_files_in_group | 2 |

+---------------------------+-------+

1 row in set (0.01 sec)

2、擴大日誌檔案容量

mysql> show global variables like 'innodb_log_file_size';

+----------------------+----------+

| variable_name | value |

+----------------------+----------+

| innodb_log_file_size | 50331648 |

+----------------------+----------+

1 row in set (0.01 sec)

3、提高log file的寫效能:將日誌檔案放到寫效能優質的磁碟上

mysql> show global variables like 'innodb_log_group_home_dir';

+---------------------------+-------+

| variable_name | value |

+---------------------------+-------+

| innodb_log_group_home_dir | ./ |

+---------------------------+-------+

1 row in set (0.01 sec)

注意:上面的這三個引數都非動態引數,需要在配置檔案/etc/my.cnf中進行修改儲存,再重新啟動資料庫例項才能生效。

MySQL儲存寫入效能嚴重抖動分析

案例描述 通過iostat發現儲存的寫效能長期維持在10mb左右,而且因為寫效能差已經導致資料庫效能變差 兩個小時以後,iostat發現系統的寫效能已經能夠到100mb以上,資料庫效能也恢復正常。也就是說,在對系統 資料庫監控中,出現了效能波谷,儲存寫入效能嚴重抖動,為什麼?一 原理過程 由上原理圖...

MySQL儲存寫入效能嚴重抖動分析

案例描述 通過iostat發現儲存的寫效能長期維持在10mb左右,而且因為寫效能差已經導致資料庫效能變差 兩個小時以後,iostat發現系統的寫效能已經能夠到100mb以上,資料庫效能也恢復正常。也就是說,在對系統 資料庫監控中,出現了效能波谷,儲存寫入效能嚴重抖動,為什麼?由上原理圖,進行過程解析...

mysql服務抖動 12 mysql效能抖動

12 mysql效能抖動 sql語句為什麼變 慢 了 在介紹wal機制時,innodb在處理更新語句的時候,只做了寫日誌這乙個磁碟操作,就是redo log,在更新記憶體寫完redo log之後,就返回客戶端成功。當記憶體資料頁和磁碟資料頁內容不一致的時候,稱這個記憶體頁為 髒頁 記憶體資料寫入磁碟...