1

我的应用程序使用 O_DIRECT 将 2MB 的数据直接刷新到 3 路条带存储(作为 lvm 卷安装)。

我在这个存储上的写入速度非常可悲。iostat 显示较大的请求大小正在被分解为较小的请求。

avgrq-sz<20 ...该驱动器上的阅读量不多。

刷新 2MB 的连续内存块(mlock用于确保)、扇区对齐(使用)大约需要 2 秒,而对写入速度大于 20Mbps 的存储进行posix_memalign测试dd和评估。iozone

我将不胜感激有关如何进一步调查此问题的任何线索。

PS:如果这不是此查询的正确论坛,我会感谢一个可能有用的指标。

谢谢。

4

1 回答 1

0

在 linux 上写 IO 中断?

磁盘本身可能具有最大请求大小,需要权衡块大小和延迟(发送到磁盘的请求越大,消耗的时间就越长),并且可以限制 I 的矢量化程度/O 驱动程序可以在单个请求中使用。鉴于以上所有情况,内核将在进一步向下提交堆栈时“分解”太大的单个请求。

我将不胜感激有关如何进一步调查此问题的任何线索。

avgrq-sz不幸的是,如果没有看到实际提交 I/O 的代码(也许您的程序正在提交 10KByte 缓冲区?),很难说为什么它这么小(如果它在每个 I/O 大约 10KBytes 的扇区中)。我们也不知道在提问者测试期间是否iozone并且dd正在使用。O_DIRECT如果它们不是,那么它们的 I/O 将进入回写缓存,然后稍后流出,内核可以以更优化的方式做到这一点。

注意:使用O_DIRECT不是更快的条带。在适当的情况下O_DIRECT可以降低开销但是如果你想达到尽可能高的吞吐量,因为你已经抢劫了,那么写O_DIRECT磁盘会增加你并行提交 I/O 的压力(例如通过 AIO/或通过多个进程/线程)io_uring为您创建并行提交到设备的最佳方式的内核。

于 2019-09-28T07:40:45.830 回答