我快要疯了,想弄清楚我们的一个存储盒可能出了什么问题。使用一个简单的 fio 脚本,我使用 bs=1M 和 direct=1 测试随机写入。SSD 是连接到 LSI HBA(3Gbit/s 端口)的三星 840pro。
这是我在 FreeBSD 9.1 下得到的结果:
WRITE: io=13169MB, aggrb=224743KB/s, minb=224743KB/s, maxb=224743KB/s, mint=60002msec, maxt=60002msec
无论同步设置为 0 还是 1,都是如此。
在 Linux 上,这是 sync=0 的结果:
WRITE: io=14828MB, aggrb=253060KB/s, minb=253060KB/s, maxb=253060KB/s, mint=60001msec, maxt=60001msec
并且同步=1:
WRITE: io=6360.0MB, aggrb=108542KB/s, minb=108542KB/s, maxb=108542KB/s, mint=60001msec, maxt=60001msec
我的理解是,由于我在原始块设备上操作,因此 O_SYNC 不会产生任何影响 - 没有文件系统、任何屏障、写入和驱动器本身之间的任何东西。尤其是在设置了 O_DIRECT|O_SYNC 的情况下。
有任何想法吗?
作为参考,这是我正在测试的 fio 脚本:
[global]
bs=1M
ioengine=sync
iodepth=4
size=16g
direct=1
runtime=60
filename=/dev/sdh
sync=1
[rand-write]
rw=randwrite
stonewall
答案1
Linux 内核开发人员 Christoph Hellwig 通过电子邮件回复了 Zoltan 关于 Linux 块设备上的 O_SYNC 问题:
对于在 Linux 上使用 O_SYNC 的消费者磁盘来说,确实会产生很大的不同,因为它会在完成后刷新磁盘写入缓存,以确保满足 O_SYNC 保证数据已到达物理存储。
看起来 FreeBSD 可能缺少该调用。