c – 优化O_DIRECT写入

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

但是,我注意到写入磁盘这么快就占用了大量的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大师.随意问问:)

点赞