案例描述:
通過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)