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