c++ - 优化 O_DIRECT 写入

标签 c++ c linux io

我正在尝试编写一个需要非常快速地写入磁盘的应用程序。我已经达到写入磁盘的性能目标,这很棒。

但是,我注意到如此快速地写入磁盘会占用大量 CPU 时间:一个内核已用尽,另一个内核已达到 80%,另外两个内核已达到 10-20%。所以我听说 O_DIRECT 可以通过避免所有这些复制到内核空间然后复制到磁盘来减少 CPU 消耗。

我运行了一个小测试程序,证实了这一点 - CPU 使用率下降到一个内核的 50% - 好多了。

但是,我从未获得过与正常写入时完全相同的吞吐量,为了加快速度,我不得不使用非常大的记录大小(大约 130MB!)

所以,我想问题是:

  • 有没有比写入 O_DIRECT 更好的方法来降低 CPU 使用率? 或
  • 我怎样才能获得与内核获得的吞吐量相似的吞吐量?

我的环境是 Linux,我使用的是 RAID 50,我能够缓冲写入,直到达到某个最佳记录大小。一次只有一位作家。

最佳答案

引用 this page :

With O_DIRECT the kernel will do DMA directly from/to the physical memory pointed [to] by the userspace buffer passed as [a] parameter to the read/write syscalls. So there will be no CPU and memory bandwidth spent in the copies between userspace memory and kernel cache, and there will be no CPU time spent in kernel in the management of the cache (like cache lookups, per-page locks etc..).

基本上,当使用 O_DIRECT 时,您是在用吞吐量换取 CPU 性能。内核停止为您优化吞吐量,作为返回,您将获得可预测的结果和完全控制权。

长话短说:使用O_DIRECT,您必须自己进行缓存和其他优化以增加吞吐量。巨大的记录大小现在看起来并不那么奇怪。

我不知道任何其他方法,但我不是 linux 专家。随意询问:)

关于c++ - 优化 O_DIRECT 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814952/

相关文章:

linux - 如何告诉 Qt 使用不同的 OpenSSL

linux - ImageMagick:可以删除图片的中间部分吗?

c - 文件定位功能是否会在内部将输出刷新到设备并清除输入缓存?

c++ - 我可以在 vector 中使用 const 来允许添加元素,但不能修改已添加的元素吗?

c++ - c++ 和 cublas 代码的混合未编译

c++ - 仅在 Eclipse 中不识别在一个位置的 ofstream 声明

C 程序返回 0 而不是整数输入序列中最大出现的整数

c - 为什么这个程序在使用大字符串时不能给出正确的结果?

c++ - 在程序代码中编码/嵌入版本号的正确方法

c++ - 使用生成器和分布扩展 c++11 random 的教程或示例代码