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