2

使用 POSIX 异步 I/O 时,使用O_DIRECT和之间有什么区别AIO_RAW吗?或者我应该/我可以同时使用两者吗?我们正在开发一个 NoSQL 数据库服务器,并且正在寻找在 POSIX 系统上提高异步 I/O 效率的方法。

打开(2)

O_DIRECT尽量减少进出该文件的 I/O 的缓存影响。一般来说,这会降低性能,但在特殊情况下很有用,例如当应用程序进行自己的缓存时。文件 I/O 直接与用户空间缓冲区进行。

aiocb(5)

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

4

1 回答 1

0

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

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

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

是的,因为并非所有支持 POSIX AIO 的操作系统(例如 Linux)都允许您进行设置AIO_RAW,并且在某些情况下您肯定无法同时使用两者。此外,在某些操作系统(例如 Linux)O_DIRECT上,可以在文件系统和设备上使用文件,而AIO_RAW仅适用于“原始设备”。从 dt 源代码来看,它看起来AIO_RAW只在 HP-UX 和 SCO Unix 上受支持,因此它可能在其他操作系统上的使用受到限制。

于 2018-02-13T17:48:38.043 回答