Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: ✔️ общие папки NFS
В этой статье приведены рекомендации по работе с каталогами, содержащими большое количество файлов. Обычно рекомендуется уменьшить количество файлов в одном каталоге, разместив файлы по нескольким каталогам. Однако существуют ситуации, в которых нельзя избежать больших каталогов. При работе с большими каталогами в общих папках Azure, подключенных к клиентам Linux, рассмотрите следующие рекомендации.
Увеличьте количество хэш-контейнеров
Общий объем ОЗУ в системе, выполняющий перечисление, влияет на внутреннюю работу протоколов файловой системы, таких как NFS и SMB. Даже если пользователи не испытывают высокую загрузку памяти, количество доступной памяти влияет на число хэш-ячейк inode в системе, что улучшает производительность перечисления в больших каталогах. Можно изменить количество хэш-контейнеров инодов в системе, чтобы уменьшить количество хэш-конфликтов, возникающих при больших нагрузках по перечислению.
Чтобы увеличить количество хэш-ведер инодов, измените параметры конфигурации загрузки.
С помощью текстового редактора измените
/etc/default/grubфайл.sudo vim /etc/default/grubДобавьте следующий текст в файл
/etc/default/grub. Эта команда задает 128 МБ в качестве размера хэш-таблицы и увеличивает потребление памяти системы не более 128 МБ.GRUB_CMDLINE_LINUX="ihash_entries=16777216"Если
GRUB_CMDLINE_LINUXуже существует, добавьтеihash_entries=16777216, разделенный пробелом, как показано ниже:GRUB_CMDLINE_LINUX="<previous commands> ihash_entries=16777216"Чтобы применить изменения, выполните следующую команду:
sudo update-grub2Перезапустите систему:
sudo rebootЧтобы убедиться, что изменения эффективны после перезагрузки, проверьте команды cmdline ядра:
cat /proc/cmdlineЕсли
ihash_entriesотображается, система применила этот параметр, а производительность перечисления должна повыситься экспоненциально.Вы также можете проверить выходные данные dmesg, чтобы узнать, применена ли строка команд ядра.
dmesg | grep "Inode-cache hash table" Inode-cache hash table entries: 16777216 (order: 15, 134217728 bytes, linear)
Рекомендуемые параметры монтирования
Следующие опции монтирования специфичны для перечисления и могут снизить задержку при работе с большими каталогами.
actimeo
Параметр actimeo монтажа указывает время (в секундах), в течение которого клиент кэширует атрибуты файла или каталога перед запросом сведений об атрибутах с сервера. В течение этого периода изменения, происходящие на сервере, остаются незамеченными до тех пор, пока клиент снова не проверяет сервер. Для клиентов SMB время ожидания кэша атрибутов по умолчанию равно 1 секунде.
На клиентах NFS задание actimeo устанавливает одинаковое значение для всех acregmin, acregmax, acdirmin и acdirmax. Если actimeo он не указан, клиент использует значения по умолчанию для каждого из этих параметров.
При работе с большими каталогами рекомендуется задать actimeo от 30 до 60 секунд. Установка значения в этом диапазоне делает атрибуты действительными в течение длительного периода времени в кэше атрибутов клиента, что позволяет операциям получать атрибуты файла из кэша, а не получать их через провод. Это может снизить задержку в ситуациях, когда срок действия кэшированных атрибутов истекает во время выполнения операции.
На следующем графике сравнивается общее время, необходимое для завершения различных операций при монтировании по умолчанию по сравнению с установкой значения actimeo 30 для рабочей нагрузки с 1 миллионом файлов в одном каталоге. В нашем тестировании общее время завершения сократилось на 77 % для некоторых операций. Все операции были выполнены с ls без алиасов.
NFS nconnect
NFS nconnect — это параметр подключения на стороне клиента для общих папок NFS, который позволяет использовать несколько TCP-подключений между клиентом и общей папкой NFS. Мы рекомендуем оптимальный параметр nconnect=4 для уменьшения задержки и повышения производительности. Функция nconnect может быть особенно полезна для рабочих нагрузок, использующих асинхронные или синхронные операции ввода-вывода из нескольких потоков.
Подробнее.
Команды и операции
Способ указания команд и операций также может повлиять на производительность. Перечисление всех файлов в большом каталоге с помощью ls команды является хорошим примером.
Примечание.
Некоторые операции, такие как рекурсивная ls, find, и du, требуют как имена файлов, так и атрибуты файлов, поэтому они объединяют перечисления каталогов (чтобы получить записи) с вызовом функции stat для каждой записи (чтобы получить атрибуты). Мы рекомендуем использовать более высокое значение для actimeo в точках монтирования, где вы, скорее всего, будете выполнять такие команды.
Использование неоцененных ls
В некоторых дистрибутивах Linux оболочка автоматически задает параметры по умолчанию для ls команды, например ls --color=auto. Это изменяет способ работы ls по сети и добавляет дополнительные операции в выполнение ls. Чтобы избежать снижения производительности, рекомендуется использовать ls без алиасов. Это можно сделать одним из трех способов.
В качестве временного обходного решения, влияющего только на текущий сеанс, можно удалить псевдоним с помощью команды
unalias ls.Для внесения постоянных изменений вы можете изменить псевдоним
lsв файле пользователяbashrc/bash_aliases. В Ubuntu отредактируйте~/.bashrc, чтобы удалить псевдоним дляls.Вместо вызова
lsможно напрямую вызвать двоичныйlsфайл, например/usr/bin/ls. Это позволяет использоватьlsбез каких-либо параметров, которые могут находиться в псевдониме. Расположение двоичного файла можно найти, выполнив командуwhich ls.
Запретить сортировку выходных данных ls
При использовании ls с другими командами можно повысить производительность, предотвратив ls сортировку выходных данных в ситуациях, когда вам не нужно заботиться о порядке, возвращающем ls файлы. Сортировка выходных данных добавляет значительные затраты.
Вместо выполнения ls -l | wc -l чтобы получить общее количество файлов, можно использовать параметры -f или -U с ls, чтобы предотвратить сортировку выходных данных. Разница в том, что -f показывает скрытые файлы, а -U — нет.
Например, если вы вызываете двоичный ls файл в Ubuntu напрямую, вы запустите /usr/bin/ls -1f | wc -l или /usr/bin/ls -1U | wc -l.
На следующей диаграмме сравнивается время, необходимое для вывода результатов с использованием неупорядоченных, несортированных ls и отсортированных ls.
Операции копирования и резервного копирования файлов
При копировании данных из общей папки или выполнении резервного копирования из общих папок в другое расположение, для достижения оптимальной производительности рекомендуется использовать моментальный снимок общего ресурса в качестве источника вместо текущей общей папки с активными операциями ввода-вывода. Приложения резервного копирования должны выполнять команды непосредственно на моментальном снимке. Дополнительные сведения см. в разделе "Использование моментальных снимков общего ресурса" для Azure Files.
Рекомендации на уровне приложения
При разработке приложений, использующих большие каталоги, следуйте этим рекомендациям.
Пропустить атрибуты файла. Если приложению требуется только имя файла, а не атрибуты файла, такие как тип файла или время последнего изменения, можно использовать несколько вызовов системных вызовов, таких как
getdents64с хорошим размером буфера, чтобы получить записи в указанном каталоге без типа файла, что делает операцию быстрее, избегая дополнительных операций, которые не нужны.Перемежайте вызовы статистических функций. Если приложению требуются атрибуты и имя файла, мы рекомендуем чередовать вызовы
getdents64stat вместе с получением каждой записи, вместо того чтобы сначала получать все записи до конца файла с помощьюgetdents64, а затем выполнять statx для всех возвращенных записей. Переключение вызовов статистики указывает клиенту запрашивать как файл, так и его атрибуты одновременно, уменьшая количество вызовов к серверу. При сочетании с высокимactimeoзначением переключение вызовов статистики может значительно повысить производительность. Например, вместо[ getdents64, getdents64, ... , getdents64, statx (entry1), ... , statx(n) ]разместите вызовы statx после каждогоgetdents64, вот так:[ getdents64, (statx, statx, ... , statx), getdents64, (statx, statx, ... , statx), ... ].Увеличьте глубину ввода-вывода. Если это возможно, мы рекомендуем настроить
nconnectненулевое значение (больше 1) и распределить операцию между несколькими потоками или использовать асинхронный ввод-вывод. Это позволяет асинхронным операциям воспользоваться несколькими одновременными подключениями к общей папке.Принудительное использование кэша. Если приложение запрашивает атрибуты файла на общем ресурсе, подключенном только одному клиенту, используйте системный вызов statx с флагом
AT_STATX_DONT_SYNC. Этот флаг гарантирует, что кэшированные атрибуты извлекаются из кэша без синхронизации с сервером, избегая дополнительных обходов по сети, чтобы получить последние данные.