服务器磁盘读写速度如何测试

juming
juming 初级会员超兽战士
发布于 2026-10-08 12:21 ·2 浏览 ·0 回复

学完这篇,你能独立在一台 Linux 服务器上测出磁盘的顺序读写速度、随机 IOPS 和延迟,并知道哪些结果是被缓存「骗」出来的假数据。

第一步:确认要测的是哪块盘、什么类型

搞清楚目标设备和文件系统类型,后面所有测试才有意义。执行:

lsblk
df -h
cat /sys/block/sda/queue/rotational

lsblk 输出里能看到设备名(sda、nvme0n1、vdb 等)、容量、挂载点。rotational 返回 0 是 SSD/NVMe,1 是机械硬盘。机械盘顺序读写大概 100–200 MB/s、随机 4K 只有 100–200 IOPS;SATA SSD 顺序 500 MB/s 左右、随机 4K 能到几万 IOPS;NVMe 则再高一个数量级。先知道基准,才不会被离谱的结果迷惑。

注意:不要往 /tmp 写测试文件。很多系统 /tmp 是 tmpfs(内存盘),测出来是内存速度,能跑到几个 GB/s,纯属自欺欺人。测试前用 df -h /tmp 确认,最好直接写到数据盘挂载目录,比如 /data。

第二步:用 dd 做最简单的顺序读写测试

这一步能拿到一个粗略的顺序读写数字,够日常排查用。写测试(4GB 文件):

dd if=/dev/zero of=/data/testfile bs=1M count=4096 oflag=direct conv=fdatasync status=progress

读测试前必须先清缓存,否则数据全在内存里:

sync
echo 3 > /proc/sys/vm/drop_caches
dd if=/data/testfile of=/dev/null bs=1M iflag=direct status=progress

oflag=direct 绕过页缓存直接写盘,conv=fdatasync 保证数据落盘后才返回,这两个参数是防止结果虚高的关键。输出最后一行的 XXX MB/s 就是结果。

注意:bs=1M 适合测吞吐,但别用它测随机性能,dd 只能测顺序。另外测试文件至少要有 1GB,文件太小(比如 100MB)会被控制器缓存吃掉,结果偏高。

第三步:用 fio 测随机 IOPS 和延迟

dd 测不出数据库、虚拟机这类场景关心的随机性能,这一步用 fio 补上。安装:

apt install fio     # Debian/Ubuntu
yum install fio     # CentOS/RHEL

一条标准的 4K 随机读测试:

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

把 --rw=randread 换成 randwrite 就是随机写,换成 read/write 就是顺序读/写,换成 randrw 是混合读写。结果里重点看三行:IOPS=、bw=(带宽)、lat (usec) 里的 avg 和 99.00th(平均延迟和 99 分位延迟)。线上业务更该关心 99 分位,平均值会被大量快请求拉低。

注意:--size 要小于目标盘的剩余空间,--direct=1 必须带上,否则测的是内存。--iodepth 模拟并发队列深度,NVMe 盘可以调到 64 或 128,机械盘调到 1–4 更贴近真实表现。

第四步:看真实负载下的表现

前面都是空载测试,这一步看实际运行时的压力。安装 sysstat 后执行:

iostat -x 1 5

关注每块设备的 %util(接近 100% 说明设备饱和)、await(平均 IO 等待毫秒数,机械盘超过 20ms 就偏慢)、r/s 和 w/s(每秒读写次数)。这一步的意义是:把前面测出的理论值和实际值对比,判断瓶颈到底在磁盘还是在应用。

第五步:清理测试文件

rm -f /data/testfile /data/fio.test

注意:测试文件动辄几个 GB,留在生产盘上可能触发磁盘告警,测完立刻删。清缓存命令 echo 3 > /proc/sys/vm/drop_caches 也会影响正在运行的服务,只建议在测试机或业务低峰期执行。

小结

  • 先确认设备类型(rotational)和挂载点,别在 tmpfs 上测试。
  • dd 加 oflag=direct 看顺序吞吐,加 conv=fdatasync 确保落盘。
  • fio 测随机 IOPS 和延迟,重点看 99 分位延迟,不是平均值。
  • iostat 看生产负载下的 %util 和 await,判断真实瓶颈。
  • 每次读测试前清缓存,测试后删文件。
版权声明:本文来自 GJ站长论坛《服务器磁盘读写速度如何测试》
原文链接:https://www.gj0.com/thread-947.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~