linux - Sync IO 在较新的 Linux 内核上慢得令人难以置信

标签 linux io linux-kernel

我只是发现同步 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/

相关文章:

php - 从 Linux 服务器发送邮件的问题

Linux命令从一个长字符串中打印一些字符

C# - StreamReader/StreamWriter - 另一个进程使用的文件

haskell - 继续进入元组

c - 用户空间的汇编程序

linux-kernel - 延迟工作的 CPU 处理

将静态内核驱动程序编译为模块

linux - 这个 bash 脚本中的 ldconfig 声明是什么?

linux - "Cannot open/var/log/sysstat/sa16 Please check if data collecting is enabled in/etc/default/sysstat"

linux-kernel - 为什么要为内核模块开发中声明的每个变量指定权限属性?