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


Рекомендации по упреждающему чтению Linux NFS для Azure NetApp Files

В этой статье приведены рекомендации по кэшированию файловых систем для Azure NetApp Files.

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

В следующей таблице приведены значения упреждающего чтения по умолчанию для каждого заданного параметра подключения rsize.

Подключенная файловая система rsize Упреждающее чтение блоков
64 КиБ 960 КиБ
256 КиБ 3840 КиБ
1024 КиБ 15 360 КиБ

В RHEL 8.3 и Ubuntu 18.04 появились изменения, которые могут негативно сказаться на производительности последовательного чтения на клиенте. В отличие от более ранних выпусков, в этих дистрибутивах для упреждающего чтения задано значение по умолчанию 128 КиБ, независимо от используемого параметра подключения rsize. Обновление с выпусков с более высоким значением упреждающего чтения до выпусков со значением по умолчанию 128 КиБ приводит к снижению скорости последовательного чтения. Однако значения упреждающего чтения могут увеличиваться как динамически, так и постоянно. Например, при тестировании с помощью SAS GRID было обнаружено, что значение упреждающего чтения, равное 15 360 КиБ, является более оптимальным по сравнению со значениями 3840, 960 и 128 КиБ. Для определения положительного или отрицательного воздействия при значении 15 360 КиБ было проведено недостаточных тестов.

В следующей таблице приведены значения упреждающего чтения по умолчанию для каждого из доступных распределений.

Распределение Выпуск Упреждающее чтение блоков
RHEL 8.3 128 КиБ
RHEL 7 x, 8.0, 8.1, 8.2 15.x rsize
SLES 12.x — по крайней мере 15SP2 15.x rsize
Ubuntu 18.04 — по крайней мере 20.04 128 КиБ
Ubuntu 16.04 15.x rsize
Debian Не менее 10 15.x rsize

Как работать с упреждающим чтением файловой системы для каждой NFS

Упреждающее чтение NFS определено в точке подключения файловой системы NFS. Параметр по умолчанию можно просмотреть и задать как динамически, так и постоянно. Для удобства приведенный ниже скрипт Bash, написанный Red Hat, был предоставлен для просмотра или динамического задания упреждающего чтения для подключенной файловой системы NFS.

Упреждающее чтение можно определить динамически на каждое подключение NFS с помощью следующего скрипта или постоянно, используя правила udev, как показано в этом разделе. Чтобы отобразить или задать упреждающее чтение для подключенной файловой системы NFS, можно сохранить следующий скрипт как файл Bash, изменить разрешения файла, чтобы сделать его исполняемым (chmod 544 readahead.sh) и запустить, как показано ниже.

Как отобразить или задать значения упреждающего чтения

Чтобы отобразить текущее значение упреждающего чтения (возвращаемое значение указано в КиБ), выполните следующую команду:

   ./readahead.sh show <mount-point>

Чтобы задать новое значение для упреждающего чтения, выполните следующую команду:

./readahead.sh set <mount-point> [read-ahead-kb]

Пример

#!/bin/bash
# set | show readahead for a specific mount point
# Useful for things like NFS and if you do not know / care about the backing device
#
# To the extent possible under law, Red Hat, Inc. has dedicated all copyright
# to this software to the public domain worldwide, pursuant to the
# CC0 Public Domain Dedication. This software is distributed without any warranty.
# For more information, see the [CC0 1.0 Public Domain Dedication](http://creativecommons.org/publicdomain/zero/1.0/).

E_BADARGS=22
function myusage() {
echo "Usage: `basename $0` set|show <mount-point> [read-ahead-kb]"
}

if [ $# -gt 3 -o $# -lt 2 ]; then
   myusage
   exit $E_BADARGS
fi

MNT=${2%/}
BDEV=$(grep $MNT /proc/self/mountinfo | awk '{ print $3 }')

if [ $# -eq 3 -a $1 == "set" ]; then
   echo $3 > /sys/class/bdi/$BDEV/read_ahead_kb
elif [ $# -eq 2 -a $1 == "show" ]; then
   echo "$MNT $BDEV /sys/class/bdi/$BDEV/read_ahead_kb = "$(cat /sys/class/bdi/$BDEV/read_ahead_kb)
else
   myusage
   exit $E_BADARGS
fi

Задание постоянного упреждающего чтения для подключений NFS

Чтобы задать постоянное упреждающее чтение для подключений NFS, правила udev можно записать следующим образом:

  1. Создайте и протестируйте /etc/udev/rules.d/99-nfs.rules:

        SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="<absolute_path>/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15380"
    
  2. Примените правило udev:

       sudo udevadm control --reload
    

Следующие шаги