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)
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM