EXT4性能连续写入速度较慢

时间:2015-10-30 04:26:42

标签: io fwrite ext4

我正在使用一个C程序来做很多事情,但在某些方面它会在一个固定大小的单个文件上编写一个带有fwrite多次调用的整个硬盘。

电话是这样的:

    fwrite(some_memory,size_element,total_elements,file);

当我测量此呼叫的挂起时间时,每个呼叫比前一个呼叫需要更长的时间。因此,例如,如果要写入900MB数据块,第一次调用(空磁盘)在7秒内结束,但最后一次调用需要10到11秒(磁盘几乎满负荷)。

这是预期的行为吗?有没有办法获得与磁盘当前容量无关的一致写入时间? 我正在使用EXT4 wd green 2TB音量。

1 个答案:

答案 0 :(得分:0)

我说这是预期的,因为你的早期调用最有可能被内核的写回缓存所满足,因此返回得更快,因为在fwrite返回时并非所有数据都已到达磁盘然而。但是我不知道你的系统有多少内存与你尝试写的900MB数据相比,所以这是一个猜测......

如果内核的缓存已满(例如因为磁盘无法跟上),那么您的用户空间程序将被阻塞,直到它足够空并且能够接受更多数据泄漏桶样式。只有当所有数据都进入缓存后,才能完成fwrite。但是,此时您可能正在执行另一个fwrite调用,该调用再次占据缓存,并且后续调用被迫等待一段时间,因为缓存尚未完全清空。我想你会达到一个固定点但是......

要查看缓存是否真的落后于该行为,您可以在每次fwrite(破坏性能)之后发出fsync,并从fwrite提交到fsync完成时间,并查看方差是否过大。

你可以做的另一件事可能有帮助,就是预先预先分配文件的完整大小,这样文件系统就不会被强制继续重新生成,因为新数据被追加到最后(这应该会减少)元数据操作和反对碎片化。)

考虑到您正在撰写的大量数据,https://www.kernel.org/doc/Documentation/sysctl/vm.txt中的dirty_ *旋钮也可能会进场。