1. 程式人生 > >MySQL儲存寫入效能嚴重抖動分析

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中進行修改儲存,再重新啟動資料庫例項才能生效。