При использовании асинхронного ввода-вывода POSIX, есть ли различия между O_DIRECT
а также AIO_RAW
? Или я / я могу использовать оба? Мы работаем над сервером баз данных NoSQL и ищем способы сделать асинхронный ввод-вывод более эффективным в системах POSIX.
O_DIRECT Постарайтесь минимизировать эффекты кэширования ввода-вывода в этот файл и из него. В целом это ухудшит производительность, но это полезно в
особые ситуации, например, когда приложения выполняют свое собственное кэширование.
Файловый ввод / вывод осуществляется непосредственно в / из буферов пространства пользователя.
Вы можете установить AIO_RAW бит флага в элементе структуры aio_flags
когда асинхронный ввод-вывод выполняется для раздела с необработанным устройством.
Когда AIO_RAW установлен бит флага, возможно асинхронный ввод-вывод
более эффективным.
Спрашивающий никогда не указывал, какие операционные системы они поддерживали (одна ссылка была на страницу руководства Linux, а другая на страницу SCO), поэтому трудно ответить на этот вопрос без предположений.
На момент написания Linux не поддерживает AIO_RAW
потому что Глибц 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 это выглядит AIO_RAW
Поддерживался только в HP-UX и SCO Unix, поэтому, вероятно, его использование ограничено другими операционными системами.
Других решений пока нет …