3.10.3 常用性能与诊断工具

3.10.3 常用性能与诊断工具#

本节聚焦“快速判断—定位进程—深入块层—验证硬件”流程,覆盖安装、示例、排错与练习。

原理草图(诊断层次):

文章图片

1) 安装与准备#

常用工具包(Debian/Ubuntu 与 RHEL/CentOS):

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y sysstat iotop dstat blktrace fio hdparm smartmontools lsof

# RHEL/CentOS
sudo yum install -y sysstat iotop dstat blktrace fio hdparm smartmontools lsof

启用 sysstat 历史采样(sar 依赖):

# Debian/Ubuntu
sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl enable --now sysstat

# RHEL/CentOS
sudo systemctl enable --now sysstat

2) 关键工具与示例(含命令解释)#

iostat:设备吞吐与队列

iostat -x 1 5
# -x: 扩展指标,1 秒间隔采 5 次
# 关注:%util(接近100饱和)、await(平均等待)、svctm(服务时间)、avgqu-sz(队列长度)

vmstat:系统级 IO/CPU 压力

vmstat 1 5
# 关注:bi/bo(块IO)、wa(IO等待)、r(就绪队列)

sar:历史采样与基线

sar -d 1 3        # 磁盘
sar -b 1 3        # IO 传输
sar -u 1 3        # CPU
# 结合 /var/log/sysstat/saXX 进行历史回溯

dstat:多维实时

dstat -tcdnm --top-io --top-bio
# -t 时间戳 -c CPU -d 磁盘 -n 网络 -m 内存

pidstat:进程级定位

pidstat -d -r -u 1 5
# -d IO -r 内存 -u CPU

iotop:实时高 IO 进程

sudo iotop -o -a
# -o 仅显示有IO的进程,-a 累计

blktrace + blkparse:块层追踪

sudo blktrace -d /dev/sdb -o - | blkparse -i -
# 观察 Q(入队) / D(出队) / C(完成) 的时延

fio:可重复的 IO 压测

cat >/tmp/fio-randread.fio <<'EOF'
[global]
ioengine=libaio
direct=1
runtime=30
time_based=1
group_reporting=1
iodepth=16
bs=4k
numjobs=4
filename=/data/fio.test

[randread]
rw=randread
EOF

fio /tmp/fio-randread.fio
# 预期输出包含 IOPS/latency,便于对比基线

hdparm:快速顺序读

sudo hdparm -Tt /dev/sda
# -T 缓存读,-t 设备读;仅做粗略对比

smartctl:硬盘健康

sudo smartctl -a /dev/sda
# 关注 Reallocated_Sector_Ct、Current_Pending_Sector 等

fsck:一致性检查(只读/停机窗口)

sudo umount /dev/sdb1
sudo fsck -f /dev/sdb1
# -f 强制检查;务必确保卸载或只读挂载

lsof:占用与卸载失败排查

sudo lsof +D /data | head
# +D 递归目录,定位占用文件的进程

df/du:容量与增长点

df -hT
du -sh /data/* | sort -h | tail

perf/top:系统调用热点

sudo perf top
# 观察是否为 ext4、xfs、sys_read 等热点

3) 典型排错路径示例(从慢到定位)#

场景:应用反馈写入慢。

# 1. 先判断是否磁盘饱和
iostat -x 1 3

# 2. 判断是否系统级 IO 压力
vmstat 1 3

# 3. 定位高IO进程
iotop -o -a

# 4. 进程级细看
pidstat -d 1 3

# 5. 若仍不明,深入块层
blktrace -d /dev/sdb -o - | blkparse -i - | head

预期:若 %util≈100 且 avgqu-sz 持续上升,说明设备队列堆积;若 iotop 显示单进程大量写入,则优先优化该进程或其写入模式。

4) 常见问题与处理#

  • iostat %util 不高但 await 很大:可能是虚拟化/存储后端延迟;检查底层阵列或云盘延迟。
  • fsck 报错无法修复:优先从备份恢复;必要时只读挂载抢救数据。
  • smartctl 出现 Pending Sector:尽快备份并更换盘,避免扩散。
  • iotop 无输出但应用慢:可能是网络存储/锁等待,配合 sar -n、perf top 进一步判断。

5) 练习#

  1. 在 /data 创建 2GB 测试文件,使用 fio 做随机读写,并记录 IOPS 与延迟。
  2. 人为启动一个持续写入脚本,使用 iotop + pidstat 找出写入进程。
  3. 对比不同 iodepth(1/16/64)下的 fio 结果,解释队列深度对延迟的影响。

练习脚本示例(持续写入):

cat >/tmp/write.sh <<'EOF'
#!/bin/bash
while true; do
  dd if=/dev/zero of=/data/bigfile bs=1M count=64 oflag=direct status=none
done
EOF
chmod +x /tmp/write.sh
/tmp/write.sh &
# 预期:iotop 能看到该进程高写入