在Linux上写IO分手?

| 我的应用程序使用O_DIRECT将价值2MB的数据直接刷新到3向条带化存储(作为lvm卷安装)。 我在此存储上的写入速度非常可悲。 iostat表明,较大的请求大小被分解为较小的请求。
avgrq-sz
<20 ...该驱动器上读取的内容很少。 清空大约2MB的连续内存块(使用
mlock
以确保),扇区对齐(使用
posix_memalign
)大约需要2秒,而使用
dd
iozone
进行的测试则认为存储空间的写入速度可大于20Mbps。 如果有任何线索可以进一步调查这个问题,我将不胜感激。 PS:如果这不是该查询的合适论坛,我希望能为您提供帮助的指标。 谢谢。     
已邀请:
  在Linux上写IO分手? 磁盘本身可能具有最大的请求大小,需要权衡块大小和延迟(发送到磁盘的请求越大,消耗的时间就越长),并且对矢量/ O驱动程序可以在单个请求中使用。鉴于以上所有内容,内核将“分解”单个请求,这些请求在进一步提交堆栈时太大。   如果有任何有关如何进一步调查此问题的线索,我将不胜感激。 不幸的是,很难说出为什么ѭ0这么小(如果它的扇区中每个I / O大约10KB)而没有看到代码实际提交I / O(也许您的程序正在提交10KB缓冲区?)。我们也不知道在提问者测试中
iozone
dd
是否正在使用
O_DIRECT
。如果不是这样,那么他们的I / O就会进入回写缓存,然后再流出来,内核可以以更优化的方式做到这一点。 注意:使用
O_DIRECT
并不是更快的条纹。在适当的情况下,如果您想达到最大的吞吐量,则ѭ8'可以降低开销,但仅要写入
O_DIRECT
做磁盘就增加了并行提交I / O的压力(例如,通过AIO /
io_uring
或通过多个进程/线程),因为抢走了内核为您创建向设备并行提交的最佳方法。     

要回复问题请先登录注册