Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приведены рекомендации по работе с каталогами, содержащими большое количество файлов. Обычно рекомендуется уменьшить количество файлов в одном каталоге, разместив файлы по нескольким каталогам. Однако существуют ситуации, в которых нельзя избежать больших каталогов. При работе с большими каталогами в общих папках Azure, подключенных к клиентам Linux, рассмотрите следующие рекомендации.
Применяется к
Тип общей папки | малый и средний бизнес | NFS |
---|---|---|
Стандартные общие папки (GPv2), LRS/ZRS |
![]() |
![]() |
Стандартные общие папки (GPv2), GRS/GZRS |
![]() |
![]() |
Премиальные файловые хранилища (FileStorage), LRS/ZRS |
![]() |
![]() |
Увеличьте количество хэш-контейнеров
Общий объем ОЗУ в системе, выполняющий перечисление, влияет на внутреннюю работу протоколов файловой системы, таких как NFS и SMB. Даже если пользователи не испытывают высокую загрузку памяти, количество доступной памяти влияет на число хэш-ячейк inode в системе, что улучшает производительность перечисления в больших каталогах. Можно изменить количество хэш-контейнеров инодов в системе, чтобы уменьшить количество хэш-конфликтов, возникающих при больших нагрузках по перечислению.
Для этого необходимо изменить параметры конфигурации загрузки, предоставив дополнительную команду ядра, которая вступает в силу во время загрузки, чтобы увеличить количество хэш-контейнеров inode. Выполните следующие действия.
С помощью текстового редактора измените
/etc/default/grub
файл.sudo vim /etc/default/grub
Добавьте следующий текст в файл
/etc/default/grub
. Эта команда выделяет 128 МБ для размера хэш-таблицы inode, увеличивая потребление системной памяти на не более чем 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 без алиасов.
nconnect
Nconnect
— это вариант подключения на стороне клиента для общих папок NFS, который позволяет использовать несколько TCP-подключений между клиентом и службой файлов Azure Premium для NFSv4.1. Мы рекомендуем оптимальный параметр 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
с хорошим размером буфера. Это позволит получить записи в указанном каталоге без типа файла, что делает операцию быстрее, избегая дополнительных операций, которые не нужны.Перемежайте вызовы статистических функций. Если приложению требуются атрибуты и имя файла, мы рекомендуем чередовать вызовы
getdents64
stat вместе с получением каждой записи, вместо того чтобы сначала получать все записи до конца файла с помощью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
. Этот флаг гарантирует, что кэшированные атрибуты извлекаются из кэша без синхронизации с сервером, избегая дополнительных обходов по сети, чтобы получить последние данные.