## dd 能测什么
dd 是最随手可得的磁盘吞吐测试工具,拷贝指定大小的数据块统计耗时,适合快速验证新盘的顺序读写能力:云服务器新挂数据盘后跑一下,心里有底;迁移前后各跑一次,对比环境有没有缩水。它测的是顺序吞吐,不能代表数据库那种小块随机读写的表现,后者要用专业工具,定位别搞错。
## 最重要的参数:绕过缓存
直接裸跑 dd 写测试,数据先进 page cache 就返回,测出的是内存速度,数字漂亮但没有意义。写测试必须加绕过缓存的参数:
bash dd if=/dev/zero of=/data/testfile bs=1M count=2048 oflag=direct
oflag=direct 让写请求直落磁盘,读到的数字才是真实写吞吐。读测试同样要 iflag=direct,先把缓存里的数据丢掉再读才有参考价值,否则读的还是内存:
bash dd if=/data/testfile of=/dev/null bs=1M iflag=direct
块大小 bs 会影响结果,1M 适合看吞吐,4K 更接近小 IO 场景但 dd 语义不精确,仅做参考。测完删掉测试文件,别让它占着数据盘。
## 怎么读数
dd 末行输出复制总量、耗时与吞吐速率。判读要点:写与读都要测,只测一个的结论不完整;同一测试跑两三次取稳定值,第一次可能受预分配影响;结果与标称值有差距是正常的,标称是峰值上限,文件系统、加密、共享宿主机都会摊薄实际值,云盘尤其如此,长期明显低于预期再考虑排查。多次测试取中位数更稳,磁盘预热后第一轮数字往往偏高,别被单次峰值带偏。对比测试要控制变量:同参数、同时间段、同机器,跨机器比数字先确认规格一致。
## 常见坑
一是忘加 direct 参数,测出几 GB 每秒的内存速度还以为捡到宝;二是在系统盘跑大写入测试,制造无谓的 IO 高峰,影响正在跑的服务,测试尽量放在数据盘与业务低峰,测试文件路径要与业务在同一分区,写到别的分区测的其实是另一块盘;三是把 dd 结果当成数据库性能依据,顺序吞吐高不代表随机 IO 好,选型数据库盘要看小块随机指标。在顺云的云服务器上验收新盘时,dd 快测加控制台 IO 监控曲线互相印证,几分钟就能给出结论。