MySQL儲存寫入效能嚴重抖動分析
案例描述:
通過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:http://www.cnblogs.com/geaozhang/案例描述:
通過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中進行修改儲存,再重新啟動資料庫例項才能生效。