我的服务器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减速?使用页面缓存时是否真的涉及更多内容?这不典型吗?
答案 0 :(得分:10)
在oflag=direct
案例中:
更一般地说,巨大的块大小(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)了解其背后的原始动机。