为什么带有“直接”(O_DIRECT)标志的dd如此快得多?

时间:2015-11-02 19:12:33

标签: c linux file io dd

我的服务器RAID50配置为24个驱动器(两组12个),如果我运行:

anything

我明白了:

dd if=/dev/zero of=ddfile2 bs=1M count=1953 oflag=direct

但如果我跑:

2047868928 bytes (2.0 GB) copied, 0.805075 s, 2.5 GB/s

我明白了:

dd if=/dev/zero of=ddfile2 bs=1M count=1953

我知道O_DIRECT会导致页面缓存被绕过。但据我所知,它绕过页面缓存基本上意味着避免使用memcpy。使用bandwidth tool在我的桌面上进行测试我的最差情况顺序内存写入带宽为14GB / s,我想在更新的更昂贵的服务器上,带宽必须更好。那么为什么额外的memcpy导致> 2x减速?使用页面缓存时是否真的涉及更多内容?这不典型吗?

1 个答案:

答案 0 :(得分:10)

oflag=direct案例中:

  • 您正在让内核能够立即写出数据,而不是等待缓冲区达到阈值/超时,导致同步被强制(这意味着它不太可能被阻止同步不相关的数据)。
  • 在某些情况下,弄脏缓冲区比刷新它们的速度更快将导致程序生成脏缓冲区,等待任意限制的压力减轻(参见SUSE's "Low write performance on SLES 11/12 servers with large RAM")。
  • 您正在保存内核工作(没有额外的副本从userland到 内核,无需执行大多数缓冲区缓存管理操作)。

更一般地说,巨大的块大小(1MByte)可能比RAID的块大小更大,因此I / O将在内核中分离,并且那些较小的块并行提交,因此您可以通过缓冲的写回来获得合并微小的I / O价值不高。

鉴于上述所有情况,如果您在原始缓冲副本期间最大化单个CPU(但磁盘可以处理更多吞吐量)那么执行O_DIRECT副本应该更快,因为用户空间可用的CPU时间更多/由于内核开销减少而维护磁盘I / O.

  

那么为什么额外的memcpy导致> 2x减速?

这不仅仅是一个额外的memcpy 每I / O - 考虑一下必须维护的所有额外缓存机制。

  

使用页面缓存时是否真的涉及更多内容?

是的! explanation about how copying a buffer to the kernel isn't instantaneous and how page pressure can slow things down问题的答案中有一个很好的Linux async (io_submit) write v/s normal (buffered) write。但是,除非您的程序能够足够快地生成数据并且CPU过载,否则它无法足够快地提供磁盘,因此通常不会显示或重要。

  

这不典型吗?

不,您的结果非常典型您使用的工作量。我想如果块大小很小(例如512字节),那将是一个不同的结果。

总结:您的I / O模式并没有真正受益于缓冲(I / O非常庞大,数据没有被重用,I / O是流顺序的)所以您处于{{1}的最佳场景更快。请参阅这些slides by the original author of Linux's O_DIRECT(更长PDF document that contains an embedded version of most of the slides)了解其背后的原始动机。