在 Linux 上查看磁盘性能的常用方法与命令

下面给你一套从“快速观察 → 过程定位 → 基准测试 → 健康诊断”的完整思路与常用命令,基本覆盖日常排查与评估磁盘性能的需求。

你需要关注的关键指标

  • 吞吐量:MB/s(如 rkB/s, wkB/s
  • IOPS:每秒 I/O 次数(如 r/s, w/s
  • 时延:平均等待/完成时间(如 r_await, w_await),分位延迟在 fio/bpf 工具中更清晰
  • 队列深度:平均队列长度(如 aqu-sz
  • 利用率:设备繁忙比例(如 %util

通常判断:

  • %util 长期接近 100%:设备已饱和
  • r_await/w_await 明显升高:延迟问题
  • aqu-sz 大且持续:排队严重(队列过深/请求处理慢)
  • IOPS 高但吞吐低:小块随机 I/O 为主
  • 吞吐高但 IOPS 低:大块顺序 I/O 为主

一、先识别磁盘与文件系统

# 设备与挂载点/类型
lsblk -o NAME,TYPE,SIZE,MODEL,ROTA,MOUNTPOINT,FSTYPE

# 检查是否为旋转盘(0=SSD, 1=HDD)
cat /sys/block/sdX/queue/rotational

# 查看 I/O 调度器(SSD 常用 none/mq-deadline)
cat /sys/block/sdX/queue/scheduler

二、实时监控(系统整体视角)

1) iostat(强烈推荐)

# 扩展模式 + 每秒刷新
iostat -xz 1

重点看:r/s w/s rkB/s wkB/s r_await w_await aqu-sz %util
如果没有安装:sudo apt/yum install sysstat

2) sar(历史/实时均可)

# 实时 1 秒采样,5 次
sar -d 1 5

# 历史日志(需要 sysstat 已启用统计)
sar -d -f /var/log/sa/saXX

3) dstat(综合看 I/O)

dstat -dny --top-io 1

4) vmstat(看 iowait 和块 I/O)

vmstat 1
# 关注 wa(iowait)、bi/bo(块读写速率)

三、按进程定位“谁在刷盘/卡顿”

# 进程级 I/O 速率与延迟
pidstat -d 1

# 实时按进程显示 I/O(需要CAP)
sudo iotop -oPa

# 定位某目录下哪些文件被频繁访问
sudo lsof +D /path/to/dir 2>/dev/null | head

四、健康状态与硬件层面

# S.M.A.R.T 健康检查(SATA/SAS)
sudo smartctl -a /dev/sdX

# NVMe 健康日志
sudo nvme list
sudo nvme smart-log /dev/nvme0

注意看:介质错误、温度、可用寿命、重映射计数等。
同时检查内核日志是否有 I/O 错误:

dmesg | egrep -i 'error|nvme|blk|I/O'

五、快速“只读”测试与“合规”基准压测

1) 快速只读(不写盘,安全)

# 顺序读测试(包括缓存与直接从盘)
sudo hdparm -Tt /dev/sdX
  • -T 测内存缓存,-t 测实际盘顺序读。

2) 标准压测:fio(推荐)

  • 注意:写测试会对磁盘和文件系统产生压力与数据改变。请在测试盘或测试文件上执行。
  • 使用 --filename=/mount/testfile 并保证足够空间;--direct=1 绕过页缓存,更贴近设备能力。

示例(4k 随机读):

fio --name=4k-randread --filename=/data/fio.test --size=8G \
    --bs=4k --rw=randread --iodepth=32 --numjobs=4 \
    --ioengine=libaio --direct=1 --time_based --runtime=60 \
    --group_reporting

示例(1M 顺序写,谨慎):

fio --name=1m-write --filename=/data/fio.test --size=8G \
    --bs=1M --rw=write --iodepth=8 --numjobs=1 \
    --ioengine=libaio --direct=1 --time_based --runtime=60 \
    --group_reporting

关键信息解读:

  • IOPSBW=(带宽)、clat(完成时延,留意均值与 P99/P99.9)
  • 将不同 bs(块大小)和 iodepth(队列深度)组合测试,了解吞吐与时延的权衡

提示:

  • 文件系统缓存影响很大;做“设备能力”评估用 --direct=1
  • 生产环境测试要避开业务高峰,或在独立磁盘/LUN 上进行

六、更深入的延迟与请求分布(可选)

若环境具备 BCC/eBPF 工具:

# 观测块 I/O 延迟分布
sudo biolatency 1

# 显示每次块 I/O(设备、进程、时延)
sudo biosnoop

没有 bcc 时可用 blktrace + btt,但较复杂。


七、文件系统与层级因素

  • 文件系统挂载参数(如 noatime/relatime, barrier, discard)会影响性能:
mount | grep ' /data '
  • XFS/Ext4 参数查看:
xfs_info /dev/mapper/vg0-lv_data
sudo tune2fs -l /dev/sdXn
  • LVM/RAID/虚拟化层可能叠加开销:
lsblk -o NAME,TYPE,SIZE,MOUNTPOINT
cat /proc/mdstat     # MD RAID
lvs -o lv_name,lv_size,data_percent,lv_attr

八、常见判断与排障建议

  • %util≈100%r_await/w_await 高:设备/阵列已满负载 → 考虑提升并发策略、优化访问模式、升级存储
  • aqu-sz 持续高:应用或文件系统发起的请求超出设备能力 → 调整 iodepth/应用线程,或 QoS 限制
  • IOPS 不上去但 CPU 空闲:可能被控制器/网络存储限制(如云盘的 Burst 限额)
  • 读性能波动:检查硬件错误、温度限速、掉速(smartctl, dmesg
  • 随机小 I/O 很慢:合并 I/O、批量、异步、使用更适合的文件系统参数,或引入本地 SSD 缓存

九、快速命令清单(可复制)

# 识别设备
lsblk -o NAME,TYPE,SIZE,MODEL,ROTA,MOUNTPOINT,FSTYPE

# 实时总览
iostat -xz 1

# 历史/实时
sar -d 1 5

# 进程 I/O
pidstat -d 1
sudo iotop -oPa

# 健康检查
sudo smartctl -a /dev/sdX
sudo nvme smart-log /dev/nvme0
dmesg | egrep -i 'error|nvme|blk|I/O'

# 快速只读测试
sudo hdparm -Tt /dev/sdX

# fio 示例(随机读)
fio --name=4k-randread --filename=/data/fio.test --size=8G \
    --bs=4k --rw=randread --iodepth=32 --numjobs=4 \
    --ioengine=libaio --direct=1 --time_based --runtime=60 \
    --group_reporting

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐