我只是发现同步 IO 在较新的内核上变得越来越慢。我已经在 CentoOs(2.6)、Fedora20(3.11)、Ubuntu12(3.2) 上尝试了以下命令。
echo 0 > test
dd if=/dev/zero of=test bs=1024 count=200 oflag=dsync
2.6 的速度约为 1MB/s,新内核的速度仅为 25kB/s 左右。
我有一个在 C 函数中调用 sync()
的 CFD 代码。通常代码在旧内核上运行得非常快,但现在在新操作系统上运行速度要慢得多。我真的很好奇 Linux 开发人员对 sync()
做了什么。另一个可能的原因不是内核版本,而是不同操作系统使用的文件系统。
此时我的代码无论如何都需要 sync()
,那么有什么我可以调整的,比如 ioctl()
来加速它吗?
非常感谢任何评论。
最佳答案
sync()
的表观性能受系统中安装的内存量、磁盘 i/o 的使用模式(包括驱动器的缓存、DMA Controller 等)的影响很大,以及磁盘驱动器的速度。
如果不严格控制所有这些变量,当您认为您只是在更改内核时,将一个系统与另一个系统进行比较是毫无意义的。
较新的硬件似乎使事情变慢的影响是有道理的。当有 250 MB 的积压(因为系统只有 2 GB 的 RAM)时,内核不再清除挂起的写入,而是现在可以将其推迟到 16 GB 的积压,因为较新的系统有 64 GB 的 RAM。
关于linux - Sync IO 在较新的 Linux 内核上慢得令人难以置信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31196076/