CentOS 测试硬盘读写速度

数据库、日志、缓存这类服务都是典型的 IO 密集场景,磁盘速度直接决定请求延迟。买机器时商家标称的"500MB/s"和实际跑出来的数往往有差距,所以上生产之前用 dd 快速验证一下很值。dev 为挂载的硬盘目录(例如 /www/data),测试文件会写入该目录。下面三条命令分别覆盖写、读、小文件同步写三种场景。

即使不追求实验室级的精确,dd 的结果也足够回答"这块盘能不能扛住我现在的业务":数据库事务、日志落盘这类负载,瓶颈往往就卡在同步写入速度上。

1. 测试写入速度

dd if=/dev/zero of=/test.bin bs=1M count=256 conv=fsync
  • if=/dev/zero:从零设备读取(产生全零数据);
  • of=/test.bin:写入到测试文件;
  • bs=1M:每次读写 1M;
  • count=256:共读写 256 次,即生成 256M 的测试文件;
  • conv=fsync:物理同步写入后再统计,避免内存缓存虚高。

2. 测试读取速度

dd if=/test.bin of=/dev/zero bs=1M count=256 iflag=direct
  • iflag=direct:绕过文件系统缓存,直接读取磁盘,结果更接近真实磁盘读性能。

3. 测试同步写入速度(小数据块)

dd if=/dev/zero of=/test.bin bs=64k count=1k oflag=dsync
  • bs=64k:每次写入 64K;
  • count=1k:写入 1024 次,共 64M;
  • oflag=dsync:每次写入都同步落盘,模拟真实小文件写入场景,速度会明显低于上面的缓存写。

如何判断结果是否正常

不同介质的速度差异很大,先看参考范围:

存储类型 顺序写 顺序读 典型用途
机械硬盘 HDD 80-150 MB/s 100-180 MB/s 冷数据备份
SATA SSD 300-500 MB/s 400-550 MB/s 入门云主机数据盘
NVMe SSD 1000-3500 MB/s 1500-7000 MB/s 数据库、高并发应用

如果一块标称 SSD 的盘测出来只有几十 MB/s,大概率是买到了共享 IO 或限速的实例,也可能是测试时负载太高。如果读快写慢,通常是写入缓存策略或固件差异,可接受;如果读写都比同规格机型慢一倍以上,就该联系厂商核查。

补充:hdparm 读测试

如果只想快速看读取能力,hdparm 更轻量:

yum install -y hdparm
hdparm -t /dev/vda1

-t 测缓冲读取,-T 测缓存读取。注意 hdparm 需要 root 权限,且只能测块设备,不能测挂载目录。

为什么建议再跑一次 fio

dd 简单直观,但对真实负载的模拟有限,它只测顺序读写,不测随机 IOPS。生产环境做容量规划建议用 fio:

fio --name=randwrite --rw=randwrite --bs=4k --size=1G --numjobs=4

fio 能同时测随机读写、混合读写和时延分布,结果更接近数据库的真实负载,适合作为 dd 之后的进阶验证。执行时注意磁盘空间,--size=1G 会生成 1GB 测试文件,记得放在目标挂载点并随后清理。

什么时候测、测哪里

测之前先想清楚目的。给新买的云主机做"体检",就在系统盘和数据盘各测一次;给数据库迁移做评估,则要测目标实例挂载的数据盘,而不是系统盘——两者往往不是同一块物理盘。时间上避开业务高峰,一般选凌晨或低峰期,连续测三轮取中间值,结果更有参考意义。

另一个常见疑问是"测出来慢要不要退换"。先对照上文参考区间判断介质类型,再确认是否被限速:云厂商的低价实例经常共享宿主机 IO,测出明显低于标称值的速率,多半不是盘本身的问题,而是买到了受限的规格。

测试结果示例

1073741824 bytes (1.1 GB) copied, 4.63867 s, 231 MB/s

最后的 231 MB/s 即为测得的读写速度。注意:dd 的测试结果是顺序读写速度,且受 CPU、文件系统、磁盘缓存策略等因素影响,同一块盘多次测试结果可能略有差异,建议测三次取中间值。

对比时还要注意单位口径:dd 输出的 MB/s 是十进制(1 MB = 1,000,000 字节),多数厂商标称也是十进制,可以直接比;如果商家按二进制 GiB 标称,数字会显得"偏小",先统一口径再下结论。

注意事项

测试本身不难,难的是别留下隐患。下面几点照着做,基本不会踩坑:

  1. 测试完成后记得删除测试文件,避免占用磁盘空间:

    rm -f /test.bin
    
  2. 建议在服务器负载较低时测试,结果更准确;

  3. conv=fsyncoflag=dsync 会牺牲部分速度换取更真实的落盘数据,这正是我们想要的;

  4. 测试文件放在哪个挂载点,测的就是那块盘,换盘测试记得改路径;

  5. 删除测试文件前,把同步写的测试结果单独记录下来,方便和换盘、扩容后的数据对比。

硬盘性能测试是服务器性能测试的重要环节,更多服务器运维与性能优化内容可以参考云服务器分类下的文章。

原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284297.html(博客园 CQZHUOMI,转载)
参考:fio 文档 —— https://fio.readthedocs.io ;Red Hat 性能测试文档 —— https://access.redhat.com/documentation/