服务器磁盘读写速度如何测试
学完这篇,你能独立在一台 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,判断真实瓶颈。 - 每次读测试前清缓存,测试后删文件。
原文链接:https://www.gj0.com/thread-947.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。