iotop -op 是排查宝塔面板io飙升的唯一可靠起点,-o过滤空闲进程,-p仅显示真实读写磁盘的进程;需结合lsof、iostat、dmesg等进一步定位日志刷盘、脏页堆积或硬件瓶颈。

宝塔面板IO飙升时,iotop -oP 是唯一靠谱的起点
别信面板上那条跳动的红色曲线——它只画趋势,不告诉你谁在写。真凶必须用 iotop -oP 实时抓。加 -o 是过滤掉空闲进程(比如 php-fpm 里没干活的子进程),加 -P 是只显示当前正在读写磁盘的进程,否则满屏都是干扰项。
常见误判点:
- 看到
rsync或cp别急着 kill,先ps -fp [PID]看完整命令路径,可能是你手动触发的合法备份 -
mysqld写高不等于有问题,得结合SHOW ENGINE INNODB STATUS\G看 checkpoint 延迟和脏页堆积 -
bt_backup进程如果 DISK WRITE 持续 >5MB/s,大概率是未限速的自动备份在刷盘
日志文件没轮转,lsof -p [PID] 会暴露上百个写同一文件的进程
锁定高 IO 进程后,立刻执行 lsof -p [PID],重点扫三类路径:/www/wwwlogs/、/www/server/panel/logs/、/tmp/。如果看到几十上百行都指向同一个 error.log,且全是 REG 类型 + W 标志,说明日志配置失效或没开缓冲。
典型坏模式:
-
error.log单文件超 2GB,lsof输出里反复出现该路径 - nginx 或 php-fpm 子进程同时 write 同一个日志文件,没有
buffered_logs on或log_buffer配置 - 别直接
rm -f正在被写的日志,用echo "" > /www/wwwlogs/xxx.log更安全
iostat -x 1 和 iostat -d -x -k 2 的区别不是精度,是抗抖动能力
面板报警时跑 iostat -x 1 容易被单次采样抖动带偏,尤其在云环境——某次瞬时写入可能拉高 await 到 2000ms,但实际只是小文件随机写,不是吞吐瓶颈。这时候改用 iostat -d -x -k 2,每 2 秒采一次、输出更稳,%util 和 await 趋势更可信。
关键判断逻辑:
-
%util ≥ 95%且await > 100ms持续 30 秒以上 → 真 IO 饱和 -
%util才 60% 但await飙到 1500ms → 小文件随机写或队列深度问题(SSD 常见) - 别只盯
/dev/vda1,用lsblk确认/www/wwwlogs是否挂载在独立磁盘(如/dev/vdb)
别漏掉内核级干预信号:dmesg | grep -i "blocked for"
当 IO 堵塞严重到一定程度,Linux 内核会主动 kill 掉卡死进程保命,这事不会记在宝塔日志里。执行 dmesg | grep -i "blocked for",如果返回类似 task mysqld blocked for more than 120 seconds,说明已恶化到内核干预级别,此时再调优配置意义不大,得先查硬盘健康或架构瓶颈。
顺手补查两件事:
-
smartctl -a /dev/sdX看Reallocated_Sector_Ct和SMART overall-health -
df -h看磁盘空间是否 ≥95%,特别是/tmp和/www/wwwlogs所在分区
最常被忽略的是:云服务器上,/dev/vdb 这类数据盘可能被其他租户共享存储带宽,iostat 看似正常,await 却居高不下——这时得联系云厂商确认底层存储 QoS 配置。











