top 里 CPU 空闲很多,负载却一直不低,wa 那一列常年超过 20。CPU 在等磁盘,不是算力不够,加核没有用。

先确认是不是磁盘

iostat -x 1 5

重点看 %util 和 await:%util 长期贴近 100 说明磁盘队列已经打满,await 明显偏高说明每次请求都在排队。小规格云盘的 IOPS 有上限,业务量一上来就会撞到。

找出具体进程

iotop -oP
pidstat -d 1 5

按写入量排序,通常能抓到写日志的进程或者做全表扫描的数据库。看到的如果是 mysqld,再去看慢查询日志,多半缺索引。

常见三类原因

  • 日志级别过低,每秒刷大量日志到磁盘
  • 数据库缺索引,查询退化成全表扫描
  • 内存不足频繁使用 swap,读写被放大

临时缓解可以把日志改到内存盘或降低级别,根本解决还是补索引、加内存、换更高 IOPS 的盘。调优前后都跑一次 iostat 对比,别凭感觉判断有没有效果。

还有一种情况是定时任务集中触发,整点做备份或批量导入,瞬时压力把磁盘打满。把任务错峰,比升级磁盘更快见效。

作者 9823189