【问题标题】:Write IO breakups on linux?在 linux 上写 IO 中断?
【发布时间】:2011-08-11 05:52:38
【问题描述】:

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

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

avgrq-sz

刷新 2MB 的连续内存块(使用 mlock 确保这一点)、扇区对齐(使用 posix_memalign)大约需要 2 秒,而使用 ddiozone 的测试对存储能力进行评级> 20Mbps 的写入速度。

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

PS:如果这不是此查询的正确论坛,我希望能提供一些有用的指标。​​

谢谢。

【问题讨论】:

  • superuser.stackexchange.com;欢迎来到SO;我重新格式化了这个问题。它有助于很好地制定和提出问题
  • 什么是文件系统驱动程序? (是保险丝吗?什么版本?) 20 Mbps in 3way stripe... 是用铅笔写的吗?我们在谈论什么样的媒体 - 看起来不像 sata 硬盘
  • 我不同意那些投票结束这个问题的人。这家伙有一些 C 代码,他想提高写入性能。超级用户?请。高级用户不要打电话posix_memalign或使用O_DIRECT,这很明显是一个编程问题。
  • 。 @sehe 它是最新的带有 ext4 的 Ubuntu Server detro 之一,硬盘确实是 SATA。我将在星期一发布确切的统计数据。 @asveikau 是的,它是一个 C 代码,需要对驱动器进行大量顺序写入。如果任何特定的统计信息对调试有帮助,请告诉我,我会将这些统计信息放在这里

标签: linux performance linux-kernel iostat


【解决方案1】:

在 linux 上写 IO 分解?

磁盘本身可能有最大请求大小,需要权衡块大小和延迟(发送到磁盘的请求越大,被消耗的时间就越长),并且可以有constraints on how much vectored I/O a driver can consume in a single request .鉴于以上所有情况,内核将在进一步向下提交堆栈时“分解”太大的单个请求。

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

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

注意:使用O_DIRECT 并不是一个更快的条带。在right circumstances O_DIRECT can lower overhead 但写O_DIRECTly 来做磁盘会增加您并行提交I/O 的压力(例如,通过AIO/io_uring 或通过多个进程/线程),如果您想达到尽可能高的吞吐量因为您已经剥夺了内核为您创建并行提交到设备的最佳方式。

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2014-07-08
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多