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:
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?