O_DIRECT与AIO_RAW

时间:2013-04-14 10:58:32

标签: c++ file asynchronous posix device

使用POSIX异步I / O时,使用O_DIRECTAIO_RAW之间有什么区别吗?或者我/我可以同时使用两者吗?我们正在研究NoSQL数据库服务器,并正在研究如何在POSIX系统上提高异步I / O的效率。

open(2)

  

O_DIRECT 尝试最小化I / O与此文件之间的缓存效果。一般来说,这会降低性能,但它很有用   特殊情况,例如应用程序执行自己的缓存时。   文件I / O直接进出用户空间缓冲区。

aiocb(5)

  

您可以在aio_flags结构成员中设置 AIO_RAW 标志位   当异步I / O正在对原始设备分区进行时。   当 AIO_RAW 标志位置1时,异步I / O可能是   效率更高。

1 个答案:

答案 0 :(得分:0)

提问者从未指定他们支持哪些操作系统(一个链接指向一个Linux手册页,另一个链接指向SCO一个)所以很难在没有推测的情况下回答这个问题。

在撰写本文时,Linux不支持AIO_RAW,因为glibc的struct aiocb没有aio_flags成员(https://www.gnu.org/software/libc/manual/html_node/Asynchronous-I_002fO.html)和内核AIO(其中)是非POSIX)不支持AIO_RAW值。所以:

  

使用O_DIRECT和AIO_RAW之间有什么区别吗?或者我/我可以同时使用两者吗?

是的,因为并非所有支持POSIX AIO的操作系统(例如Linux)都允许您设置AIO_RAW,并且肯定会出现无法同时使用这两种情况的情况。此外,某些操作系统(如Linux O_DIRECT)可以处理文件系统内部和设备上的文件,而AIO_RAW仅适用于“原始设备”。从dt源代码来看,它似乎仅在HP-UX和SCO Unix上支持AIO_RAW,因此它可能与其他操作系统的使用有限。