Поделиться через


Оптимизация производительности общей папки при доступе к большим каталогам из клиентов Linux

В этой статье приведены рекомендации по работе с каталогами, содержащими большое количество файлов. Обычно рекомендуется уменьшить количество файлов в одном каталоге, разместив файлы по нескольким каталогам. Однако существуют ситуации, в которых нельзя избежать больших каталогов. При работе с большими каталогами в общих папках Azure, подключенных к клиентам Linux, рассмотрите следующие рекомендации.

Применяется к

Тип общей папки малый и средний бизнес NFS
Стандартные общие папки (GPv2), LRS/ZRS Да, эта статья относится к стандартным общим папкам SMB Azure LRS/ZRS. Общие папки NFS доступны только в общих папках Azure уровня
Стандартные общие папки (GPv2), GRS/GZRS Да, эта статья относится к стандартным общим папкам SMB Azure GRS/GZRS. NFS доступен только в общих папках Azure уровня
Премиальные файловые хранилища (FileStorage), LRS/ZRS Да, эта статья относится к общим папкам Azure SMB уровня Да, эта статья относится к NFS-файловым ресурсам Azure премиум-класса.

Увеличьте количество хэш-контейнеров

Общий объем ОЗУ в системе, выполняющий перечисление, влияет на внутреннюю работу протоколов файловой системы, таких как NFS и SMB. Даже если пользователи не испытывают высокую загрузку памяти, количество доступной памяти влияет на число хэш-ячейк inode в системе, что улучшает производительность перечисления в больших каталогах. Можно изменить количество хэш-контейнеров инодов в системе, чтобы уменьшить количество хэш-конфликтов, возникающих при больших нагрузках по перечислению.

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

  1. С помощью текстового редактора измените /etc/default/grub файл.

    sudo vim /etc/default/grub
    
  2. Добавьте следующий текст в файл /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"
    
  3. Чтобы применить изменения, выполните следующую команду:

    sudo update-grub2
    
  4. Перезапустите систему:

    sudo reboot
    
  5. Чтобы убедиться, что изменения вступили в силу, после перезагрузки системы проверьте команды 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 без алиасов.

График сравнения времени завершения различных операций при подключении по умолчанию и установке значения actimeo 30 для нагрузки из 1 миллиона файлов.

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.

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

См. также