事情本身不复杂,线索都在日志里。新买的云盘用 dd 测顺序写只测出二十兆每秒,比同价位的机器低了一个数量级,差点就去找客服要求换盘。
这类报错背后常见的原因有几处,逐个排除就行。没加 direct 参数,测的其实是 page cache 与回写速度。另一种情况是块大小设得太小,系统调用开销占了主导地位。
不容易想到的是,测试文件落在系统盘上,或者那个分区已经快满了。
先绕过缓存重测
dd if=/dev/zero of=/data/t bs=1M count=2048 oflag=direct
随后换更大块再测一次
dd if=/dev/zero of=/data/t bs=8M count=256 oflag=direct
接着用 fio 看真实延迟与 IOPS
fio -name=w -rw=write -bs=1M -size=2G -direct=1 -filename=/data/t
剩下的就是清理测试文件
rm -f /data/t
改完先别撤,确认这几项。direct 模式下顺序写达到云盘标称带宽的八成以上,写入延迟稳定,重测结果可以复现。
这里还有个坑。dd 只测顺序写,数据库真正关心的是四 K 随机,两种数字不能互相替代;测试文件也别忘了从生产盘上删掉。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。