io_uring 的并发写入扩展效果如何?

io_uring 的并发写入扩展效果如何?

背景:我对 的潜在性能提升非常感兴趣io_uring,但我对 C、Linux 内核或块设备的内部工作原理还不够熟悉,无法实现有意义的基准测试。我不是在寻找硬数字,只是寻找一个架构概述,为我继续研究提供信息。


想象一下,我有一个程序,它重复地将十个 4 字节整数批量附加到文件中,然后同步它。我想切换到一个模型,将批次中的每个整数附加到其自己的文件中。也就是说:我将向 10 个文件中的每一个文件写入一个 4 字节 int 并同步所有文件。

使用同步 IO,原始方案使用 2 个系统调用(1 个写入 + 1 个同步),而 int-per-file 方法使用了惊人的 20 个系统调用(10 个写入 + 10 个同步)。就系统调用而言,io_uring节省的成本将是巨大的:一次io_uring提交即可实现相当于 20 个系统调用的效果。我不清楚的是如何休息write一旦提交发生,Linux 机器的规模就会扩展。

  • 大多数磁盘是否对并行写入有一定程度的硬件支持?或者也许 SSD 可以,但旋转磁盘不行?
  • 写入是否通过管道(通过总线?)传输到磁盘,以便内核不必等待每个写入的往返响应?
  • 内核本身是否最终会对通过 请求的所有系统调用进行排队io_uring
  • 还有其他我没有考虑到的瓶颈吗?

很可能我的思维模式是错误的。非常感谢任何指点!

答案1

大多数磁盘是否对并行写入有一定程度的硬件支持?或者也许 SSD 可以,但旋转磁盘不行?

几乎所有磁盘都会这样做,无论它们是旋转磁盘还是固态磁盘(即使旋转磁盘也有缓存,因此对于少量数据,它们看起来不会太慢)。廉价的 USB 密钥或 SD 卡将实现较差的并发性,但也会有一定程度的并行性...就单个设备的最大并行命令而言,SATA 最多可以有 32 个,SCSI 往往在 10 到 100 之间, NVMe 可以达到 1000 秒(我认为规范将最大限制为 65536,但我不知道有哪个设备可以达到这么高)。

写入是否通过管道(通过总线?)传输到磁盘,以便内核不必等待每个写入的往返响应?

是的,可以并行发送多个写入(或读取)。然而,这种情况是否发生取决于很多因素(例如,内核可能会将它们组合在一起以提高效率,可能需要同步,因此必须清空队列等)

内核本身是否最终会对通过 io_uring 请求的所有系统调用进行排队?

或许。io_uring如果不会阻塞,则会内联完成 I/O,否则会排队。从使用 io_uring 实现高效 IO:“更重要的是,对于不会阻塞的操作,数据是内联提供的”。

还有其他我没有考虑到的瓶颈吗?

是的。还不清楚您是否每秒执行足够的 I/O 来真正看到诸如...之类的好处。io_uring此外,频繁的同步可能会限制并行性,具体取决于频率及其完成方式。如果您正在执行缓冲 I/O,即使在同步中,内核也会挤出并行性,因为您正在写入 RAM,然后内核会在可能的情况下并行地从 RAM 中转出。 (请注意,前面的项目并不是详尽的列表)

(标题中的问题)

io_uring 的并发写入扩展效果如何?

可以到很好,具体取决于您使用的内核以及提交 I/O 的方式。请参阅此中的参考资料和链接回答“Linux 上真的没有异步块 I/O 吗?”

参考

相关内容