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, но если бы вы делали это в ядре, это могло бы привести к выяснению, какие био (блочные операции ввода / вывода) сгенерированы, и их ожиданию:
Блочная структура ввода / вывода:
Если вы хотите использовать AIO, вам нужно использовать io_getevents ():
Вот несколько примеров того, как выполнить AIO:
Если вы делаете это из пользовательского пространства и используете msync, то он все еще находится в воздухе, если на самом деле он все еще находится на вращающейся ржавчине.
msync () документы:
Возможно, вам придется смягчить ожидания, чтобы сделать его более надежным, поскольку на самом деле может быть очень дорого быть уверенным, что записи физически записаны на диск.
"Самый высокий" типичный стандарт для гарантии записи в свете чего-то вроде отключения питания - это операция записи в журнал, которая модифицирует хранилище. Сам журнал только для добавления, и вы можете увидеть, если записи завершены, когда вы воспроизводите его. Эта последняя запись в журнале может быть неполной, поэтому что-то еще может быть потеряно.