磁盘IO延迟升高时,核心告警指标应聚焦在读延迟、写延迟、IOPS、队列长度和磁盘使用率这五类关键数据上,其中读延迟和写延迟是判断问题最直接的信号。
延迟升高不会凭空出现,它背后要么是磁盘硬件在老化,要么是业务流量在暴涨,要么是系统配置出了问题,如果不提前设置告警,等到业务侧反馈“卡死了”“超时了”,那时候往往已经影响了线上服务,告警指标选得对不对,决定了你是提前十分钟发现隐患,还是事后被用户投诉。
磁盘IO延迟升高要设哪类告警指标:先分清指标的主次关系
很多运维新手上来就盯着IOPS看,觉得IOPS高就是磁盘忙,这个逻辑只对了一半,IOPS高可能是正常业务高峰,也可能意味着磁盘在反复重试坏道,两者差别很大,行业共识认为,衡量磁盘IO健康度,延迟信号永远排在IOPS前面。
延迟类指标才是第一优先级
延迟是磁盘响应的直接体现,也是最直观的告警来源,在这类指标里,你需要拆开看两个方面:
- 读延迟(read latency):应用程序发起读请求到数据返回的平均耗时,对于数据库这类读密集型的业务,读延迟一旦超过20毫秒,用户基本就能感觉到查询变慢。如果读延迟持续超过50毫秒,就需要立即介入。
- 写延迟(write latency):写入请求从发起到落盘确认的耗时,写延迟升高往往意味着磁盘缓存不足或者RAID组在重建,情况比读延迟更危急。写延迟超过30毫秒就应该触发警告。
在监控系统里(比如Zabbix、Prometheus),建议把延迟告警拆成两个等级:一个是平均值告警,用于发现整体性能退化;一个是峰值告警,用于捕捉突刺型抖动,峰值告警的阈值可以放宽一些,但一旦出现,往往说明磁盘在重试或者仲裁切换。
吞吐量指标负责兜底
延迟负责“快不快”,吞吐量负责“多不多”,很多场景下,延迟还没有明显飙升,吞吐量先一步断崖式下跌,这才是更早期的信号。
- IOPS(每秒读写次数):IOPS断崖式下跌比IOPS飙升更需要关注,下跌通常意味着磁盘进入了降级模式,比如RAID组里掉了一块盘,或者云盘触发了限流。
- 吞吐带宽(MB/s):顺序读写场景主要看带宽,如果业务明明在大量拷贝文件,带宽却上不去,说明磁盘控制器或者总线成了新的瓶颈。
磁盘IO延迟告警阈值怎么配:分场景定标准
阈值不是拍脑袋定的,不同业务的容忍度完全不同,以下是一些经过实践验证的参考基准,你可以直接拿来当起点,再根据实际环境微调。
普通Web服务器的容错空间
这类场景以随机小IO为主,业务对延迟有一定容忍度,参考配置如下:
| 指标名称 | 警告阈值 | 严重阈值 | 检测周期 |
|---|---|---|---|
| 读延迟 | >20ms | >50ms | 1分钟 |
| 写延迟 | >30ms | >80ms | 1分钟 |
| IOPS波动 | 较基线下跌40% | 较基线下跌70% | 5分钟 |
| 磁盘使用率 | >85% | >95% | 1分钟 |
数据库服务器的严格标准
数据库对IO延迟极其敏感,尤其是事务日志写入和索引页读取。MySQL或PostgreSQL所在的主机,写延迟超过10ms就已经不值得庆祝了。
针对数据库磁盘IO延迟高的场景,建议开启秒级监控,把检测周期从1分钟缩短到10秒,阈值方面:
- 读延迟:警告阈值10ms,严重阈值30ms
- 写延迟:警告阈值10ms,严重阈值50ms
- 队列长度:持续大于CPU核数的2倍,则触发告警
云服务器磁盘IO延迟高时怎么判断瓶颈在哪
如果你用的是云厂商的ESSD或者SSD云盘,延迟突然升高,先别急着骂磁盘,云盘是多租户共享的物理资源,邻居效应是客观存在的,这时候你需要做两件事:
- 打开云监控控制台,查看宿主机层面的“底层物理磁盘IO”指标,对比一下实例层和物理层的延迟差值。
- 差值如果持续大于5ms,大概率是云盘服务端限流了,这时候提工单给云厂商,附上监控截图,比你自己在机器上调试管用得多。
磁盘IO延迟高怎么排查,本地先跑一遍iostat -x 1,观察%util和await两个字段。%util接近100%只能说明设备处于忙碌状态,但如果await同时也飙升到几十毫秒,才能确认是设备性能瓶颈;如果%util不高但await很高,那问题可能出在软件层比如文件系统锁竞争或者内核IO调度器配置不理想。
队列长度和饱和度:容易被漏掉的隐藏告警项
很多监控面板默认不展示队列长度,但这恰恰是判断磁盘是否即将“崩溃”的关键指标,你可以把磁盘比作一个收银台,IO请求就是排队的顾客,顾客排队排得越长,每个人等待的时间越久,但收银员(磁盘)可能并没有闲着。
队列长度读多少才算异常
用iostat -x命令查看avgqu-sz
字段。当平均队列长度持续大于2时,说明IO请求已经在排队等待了;如果队列长度超过了磁盘的NCQ队列深度(多数SATA盘是32,NVMe盘是64),新到达的IO就会直接卡在驱动层,这时候应用侧的延迟会瞬间跳变。
饱和度计算
饱和度(saturation)不是直接读取的指标,需要通过util和队列长度综合推算,如果util长期在80%以上,且排队长度持续增长,此时磁盘已经处于高饱和状态。在这个状态下,任何突发流量都会造成延迟指数级上升,而不是线性上升。
针对这一项,可以设置一个复合告警规则:util > 80% 且 avgqu-sz > 4,两个条件同时满足时触发通知,这比单一指标告警更准确,误报率低得多。
磁盘IO延迟告警落地的三种监控方式
告警指标配置好之后,要考虑怎么落地,这里提供三种主流方案,覆盖不同规模的业务。
系统自带工具做快速验证
不需要安装任何额外的软件,靠Linux系统自带的iostat和pidstat就能解决突发问题:
# 每2秒采样一次,连续采集5次 iostat -x 2 5 # 定位是哪个进程在打IO pidstat -d 2 5
这种方法适合临时排查,磁盘IO延迟高怎么解决的前置条件一定是先定位到具体是哪个进程在消耗IO,先看pidstat -d输出中的KB_rd/s和KB_wr/s,找到疑似的进程号,再用iotop -p盯一下特定进程,确认是否业务异常。
Prometheus + Node Exporter做持久监控
生产环境建议用Prometheus方案,采集node_disk_read_time_seconds_total和node_disk_write_time_seconds_total这两个计数器,通过rate()函数计算延迟指标。
告警规则可以这样写:
- alert: DiskReadLatencyHigh
expr: |
rate(node_disk_read_time_seconds_total[1m]) /
rate(node_disk_reads_completed_total[1m]) > 0.02
for: 5m
labels:
severity: warning
这段规则的含义是:读延迟超过20ms,持续5分钟没有回落,触发告警。
云厂商监控平台一键配置
如果你用的是简米云、酷番云或者华为云的云盘,控制台自带的“云监控”已经内置了磁盘IO延迟的告警模板,重点勾选以下指标即可:
- 数据盘读写延迟
- 数据盘IOPS
- 数据盘带宽吞吐
- 磁盘使用率
云监控的告警通知渠道建议同时绑定电话、短信、钉钉/企微机器人三类,延迟类故障往往在几分钟内就会从量变到质变,只发邮件基本来不及。
告警设置完成后需要做的事
告警不是终点,而是发现问题的起点,收到告警后,建议按照“由近及远”的顺序排查:
- 先看系统负载:
uptime看load average是不是已经远超CPU核数,如果是,先联系业务方确认是否有定时任务在跑。 - 再确认磁盘类型:机械盘、SSD、NVMe盘的延迟基准完全不同,SSD平均延迟在0.1-0.5ms,延迟到了10ms以上说明有大问题;机械盘平均延迟在5-10ms,延迟到20ms还在容忍范围内。
- 检查文件系统状态:
dmesg | tail看有没有IO错误、xfs_repair -n或fsck -n做只读检查。文件系统层的问题往往表现为延迟忽高忽低,和磁盘本身的稳定高延迟有明显区别。
对于已经发生过多次延迟告警的磁盘,建议直接做好数据迁移和更换计划,在RAID组里,单块盘出现延迟异常往往是坏道前的预兆,与其等到彻底掉线后重建,不如在业务低峰期主动更换。
磁盘IO延迟告警常见问题
磁盘IO延迟高,IOPS却很低,问题出在哪
这种情况说明单个IO请求本身耗时太长,不是并发量大导致的排队,常见原因有三个:磁盘出现物理坏道正在重试、RAID组降级后写惩罚放大、文件系统碎片率过高,建议先用smartctl -a /dev/sda查看磁盘健康状态,重点关注Reallocated_Sector_Ct和Current_Pending_Sector两个属性值,如果这两个数值都不是0,磁盘基本可以准备更换了。
设置IO延迟告警时,平均延迟和最大延迟哪个更值得关注
平均延迟和最大延迟各有用途,平均延迟反映整体性能表现,适合作为持续性能退化的依据;最大延迟反映抖动情况,数据库类业务对抖动极度敏感。最合理的做法是两者同时设置,平均延迟用于日常监控,最大延迟用于告警触发,一旦最大延迟超过平均延迟的5倍以上,说明磁盘内部在做垃圾回收或者坏块重映射,这是磁盘健康度恶化的重要信号。
磁盘IO延迟高会对数据库产生什么影响
磁盘IO延迟变高最直接的后果就是数据库的慢查询数量激增,MySQL的innodb_io_capacity参数如果配置得过高,磁盘跟不上写入速度,会导致checkpoint线程堆积,最终触发性能雪崩,PostgreSQL的wal写入延迟如果持续偏高,主从复制的延迟也会被同步放大,具体的表现就是备库的replay_lag指标持续上涨,为了避免这种情况,建议把磁盘延迟告警和数据库慢查询日志告警做联动配置。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/627561.html





