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