Вопрос или проблема
С тех пор как ядро начало поддерживать это, losetup
был модифицирован, чтобы включать прямой ввод-вывод по умолчанию. Это может избежать избыточного кэша страниц и также имеет преимущества в производительности.
http://man7.org/linux/man-pages/man8/losetup.8.html
–direct-io[=on|off]
Включить или отключить прямой I/O для резервного файла.
Необязательный аргумент может быть либо on, либо off.
Если аргумент упущен, по умолчанию используется on.
Я заметил, когда ядро добавило эту функцию, в одном коммите упоминается добавление функции специально для mount -oloop
. Был ли mount -oloop
также модифицирован так, чтобы по умолчанию включать прямой I/O (если ядро достаточно новое)? Я не могу найти это в документации.
Нет, я не думаю, что это было реализовано до сих пор (util-linux v2.31.1).
mount
и losetup
используют общий код для создания loop-устройств, но функция loopcxt_set_dio()
вызывается только внутри функции main()
в losetup.c
.
https://github.com/karelzak/util-linux/search?q=loopcxt_set_dio
https://github.com/karelzak/util-linux/search?q=LOOP_SET_DIRECT_IO
Видимо, для losetup
прямой I/O теперь по умолчанию выключен:
–direct-io[=on|off]
Включить или отключить прямой I/O для резервного файла. По умолчанию отключено. …
.
Ответ или решение
Вопрос о том, использует ли команда mount -oloop
прямой ввод-вывод (Direct I/O) по умолчанию в последних версиях ядра Linux, предполагает рассмотрение нескольких аспектов: текущего состояния поддержки этой функции в различных утилитах, изменения в исходных кодах и влияние Direct I/O на производительность.
Теория
Команда mount -oloop
используется для монтирования файлов как блочных устройств через loopback интерфейс. Обычно она применяется для монтирования образов ISO и других файловых систем, позволяя работать с ними как с физическими устройствами.
Direct I/O, или прямой ввод-вывод, позволяет избежать использования буферов кэша страниц (page cache), напрямую передавая данные между пользовательским пространством и устройством. Это может снижать избыточность данных в памяти и повышать производительность за счёт уменьшения задержек, связанных с обработкой кэша.
Есть определённая функциональность, связанная с Direct I/O, реализованная в утилите losetup, которая устанавливает устройство loop и позволяет включать или отключать прямой ввод-вывод с помощью параметров командной строки. Однако в контексте mount -oloop
Direct I/O по умолчанию не активируется.
Пример
-
losetup и Direct I/O: Согласно документации и коммитам в ядре Linux, losetup был модифицирован для включения Direct I/O, что позволяет пользователю явно задавать, использовать или нет этот метод ввода-вывода.
-
mount -oloop и его поведение: При анализе исходного кода util-linux становится очевидным, что основная логика настройки Direct I/O (
loopcxt_set_dio()
) вызывается исключительно внутри кода losetup, а не mount.
Применение
В контексте внедрения директ-ориентированного I/O через mount -oloop
важно учитывать текущую конфигурацию системы и то, какая версия ядра и утилит используется. На момент версии util-linux 2.31.1 нет свидетельств, что Direct I/O для mount -oloop
используется по умолчанию. Однако, если в вашей рабочей среде важны аспекты производительности, и вы стремитесь избежать экономически неоправданного использования оперативной памяти, вы можете вручную подстроить параметры loopback, используя losetup перед монтированием, чтобы обеспечить активирование Direct I/O.
Кроме того, учитывая уровень влияния Direct I/O на производительность, это может иметь значение для систем с высокими требованиями к вводу-выводу, таких как базы данных или серверы хранения данных, где даже небольшие улучшения в скорости доступа к данным могут повлиять на общую производительность системы.
Таким образом, для профессионалов в области IT, работающих с высоконагруженными системами, целесообразно учитывать возможность ручного настраивания параметров, связанных с Direct I/O, для повышения оперативности обработки данных и снижения нагрузки на подсистему памяти.