应用程序使用内核AIO

4
请问有没有人能给我介绍一些使用内核AIO(即io_submit()系列)的应用程序(最好是常用的),例如SQL或无SQL数据库等?我希望它能够在每个线程上发出超过1个队列深度的异步读取,以完全利用支持64个及以上请求的高并行SSD,而不会出现明显的性能下降。
我知道InnoDB,但我正在寻找更简单的东西(可能是一个KV存储)。
更新:我不需要示例代码,也不需要像fio+libaio这样的合成基准。我对于寻找一组可以在更加真实的环境下饱和该设备的应用程序感兴趣。

1
你知道吗,你不需要异步I/O来实现这个功能。大的I/O块会被分成小块以增加队列深度 - 实际上,PCIe一次无法传输超过4Kb,所以无论如何都是你的最大I/O块。此外,大多数非直接I/O异步文件I/O内核实现(除了Windows)都是在用户空间或内核空间中作为线程实现的,因此在这些系统上使用线程池可以获得更好的性能。出于这个原因,大多数数据库提供基于线程池的后端。 - Niall Douglas
让我换个说法:启动四个副本的“dd”命令来复制数据将轻松饱和任何SSD,即使是顶级PCIe设备。队列深度迅速达到最大值。 - Niall Douglas
1个回答

3

io_submit/io_getevents的一个简单示例是fio,这是一个对于测试和分析块设备非常有帮助的程序。它具有多种不同的I/O后端以支持不同的操作系统和不同的访问技术。Linux AIO封装在作者的github存储库中:https://github.com/axboe/fio/blob/master/engines/libaio.c

fio代码很简单,但缺少eventfd集成,您可能需要它。(我总是需要的。)为此,QEMU块层中略微复杂但直接的代码提供了一个很好的示例:https://github.com/qemu/qemu/blob/331ac65963ab74dd84659b748affa0b111486f06/block/linux-aio.c

您可能会发现您可以通过单个线程使SSD饱和!或者至少值得测试。Fio可以在编写代码之前为您提供预期吞吐量的良好想法。您甚至可以将其配置为执行多个线程。


感谢@gubblebozer。我知道fio,这就是我知道该设备可以并行提供高达64个4KB randread的原因。我正在寻找一个能够将该设备推到极限的现实情况。 - Mohammad Hedayati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接