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

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

NFS read-ahead previsivelmente solicita blocos de um arquivo antes de solicitações de E/S pelo aplicativo. Ele foi projetado para melhorar a taxa de transferência de leitura sequencial do cliente. Até recentemente, todas as distribuições Linux modernas definiam o valor de leitura antecipada como equivalente a 15 vezes os sistemas rsizede arquivos montados.

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

Sistema de arquivos montado rsize Bloqueia a leitura antecipada
64 KiB 960 KiB
256 KiB 3.840 KiB
1.024 KiB 15.360 KiB

O RHEL 8.3 e o Ubuntu 18.04 introduziram alterações que podem afetar negativamente o desempenho de leitura sequencial do cliente. Ao contrário das versões anteriores, essas distribuições definem read-ahead para um padrão de 128 KiB, independentemente da rsize opção de montagem usada. A atualização de versões com o maior valor de leitura antecipada para versões com o padrão de 128 KiB sofreu reduções no desempenho de leitura sequencial. No entanto, os valores de leitura antecipada podem ser ajustados para cima de forma dinâmica e persistente. Por exemplo, o teste com SAS GRID encontrou o valor de leitura de 15.360 KiB ideal em comparação com 3.840 KiB, 960 KiB e 128 KiB. Não foram realizados testes suficientes para além dos 15.360 KiB para determinar o impacto positivo ou negativo.

A tabela a seguir mostra os valores de leitura antecipada padrão para 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 o sistema de arquivos por NFS read-ahead

A leitura antecipada do NFS é definida no ponto de montagem de um sistema de arquivos NFS. A configuração padrão pode ser visualizada e definida de forma dinâmica e persistente. Por conveniência, o seguinte script bash escrito pela Red Hat é fornecido para visualização ou configuração dinâmica de leitura antecipada para um sistema de arquivos NFS montado.

A leitura antecipada pode ser definida dinamicamente por montagem NFS usando o script a seguir ou persistentemente usando udev regras, conforme mostrado nesta seção. Para exibir ou definir read-ahead para um sistema de arquivos NFS montado, você pode salvar o script a seguir como um arquivo bash, modificar as permissões do arquivo para torná-lo um executável (chmod 544 readahead.sh) e executar conforme mostrado.

Como mostrar ou definir 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 read-ahead, 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 persistentemente o read-ahead para montagens NFS

Para definir persistentemente o read-ahead para montagens NFS, udev as regras 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 udev regra:

       sudo udevadm control --reload
    

Próximos passos