![为什么我的同步 I/O 与直接 I/O 相比如此糟糕?](https://linux22.com/image/611421/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E5%90%8C%E6%AD%A5%20I%2FO%20%E4%B8%8E%E7%9B%B4%E6%8E%A5%20I%2FO%20%E7%9B%B8%E6%AF%94%E5%A6%82%E6%AD%A4%E7%B3%9F%E7%B3%95%EF%BC%9F.png)
我在软件 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”),写入性能就会急剧下降:
201326592 bytes (201 MB) copied, 76.0286 s, 2.6 MB/s
显然,同步 IO 会导致性能下降,但我预计写入吞吐量可能会下降到直接等效吞吐量的一半或三分之一(最坏情况)。2.6MB/s 似乎有些极端,这让我认为某个地方存在问题。
答案1
同步 IO 会停止,直到块写入磁盘并得到控制器确认,因此您最终需要在块之间等待至少一个寻道时间。您每秒获得大约 40 个 64k 块,或者每 25 毫秒获得一个。这与花费一个 10ms 寻道时间写入数据和另一个 10ms 寻道时间更新 inode 中的元数据以及一些操作系统开销一致。
这就是为什么你不想使用同步 IO,除非你真的需要强一致性。