С помощью ядра AIO и O_DIRECT|O_SYNC
копирование в буферы ядра отсутствует, и можно получать мелкозернистые уведомления, когда данные фактически удаляются на диск. Тем не менее, для хранения io_prep_pwrite()
требуется хранить данные в буферах пользовательского пространства.
С помощью splice()
можно перемещать данные непосредственно на диск из буферов (труб) пространства ядра, без необходимости копировать их. Однако splice()
возвращает сразу же после того, как данные поставлены в очередь и не дожидаются фактической записи на диск.
Цель состоит в том, чтобы перенести данные из сокетов на диск, не копируя их, получая подтверждение, что оно было сброшено. Как объединить оба предыдущих подхода?
Объединив splice()
с O_SYNC
, я ожидаю, что splice()
будет заблокирован, и нужно использовать несколько потоков для маскировки задержки. В качестве альтернативы можно использовать асинхронный io_prep_fsync()
/io_prep_fdsync()
, но это ожидает, что все данные будут очищены, а не для конкретной записи. Ничто не идеально.
Для чего потребуется комбинация splice()
с ядром AIO, позволяющая нулевое копирование и асинхронное подтверждение записи, так что поток, связанный с одним событием, может перемещать данные из сокетов на диск и получать подтверждения, когда это необходимо, но это похоже, не поддерживается. Есть ли хороший способ обхода/альтернативного подхода?