Linux Disk File AIO - PullRequest
       16

Linux Disk File AIO

9 голосов
/ 15 декабря 2011

Согласно этому руководству файл асинхронного диска io может быть легко реализован с помощью AIO в linux, по крайней мере, с точки зрения программирования / API.Но до и после этого урока я прочитал много постов и статей, что это либо невозможно, либо вы должны использовать libevent с патчем и многие другие вопросы.Другое дело, что я должен был ждать сигнала, но на основе этого урока я могу использовать механизм обратного вызова, который, очевидно, значительно упрощает использование AIO.

Теперь я даже не программист LinuxВ общем, я просто хотел найти простой способ поддержки файла асинхронного диска io в Linux, изучить его и добавить в библиотеку асинхронного диска io, которая нужна мне для личного проекта.В настоящее время я использую перекрывающиеся io в Windows и рабочие потоки io на не-Windows платформах.Поскольку многопоточное решение может быть сложным, я хотел заменить его в Linux на AIO.

ТАК, что не так с AIO, как описано в этом руководстве?Это производительность?Есть ли ограничения на операции, которые можно выполнять с помощью AIO?

ps Мне все равно, не будет ли код переносимым на другие POSIX-совместимые платформы, если он работает в основных дистрибутивах Linux.И все, что меня волнует, это обычный файл на диске io.

Спасибо.

Ответы [ 2 ]

13 голосов
/ 19 декабря 2011

В этом руководстве дается общий обзор асинхронного ввода-вывода и рассказывается о том, как его поддерживает ядро.Далее мы поговорим о posix AIO (который является стандартизированным API для доступа к асинхронному вводу-выводу), подразумевая, что использование posix AIO API в linux предоставит вам доступ к поддержке ядра для AIO.Это не так.

В Linux действительно есть две отдельные реализации AIO:

  1. ядро ​​AIO, которое использует io_submit () и др.), Которое поддерживается только в ядре 2.6(или на самом деле 2.5, и могут быть версии с обратным портированием на 2.4.
  2. posix AIO, который является функцией glibc, по существу не связанной с ядром. Он реализует API posix с точки зрения создания потоков пользовательского уровняблокировка вызовов дискового ввода-вывода.

Итак, короче говоря, если у вас уже есть универсальная реализация нескольких потоков для дискового ввода-вывода, вам может быть лучше использовать это, чем использовать реализацию glibc (потому что вы могли бы иметь немного больший контроль над ним).

Если вы на самом деле намерены использовать семейство функций io_submit (), вам, возможно, придется проделать довольно большую работу, чтобы обойти ограничения этих функций.

ядро ​​AIO требует, чтобы ваши файлы открывались с помощью O_DIRECT. Что, в свою очередь, требует всех ваших смещений, размеров чтения и записибыть выровненным по блокам на диске.Обычно это нормально, если вы используете только один большой файл и можете заставить его работать очень похоже на кеш страниц в ОС.Для чтения и записи произвольных файлов с произвольными смещениями и длинами это становится грязным.

Если вы в конечном итоге дадите ядру AIO шанс, я настоятельно рекомендую привязать один или несколько событийных файлов к вашим iocbs, чтобы вы моглидождитесь завершения, используя epoll / select, а не блокируя его в io_getevents ().

2 голосов
/ 15 декабря 2011

Linux-реализация POSIX AIO порождает поток для каждой записи, которую вы делаете.Обычно это нехорошо, и вам лучше использовать собственные рабочие потоки для выполнения записи, чтобы вы могли контролировать, сколько потоков в игре.Другими словами, придерживайтесь того, что у вас есть, AIO не собирается ничего вам покупать.

...