4.8.6 磁盘监控工具与实战分析
本节聚焦磁盘监控工具的选择与组合使用,结合典型场景完成定位与优化闭环。目标是建立“指标—现象—工具—结论—行动”的分析路径,避免只看单一命令而误判瓶颈来源。
一、监控工具体系与适用场景#
常用工具与场景对应如下,并给出安装与快速验证命令:
- iostat:设备级吞吐、IOPS、await、%util,判断设备是否拥塞。
- pidstat -d / iotop:定位高I/O进程与线程。
- vmstat:系统级IO等待、脏页回写、上下文切换。
- dstat / sar:长期趋势、多维指标并看。
- blktrace / bpftrace:块层排队与调度分析。
- smartctl / nvme-cli:介质健康度与寿命指标。
安装示例(Debian/Ubuntu):
sudo apt update
sudo apt install -y sysstat iotop dstat blktrace smartmontools nvme-cli
# sysstat包含 iostat、pidstat、sar
安装示例(RHEL/CentOS):
sudo yum install -y sysstat iotop dstat blktrace smartmontools nvme-cli
sudo systemctl enable --now sysstat
快速验证:
iostat -x 1 3
pidstat -d 1 3
vmstat 1 3
二、原理草图:指标到结论的分析链路#
三、关键指标解读与判断逻辑(含命令解释)#
- iostat 关键字段说明与判断
iostat -x 1 5
# rrqm/s, wrqm/s: 合并请求比例
# r/s, w/s: IOPS
# rkB/s, wkB/s: 吞吐
# await: 平均等待(排队+服务)ms
# svctm: 近似服务时间(旧内核可能不准)
# %util: 设备忙碌度
判断逻辑:
- %util接近100% 且 await升高:设备拥塞或排队过长。
- await高但%util不高:可能是请求抖动或调度不当。
- r/s、w/s很高但rkB/s、wkB/s不高:小IO过多。
- vmstat 观察系统IO等待
vmstat 1 5
# wa: iowait百分比
# bi/bo: 读写块数
# si/so: swap in/out
判断逻辑:
- wa持续升高且bi/bo异常:IO成为系统瓶颈。
- pidstat / iotop 进程级定位
pidstat -d 1 5
# 输出每个进程读写速率(kB/s)、I/O延迟
sudo iotop -o -Pa
# -o 仅显示有I/O进程,-P 进程级,-a 累积模式
四、工具实战示例:从告警到定位#
场景:业务告警“响应慢”,怀疑磁盘问题。
1) 系统级确认
vmstat 1 3
# 若wa高,进入设备级排查
2) 设备级定位
iostat -x 1 5
# 找到await高、%util高的设备,如 /dev/nvme0n1
3) 进程级定位
pidstat -d 1 5
# 找到高写入进程,如 mysqld
4) 深入分析(可选)
sudo blktrace -d /dev/nvme0n1 -o - | blkparse -i -
# 关注Q(排队)到D(派发)与C(完成)之间的延迟
5) 形成结论与行动
- 结论:大量小写IO导致队列堆积。
- 行动:应用侧批量写、合并日志、数据库调整写入策略。
五、常见排错清单(Troubleshooting)#
1) iostat显示%util不高但await高
- 可能是IO调度不匹配或设备内部GC
- 检查调度器与队列深度:
cat /sys/block/nvme0n1/queue/scheduler
cat /sys/block/nvme0n1/queue/nr_requests
2) iowait高但找不到明显高IO进程
- 可能是内核回写或日志风暴
- 观察脏页与回写:
cat /proc/meminfo | egrep "Dirty|Writeback"
3) RAID阵列延迟波动大
- 检查重建或写缓存策略
cat /proc/mdstat
六、典型案例与处理思路(含命令)#
1) 数据库写入突增
iostat -x 1 3
pidstat -d 1 3
处理建议:
- 慢日志分析、索引优化
- 调整innodb刷盘策略(示例):
# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_flush_log_at_trx_commit=2
innodb_io_capacity=2000
2) 日志写入风暴
lsof | grep app.log | head
iotop -o -Pa
处理建议:
- 日志合并、异步写、单独日志盘。
3) RAID重建导致抖动
cat /proc/mdstat
iostat -x 1 3
处理建议:
- 调整重建速度、避开高峰期。
七、练习与检验#
1) 练习1:模拟小IO风暴并定位
# 创建大量小文件写入
mkdir -p /tmp/io_test && cd /tmp/io_test
for i in {1..5000}; do dd if=/dev/zero of=file_$i bs=4k count=1 oflag=dsync 2>/dev/null; done
# 观察指标变化
iostat -x 1 3
pidstat -d 1 3
2) 练习2:分析队列深度对await影响
# 读取当前队列深度
cat /sys/block/sda/queue/nr_requests
# 临时调整(仅实验)
echo 128 | sudo tee /sys/block/sda/queue/nr_requests
iostat -x 1 3
3) 练习3:健康度检查
sudo smartctl -a /dev/sda | egrep "Reallocated|Pending|Temperature"
sudo nvme smart-log /dev/nvme0n1
八、监控与告警建议#
- 关键指标:await、%util、avgqu-sz、IOPS、吞吐、iowait、脏页比例。
- 告警阈值:以基线为准,避免固定阈值误报。
- 长期趋势:可用sar/Prometheus采集并建立日/周基线。
本节强调多工具交叉验证与闭环分析,磁盘问题常与应用访问模式、缓存策略、文件系统参数共同作用,务必在定位后再进行针对性调整。