NFS desempenho de gravação ruim

18

Eu tenho duas máquinas conectadas com 10Gbit Ethernet. Deixe um deles ser servidor NFS e outro será cliente NFs.

Testar a velocidade da rede por TCP com iperf mostra uma taxa de transferência de 9,8 Gbit / s em ambas as direções, de modo que a rede está OK.

Testando o desempenho do disco do servidor NFS:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

O resultado é ~ 150 MBytes / s, então o disco funciona bem para escrever.

O /etc/exports do servidor é:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

O cliente monta esse compartilhamento no seu local /mnt/test com as seguintes opções:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

Se eu tentar baixar um arquivo grande (~ 5Gb) na máquina cliente do compartilhamento NFS, obtenho um desempenho de ~ 130-140 MBytes / s que é próximo ao desempenho do disco local do servidor, portanto, é satisfatório.

Mas quando tento carregar um arquivo grande para o compartilhamento NFS, o upload começa em ~ 1,5 Mbytes / s, aumenta lentamente até 18-20 Mbytes / se para de aumentar. Às vezes, o compartilhamento "trava" por alguns minutos antes que o upload seja realmente iniciado, ou seja, o tráfego entre hosts fica próximo de zero e, se eu executar ls /mnt/test , ele não retorna durante um minuto ou dois. Então, o comando ls retorna e o upload começa na velocidade inicial de 1,5 Mbit / s.

Quando a velocidade de upload atinge o máximo (18-20 Mbytes / s), eu corro iptraf-ng e mostra ~ 190 Mbit / s de tráfego na interface de rede, então a rede não é um gargalo aqui, assim como o HDD do servidor .

O que eu tentei:

1. Configure um servidor NFS em um terceiro host conectado apenas a uma NIC Ethernet de 100 Mbit. Os resultados são analógicos: o DL mostra um bom desempenho e uma utilização quase total de 100Mbit, o upload não funciona mais rápido que centenas de kilobytes por segundo, deixando a utilização da rede muito baixa (2.5 Mbit / s de acordo com iptraf-ng ).

2. Tentei ajustar alguns parâmetros do NFS:

  • sync ou async

  • noatime

  • não hard

  • rsize e wsize são máximos em meus exemplos, então tentei diminuí-los em várias etapas até 8192

3. Eu tentei mudar de máquina cliente e servidor (configure o servidor NFS no antigo cliente e vice-versa). Além disso, existem mais seis servidores com a mesma configuração, então eu tentei montá-los uns aos outros em diferentes variações. O mesmo resultado.

4. MTU = 9000, MTU = agregação de link 9000 e 802.3ad, agregação de link com MTU = 1500.

5. ajuste de sysctl:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

O mesmo resultado.

6. Montar de localhost:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

E aqui obtenho o mesmo resultado: o download de /mnt/testmount/ é rápido, o upload para /mnt/testmount/ é muito lento, não é mais rápido que 22 MBytes / se há um pequeno atraso antes que a transferência seja realmente iniciada. Isso significa que a pilha de rede funciona perfeitamente e o problema está no NFS?

Tudo isso não ajudou, os resultados não diferiram significativamente da configuração padrão. echo 3 > /proc/sys/vm/drop_caches foi executado antes de todos os testes.

O MTU de todos os NICS em todos os três hosts é de 1.500, sem a execução de um ajuste de rede não padrão. O comutador Ethernet é Dell MXL 10 / 40Gbe.

OS é o CentOS 7.

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Quais configurações estou faltando? Como fazer o NFS escrever rapidamente e sem travar?

    
por Sergey 11.04.2015 / 11:53

3 respostas

2

Pode ser um problema relacionado ao tamanho e latência do pacote. Tente o seguinte:

O relatório retorna seus resultados.

    
por 11.04.2015 / 12:54
2

Você usa a opção sync em sua declaração de exportação. Isso significa que o servidor somente confirma as operações de gravação depois que elas são realmente gravadas no disco. Dado que você tem um disco giratório (ou seja, sem SSD), isso requer, em média, pelo menos 1/2 revolução do disco por operação de gravação, que é a causa da lentidão.

Usando a configuração assíncrona, o servidor confirma imediatamente a operação de gravação para o cliente quando ele é processado, mas ainda não foi gravado no disco. Isso é um pouco mais confiável, por exemplo, no caso de uma falha de energia, quando o cliente recebe uma confirmação para uma operação que não aconteceu. No entanto, ele oferece um grande aumento no desempenho de gravação.

(edit) Acabei de ver que você já testou as opções async vs sync. No entanto, tenho quase certeza de que esta é a causa do seu problema de degradação do desempenho - uma vez eu tive exatamente a mesma indicação com uma configuração idencitcal. Talvez você teste novamente. Você deu a opção async na instrução de exportação do servidor E na operação de montagem no cliente ao mesmo tempo?

    
por 17.08.2015 / 11:27
1

link

Configurar o planejador do Linux em sistemas com RAID de hardware e alterar o padrão de [cfq] para [noop] fornece melhorias de E / S.

Use o comando nfsstat para calcular a porcentagem de leituras / gravações. Defina a taxa de cache do controlador RAID para corresponder.

Para cargas de trabalho pesadas, você precisará aumentar o número de threads do servidor NFS.

Configure os threads do nfs para gravar sem atraso no disco usando a opção no_delay.

Diga ao kernel do Linux para liberar o mais rápido possível para que as gravações sejam mantidas o menor possível. No kernel do Linux, a frequência de write-back de páginas sujas pode ser controlada por dois parâmetros.

Para gravações de disco mais rápidas, use a opção data = journal do sistema de arquivos e evite atualizações nos horários de acesso aos arquivos, o que, por si só, resulta em dados adicionais gravados no disco. Este modo é o mais rápido quando os dados precisam ser lidos e gravados no disco ao mesmo tempo em que supera todos os outros modos

    
por 19.04.2015 / 05:47