Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

Структура блока ввода/вывода:

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

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

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

msync() docs:

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

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