这些天在一台备份服务器上安装了 Netdata 做监控之后每天都会给我发送很多 10min_cpu_iowait
的邮件告警。
简单的看了一下这个 指标 的说明,指的是 10 分钟间隔内 iowait 的平均等待时间。iowait 指的是当 CPU 空闲的时候至少有一个 I/O 请求的时间占比。
To summarize it in one sentence, ‘iowait’ is the percentage of time the CPU is idle AND there is at least one I/O in progress.
I/O wait (iowait) 是操作系统还有等待的磁盘 I/O 请求时 CPU 空闲时间的百分比 (man sar
)。而在 man top
中 I/O wait 指的是 等待 I/O 完成的时间。
需要注意的是,在等待 I/O 的过程中,系统可以运行其他进程,但是 iowait
单纯指的是 CPU idle 的情况。
一个通常可能的情况这个 10min_cpu_iowait
告警是因为 CPU 请求或接受一些数据,然后设备无法快速地处理这些数据,结果就是 CPU(在下一个时钟周期)空闲,然后就遇到 iowait
。
每一个 CPU 都会处于如下的状态中的一个:
- user
- sys
- idle
- iowait
一些性能检测监控工具,比如 vmstat, iostat, top, sar 等等都可以显示这些信息。sar
命令可以输出每一颗 CPU 核心的状态(-P
选项),而其他命令只能输出一个所有 CPU 的平均值。因为是一个百分比,所以这些状态的总和是 100%。1 2
查看 iowait 的方法
top
在 top 命令第三行,CPU 信息列,wa
表示的就是 IO wait.
vmstat
执行 vmstat 1
每秒打印一次结果,在输出结果的最后面 wa
就表示 IO wait。
sar
sar
命令在 sysstat
包中。
执行 sudo sar -d 1 3
iostat
执行 sudo iostat -xm 1
,结果中的 %iowait
。
iotop
使用 sudo iotop -oPa
来查看活跃进程累计 I/O
ps
使用 ps auxf
,在 STAT
列下,状态是 D
则表示 disk iowait。
other
- strace
- lsof 在确定了进程之后,可以使用
-p [PID]
来确定
告警原因
查看了一下 Netdata 控制面板
然后查看了一下当时服务器处理的进程就发现原来是在用 rsync
备份的时候,因为高频读写磁盘导致 iowait
迅速上升。
然后我做了一个简单的测试,手动执行一下备份命令,每次都会导致 iowait
迅速飙高,大概原因就找到了。
如何解决 Netdata 告警
修改 Netdata 告警阈值
默认情况下 Netdata 设置的 10min_cpu_iowait
是 [20,40]
Warning, [40,50]
Critic。
template: 10min_cpu_iowait
on: system.cpu
class: Utilization
type: System
component: CPU
os: linux
hosts: *
lookup: average -10m unaligned of iowait
units: %
every: 1m
warn: $this > (($status >= $WARNING) ? (20) : (40))
crit: $this > (($status == $CRITICAL) ? (40) : (50))
delay: down 15m multiplier 1.5 max 1h
info: average CPU iowait time over the last 10 minutes
to: sysadmin
因为我使用 docker-compose 安装,所以先进入容器 docker-compose exec netdata /bin/sh
,然后
cd /etc/netdata/
./edit-config health.d/cpu.conf
调整其中的 warn
和 crit
数值。然后保存 : wq
。重启 Netdata 容器。
调整 rsync 传输速率
既然是因为 rsync 备份传输文件导致的,那就看一下传输的速率,在 rsync 命令上加上 --progress
,可以看到普通情况下能在 20MB/s ,那就限制一下速率 --bwlimit=5m
,然后再执行。可以看到 iowait 稳定在告警线一下。
联系 VPS 提供商
如果发现只有简单的读写,并且速度不高(10MB/s)的情况,可以使用 benchmark 脚本来检测磁盘读写速度:
curl -sL yabs.sh | bash -s -- -i -g
正常情况 blocksize 在 512k 以上,读写速度应该在 100MB/s 以上,否则可能 VPS 的磁盘出现问题,可以直接 Open a ticket ,并贴上命令的结果寻问服务提供商。
reference
- https://learn.netdata.cloud/docs/monitor/configure-alarms
- [[2017-07-22-rsync-introduction]]
- https://haydenjames.io/what-is-iowait-and-linux-performance/