q66262 发表于 2019-1-21 09:35:57

Zabbix proxy服务器磁盘IO持续报警

  一 问题描述
  一台Zabbix proxy收到持续IO报警信息。
xxxxx: High disk io on sdb for 5 minutes Trigger status: PROBLEM
Bandwidth utilization for sdb (hk-zabbix-prod-proxy:disk.status): 97.1 %  关于使用Zabbix监控磁盘IO可以参考
  http://john88wang.blog.运维网.com/2165294/1545834
  

  

  

  二 解决办法
  登录这台服务器上先找出是什么程序在占用磁盘IO
  使用 vmstat -S M 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
rb   swpd   free   buffcache   si   so    bi    bo   in   cs us sy id wa st
51      0    489    37665049    0    0   01956 16554 1339231 9430
02      0    480    37665057    0    0   04263 18374 1253721 9430
11      0    489    37665047    0    0   02173 16294 1349921 9520
11      0    490    37665046    0    0   04225 20427 1526251 9230
60      0    492    37665046    0    0   0   988 15024 1234523 9320
01      0    491    37665045    0    0   02068 14824 1261931 9420
61      0    483    37665047    0    0   03404 17717 1231611 9530
01      0    493    37665044    0    0   02084 13136 1343011 9530
11      0    480    37665056    0    0   05292 14833 1319431 9230
31      0    476    37665062    0    0   01484 11698 1106321 9530
10      0    493    37665045    0    0   0 14237 11399 1124511 9620
10      0    490    37665046    0    0   06484 12396 1258221 9520
10      0    469    37665069    0    0   01564 13884 1304451 9220
01      0    492    37665046    0    0   02589 12915 1292121 9520  

  通过vmstat看出cpu的wa大概是%3,这里还看不出磁盘IO有多大的问题
  继续使用iostat -xmt 3查看磁盘IO
05/18/2016 11:05:15 PM
avg-cpu:%user   %nice %system %iowait%steal   %idle
         1.51    0.00    1.13    2.38    0.00   94.99
Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   awaitsvctm%util
sda               0.00   0.00    0.00    0.00   0.00   0.00   0.00   0.00    0.00   0.00   0.00
sdb               0.00   267.00    0.00161.33   0.00   1.67    21.21   0.88    5.41   5.0381.20
05/18/2016 11:05:18 PM
avg-cpu:%user   %nice %system %iowait%steal   %idle
         2.10    0.00    1.02    2.54    0.00   94.35
Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   awaitsvctm%util
sda               0.00   3.67    0.00    2.00   0.00   0.02    22.67   0.02    9.67   4.00   0.80
sdb               0.00   534.33    0.00181.67   0.00   2.79    31.50   0.99    5.45   4.9690.17
05/18/2016 11:05:21 PM
avg-cpu:%user   %nice %system %iowait%steal   %idle
         2.25    0.00    1.65    2.93    0.00   93.16
Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   awaitsvctm%util
sda               0.00   1.67    0.00    1.00   0.00   0.01    21.33   0.01   13.33   6.00   0.60
sdb               0.00   241.67    0.00186.00   0.00   1.66    18.31   1.21    6.50   4.9992.90
05/18/2016 11:05:24 PM
avg-cpu:%user   %nice %system %iowait%steal   %idle
         3.29    0.00    3.06    2.86    0.00   90.79
Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   awaitsvctm%util
sda               0.00   2.33    0.00    1.00   0.00   0.01    26.67   0.01    5.33   3.33   0.33
sdb               0.001593.33    0.00186.67   0.00   6.95    76.20   2.25   12.07   4.9191.63  

  可以看出连续多次输出中,磁盘sdb的利用率都是85%以上
  

  然后使用iotop查看哪些进程在使用io
http://s4.运维网.com/wyfs02/M01/80/4C/wKiom1c9ZnCQ89LIAASUOOJqggg696.png
  可以看出主要是MySQL在使用磁盘IO,但是怎么会有个奇怪的进程占用那么高的磁盘IO
  

  这里涉及到两个知识点

[*]  文件系统EXT4的journaling进程jdb2
[*]  MySQL的磁盘写入调优

  

  最快的解决方式就是关闭这个磁盘的journaling日志

  tune2fs -O "^has_journal" /dev/sdb1
  但是不建议这样使用,因为关闭了EXT4的日志记录功能就存在丢失数据的风险。MySQL的InnoDB表即使关闭了EXT4的日志记录功能也能够不丢失数据,只要开启了innodb_doublewrite 参数,默认就是开启的。
  innodb_doublewrite 参数开启后,InnoDB会存储所有的数据两次,先存储数据到doublewrite buffer,然后再存储数据到数据文件中。

mysql> show variables like '%double%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+
1 row in set (0.00 sec)  

  sync_binlog
  sync_binlog参数也会影响到MySQL数据库服务器的磁盘IO.如果这个变量的值大于0,MySQL server synchronizes its binary log to disk(using fdatasync()) after sync_binlog commit groups are written to the binary log.
  

  innodb_flush_log_at_trx_commit   
  这个参数默认值是1. 简单点说这个参数就是平衡InnoDB事务日志写入磁盘的频率和MySQL性能的一个参数。这个参数有3个取值
  0   每次事务提交操作时不从log buffer中刷新日志到磁盘,InnoDB大约每秒从log buffer中刷新日志到磁盘,也就是说,如果发生MySQL崩溃,那么大约会丢失1秒的数据。
  1   每次事务提交操作时都从log buffer中刷新日志到磁盘,这个是最安全的方式
  

  2InnoDB的log buffer中的数据在每次事务提交操作之后再刷新到磁盘,普通日志大约每秒刷新到磁盘。如果有MySQL崩溃或者断电等情况大约会丢失1秒的数据
  

  

  对于Zabbix应用,丢失1秒数据的风险性不大。所以设置

  

  innodb_flush_log_at_trx_commit = 0
  

  再观察磁盘IO就恢复正常了
  

  

  

  参考文档:
  http://serverfault.com/questions/363355/io-wait-causing-so-much-slowdown-ext4-jdb2-at-99-io-during-mysql-commit
  https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_doublewrite
  https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_sync_binlog
  https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html
  

  




页: [1]
查看完整版本: Zabbix proxy服务器磁盘IO持续报警