【发布时间】:2015-03-12 00:10:09
【问题描述】:
我正在编写一个 C 程序,通过直接读取原始块设备文件来从 SSD 驱动器读取数据。
我正在尝试Linux AIO(我说的是Linux AIO API,即linuxaio.h提供的功能,例如io_submit(...)等,而不是POSIX AIO API)。我使用O_DIRECT 标志打开块设备文件,并确保写入缓冲区与块大小对齐。
我注意到 Linux AIO 比使用带有O_DIRECT 标志的同步 IO 快得多。
最让我吃惊的是,使用 Linux AIO 发出许多几 KB 的小随机读取所获得的吞吐量明显高于使用同步 I/ 进行几 MB 的大型(顺序)读取所获得的吞吐量O 和O_DIRECT。
所以,我想知道:为什么 Linux AIO 的性能比同步 I/O 更好?使用 AIO 时内核做了什么?内核是否执行请求重新排序?与使用同步 I/O 相比,使用 Linux AIO 会导致更高的 CPU 利用率吗?
提前非常感谢
【问题讨论】:
-
AIO 更快,因为它的名字。它是异步的,基本上所有的 IO 都是对内存而不是底层磁盘完成的。
-
@Miline:这完全没有意义。从磁盘进行随机读取绝对需要来自磁盘的物理 I/O。没有办法将这些字节从磁盘魔术到内存中。
-
我的意思是 IO 主要是从缓存数据的内存中完成的。将要写入的数据加载到内存中,然后将io返回给应用程序。并且内存中的那个页面被标记为脏。所以它的文件系统的工作是将该页面刷新到磁盘.. 在 DIRECTIO 的情况下.. io 在数据写入磁盘之前不会返回
-
@Miline linux kernel aio 需要
O_DIRECT
标签: c linux io linux-kernel aio