使用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 标志位置1时,异步I / O可能是 效率更高。
答案 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
,因此它可能与其他操作系统的使用有限。