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 ядра, позволяющая нулевое копирование и асинхронное подтверждение записи, так что один поток, управляемый событиями, может перемещать данные из сокетов на диск и получать подтверждения, когда это необходимо, но это не кажется быть поддержаны. Есть ли хороший обходной/альтернативный подход?


person jop    schedule 27.11.2013    source источник


Ответы (1)


Чтобы получить подтверждение записи, вы не можете использовать splice().

В пользовательском пространстве есть вещи aio, но если бы вы делали это в ядре, это могло бы привести к выяснению того, какие био (блочные вводы-выводы) генерируются и ждут их:

Блочная структура ввода-вывода:

Если вы хотите использовать AIO, вам нужно будет использовать io_getevents():

Вот несколько примеров того, как выполнять AIO:

Если вы делаете это из пользовательского пространства и используете msync, это все еще витает в воздухе, если на самом деле все еще находится на вращающейся ржавчине.

документы msync():

Возможно, вам придется смягчить ожидания, чтобы сделать его более надежным, потому что может быть очень дорого на самом деле быть уверенным, что записи физически записываются на диск.

«Самый высокий» типичный стандарт для гарантии записи в свете чего-то вроде отключения питания — это операция записи журнала, которая изменяет хранилище. Сам журнал только добавляется, и вы можете видеть, полны ли записи, когда вы его воспроизводите. Эта самая последняя запись в журнале может быть неполной, поэтому что-то может быть потенциально потеряно.

person canolucas    schedule 03.05.2015