Práticas recomendadas de leitura antecipada do NFS do Linux para o Azure NetApp Files

Este artigo ajuda você a entender as práticas recomendadas para o cache do sistema de arquivos do Azure NetApp Files.

A leitura antecipada do NFS solicita preditivamente os blocos de um arquivo antes que o aplicativo faça solicitações de E/S. Ela foi projetada para aprimorar a taxa de transferência de leitura sequencial do cliente. Até recentemente, todas as distribuições modernas do Linux definiam o valor de leitura antecipada como equivalente a 15 vezes o valor dos sistemas de arquivos rsize montados.

A tabela a seguir mostra os valores padrão de leitura antecipada de cada opção de montagem de rsize fornecida.

rsize do sistema de arquivos montado Bloqueia a leitura antecipada
64 KiB 960 KiB
256 KiB 3.840 KiB
1024 KiB 15.360 KiB

O RHEL 8.3 e o Ubuntu 18.04 introduziram alterações que podem prejudicar o desempenho da leitura sequencial do cliente. Ao contrário das versões anteriores, essas distribuições configuram a leitura antecipada com o padrão de 128 KiB, independentemente da opção de montagem de rsize usada. Na atualização de versões com um valor de leitura antecipada superior ao padrão de 128 KiB houve uma diminuição do desempenho da leitura sequencial. No entanto, os valores de leitura antecipada podem ser aumentados de modo dinâmico ou persistente. Por exemplo, o teste com SAS GRID encontrou o valor de leitura ideal de 15.360 KiB em comparação com 3.840 KiB, 960 KiB e 128 KiB. Não foram executados testes suficientes além de 15.360 KiB para determinar o impacto positivo ou negativo.

A tabela a seguir mostra os valores padrão de leitura antecipada de cada distribuição disponível no momento.

Distribuição Versão Bloqueia a leitura antecipada
RHEL 8.3 128 KiB
RHEL 7.X, 8.0, 8.1, 8.2 15 x rsize
SLES 12.X – Pelo menos 15SP2 15 x rsize
Ubuntu 18.04 – Pelo menos 20.04 128 KiB
Ubuntu 16.04 15 x rsize
Debian Até pelo menos 10 15 x rsize

Como trabalhar com a leitura antecipada do sistema de arquivos por NFS

A leitura antecipada do NFS é definida no ponto de montagem de um sistema de arquivos NFS. A configuração padrão pode ser exibida e definida de modo dinâmico e persistente. Para sua conveniência, o script do Bash a seguir escrito pelo Red Hat foi fornecido para exibição ou configuração dinâmica da leitura antecipada para o sistema de arquivos NFS.

A leitura antecipada pode ser definida de modo dinâmico por montagem do NFS usando o script a seguir ou de modo persistente usando regras de udev, como é mostrado nesta seção. Para exibir ou definir a leitura dinâmica de um sistema de arquivos NFS montado, você pode salvar o script a seguir como um arquivo Bash, modificar as permissões do arquivo para transformá-lo em executável (chmod 544 readahead.sh) e executá-lo como é mostrado.

Como mostrar ou definir os valores de leitura antecipada

Para mostrar o valor de leitura antecipada atual (o valor retornado está em KiB), execute o seguinte comando:

   ./readahead.sh show <mount-point>

Para definir um novo valor para a leitura antecipada, execute o seguinte comando:

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

Exemplo

#!/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

Como definir a leitura antecipada de modo persistente para montagens do NFS

Para definir a leitura antecipada persistente para montagens do NFS, as regras de udev podem ser escritas da seguinte maneira:

  1. Criar e testar /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. Aplicar a regra de udev:

       sudo udevadm control --reload
    

Próximas etapas