gpt4 book ai didi

c++ - 优化 O_DIRECT 写入

转载 作者:IT王子 更新时间:2023-10-29 00:37:01 29 4
gpt4 key购买 nike

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

但是,我注意到如此快速地写入磁盘会占用大量 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com