【发布时间】:2013-04-06 13:41:47
【问题描述】:
在使用 POSIX 异步 I/O 时,使用 O_DIRECT 和 AIO_RAW 有什么区别吗?或者我应该/我可以同时使用两者吗?我们正在开发 NoSQL 数据库服务器,并正在研究如何在 POSIX 系统上提高异步 I/O 的效率。
O_DIRECT 尽量减少进出该文件的 I/O 的缓存影响。一般来说,这会降低性能,但它在 特殊情况,例如当应用程序进行自己的缓存时。 文件 I/O 直接从用户空间缓冲区完成。
您可以在 aio_flags 结构成员中设置 AIO_RAW 标志位 当对原始设备分区执行异步 I/O 时。 当 AIO_RAW 标志位被设置时,异步 I/O 可能 更高效。
【问题讨论】:
-
Linux 上的 aio_write 不是每次都产生一个线程吗?在我看来,这总是一个失败的提议——最好不要使用 AIO(至少在 Linux 上,直到它变得更好)。
-
@JohnZwinck 这里有一个关于这个主题的有趣讨论stackoverflow.com/questions/87892/…,上面写着
"Direct, unbuffered I/O is only really useful for transactional databases, and those tend to write their own threads or processes to manage their disk I/O."——这是我们正在开发事务型 NoSQL 数据库服务器产品时的场景。我们管理自己的用户线程池。 -
我并不是说不要尝试直接的、无缓冲的 I/O。我是说考虑不使用 AIO。这几乎就是您链接的页面所说的:避免使用 AIO。如果需要,请使用 O_DIRECT,但不要使用 AIO_RAW,因为不要使用 AIO。 :)
-
@JohnZwinck 我认为只要我们管理自己的用户线程池就可以了; POSIX AIO 的好处是它适用于每个文件系统(ext2、ext3、jfs、xfs 和 nfs)和 POSIX 系统,这样我们就不必多次编写相同的代码来制作统一的设备接口。
标签: c++ file asynchronous posix device