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 对比,别凭感觉判断有没有效果。
还有一种情况是定时任务集中触发,整点做备份或批量导入,瞬时压力把磁盘打满。把任务错峰,比升级磁盘更快见效。