mysql資料庫磁碟io高的排查

czxin788發表於2020-04-11

     最近,資料庫會報磁碟IO高的告警,但是cpu不高。

故障 
● 主機名稱: xxxx
● 告警資訊: Disk I/O is overloaded on xxxx 
● 告警時間: 2020.04.10-13:09:06 
● 主機地址: xxxxxx
● 當前狀態: 36.14 %

   資料庫磁碟io高時,執行的sql如下:

2527  | xxxx |  xxxx : 35072  | xxxx | Query |  0  | update | insert ignore into `xxxxannotations` (`trace_  |
2528  |xxxn |  xxxx : 37270  | xxxx | Query |  0  | update | insert ignore into `xxxxannotations` (`trace_id`, `s
2530  | xxxx |  xxxx : 44210  | xxxx | Query |  0  | update | insert into `xxxx_spans` (`trace_id`, `id`, `debug`, `start_ts`, `name
2531  |xxxx |  xxxx : 45910  | xxxx | Query |  0  | query end | insert ignore into `xxxx_annotations` 4' ' , - 1408108278 8031 ) |
2532  | xxx |  xxxx : 58890  | xxxx | Sleep |  0  | | NULL

    也就是資料庫會批次的執行insert ignore into 語句。


mysql> show engine innodb status \G
 
---TRANSACTION  1557551308 , not started flushing log
 
---TRANSACTION  1557551309 , not started flushing log
 
---TRANSACTION  1557551310 , not started flushing log
 
---TRANSACTION  1557551311 , not started flushing log
 
---TRANSACTION  1557551313 , not started flushing log
 
---TRANSACTION  1557551304 , not started flushing log


    可以看到,每個事務都在flushing log中,說明刷redo log比較慢。可能是redo log 比較小。


mysql> show variables like  '%innodb_log_file_size%' ;
+----------------------+----------+
| Variable_name | Value |
+----------------------+----------+
| innodb_log_file_size |  50331648  |
+----------------------+----------+
1  row in set (   sec)

   事實證明,innodb_log_file_size確實比較小,才50M,建議增大至2個4G。

   繼續分析:

mysql> show engine innodb status \G
--------
FILE I/O
--------
Pending flushes (fsync) log:  1 ; buffer pool:  0
1  pending preads,  0  pending pwrites
 
 
LOG
---
Log sequence number  988322448590
Log flushed up to  988322444468
Pages flushed up to  988311239867
Last checkpoint at  988309561881
1  pending log writes,  0  pending chkp writes
23371463  log i/o 's done,   log i/o' s/second

    上述看到log thread 掛起的fsync()運算元據為1,說明log thread刷盤有等待。

    另外,last checkpoint落後於log flushed up to太多,接近於redo log檔案的大小,這時會觸發innodb瘋狂刷redo,從而導致磁碟io高,對效能影響非常糟糕。

    還有,這個資料庫的innodb buffer pool也很小,使用的預設值為128M,也需要調大。

   

   最佳化方法:

        設定innodb_log_file_size=4G,設定innodb_buffer_pool_size=4G。

        經過觀察,資料庫磁碟io高、cpu不高的問題消失。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2685616/,如需轉載,請註明出處,否則將追究法律責任。

相關文章