为什么我的同步I / O与直接相比如此糟糕?

我在软件RAID 1设置中有两个3TB磁盘,主机操作系统是64位Debian wheezy。

发行:

dd if=/dev/zero of=test bs=64k count=3k oflag=direct && rm test 

产量:

 201326592 bytes (201 MB) copied, 1.423 s, 141 MB/s 

如果我改变dd命令来使用同步的IO调用(通过将oflag开关从“direct”改为“sync”),写下peformance掉落地板:

 201326592 bytes (201 MB) copied, 76.0286 s, 2.6 MB/s 

显然,同步IO导致性能下降,但是我期望写入吞吐量下降到直接等价的一半或三分之一(最坏情况)。 2.6MB / s似乎极端,让我觉得有一个问题的地方。

同步的IO停止,直到块被写入磁盘并由控制器确认,所以你最终在块之间等待至less一个寻道时间。 你每秒得到40个64k块,或每25毫秒一个。 这与花费一个10ms寻道时间写入数据是一致的,另一个更新inode中的元数据,再加上一些操作系统开销。

这就是为什么你不想使用同步IO,除非你真的需要强大的一致性。