Ho due macchine collegate con Ethernet 10Gbit. Lascia che uno di questi sia il server NFS e un altro sarà il client NF.
Test della velocità della rete su TCP con una velocità effettiva di iperf
~ 9,8 Gbit / s in entrambe le direzioni, quindi la rete è OK.
Test delle prestazioni del disco del server NFS:
dd if=/dev/zero of=/mnt/test/rnd2 count=1000000
Il risultato è ~ 150 MBytes / s, quindi il disco funziona bene per la scrittura.
Il server /etc/exports
è:
/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)
Il client monta questa condivisione sul locale /mnt/test
con le seguenti opzioni:
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 provo a scaricare un file di grandi dimensioni (~ 5Gb) sul computer client dalla condivisione NFS, ottengo prestazioni ~ 130-140 MBytes / s che si avvicinano alle prestazioni del disco locale del server, quindi sono soddisfacenti.
Ma quando provo a caricare un file di grandi dimensioni nella condivisione NFS, il caricamento inizia a ~ 1,5 Mbyte / s, aumenta lentamente fino a 18-20 Mbyte / se smette di aumentare. A volte la condivisione "si blocca" per un paio di minuti prima che il caricamento inizi effettivamente, ovvero il traffico tra gli host si avvicina allo zero e se eseguo ls /mnt/test
, non ritorna durante un minuto o due. Quindi il ls
comando ritorna e il caricamento inizia alla velocità iniziale di 1,5 Mbit / s.
Quando la velocità di upload raggiunge il massimo (18-20 Mbyte / s), corro iptraf-ng
e mostra ~ 190 Mbit / s di traffico sull'interfaccia di rete, quindi la rete non è un collo di bottiglia qui, così come l'HDD del server.
Cosa ho provato:
1.
Configurare un server NFS su un terzo host collegato solo con una scheda NIC Ethernet a 100 Mbit. I risultati sono analogici: DL mostra buone prestazioni e un utilizzo della rete quasi pieno a 100 Mbit, il caricamento non ha prestazioni superiori a centinaia di kilobyte al secondo, lasciando l'utilizzo della rete molto basso (2,5 Mbit / s secondo iptraf-ng
).
2. Ho provato a mettere a punto alcuni parametri NFS:
sync
oasync
noatime
no
hard
rsize
ewsize
sono massimi nei miei esempi, quindi ho cercato di ridurli in diversi passaggi fino a 8192
3. Ho provato a cambiare macchine client e server (impostare il server NFS sul client precedente e viceversa). Inoltre, ci sono altri sei server con la stessa configurazione, quindi ho provato a montarli tra loro in diverse varianti. Stesso risultato
4. MTU = 9000, MTU = 9000 e aggregazione dei collegamenti 802.3ad, aggregazione dei collegamenti con MTU = 1500.
5. sintonia 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
Stesso risultato
6. Montare da 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 qui ottengo lo stesso risultato: il download da /mnt/testmount/
è veloce, il caricamento su /mnt/testmount/
è molto lento, non più veloce di 22 MByte / se c'è un piccolo ritardo prima dell'inizio effettivo del trasferimento. Significa che lo stack di rete funziona perfettamente e il problema è in NFS?
Tutto ciò non ha aiutato, i risultati non differivano significativamente dalla configurazione predefinita. echo 3 > /proc/sys/vm/drop_caches
è stato eseguito prima di tutti i test.
L'MTU di tutti i NICS su tutti e 3 gli host è 1500, nessuna sintonizzazione di rete non standard eseguita. Lo switch Ethernet è Dell MXL 10 / 40Gbe.
Il sistema operativo è 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
Quali impostazioni mi mancano? Come far scrivere NFS in modo rapido e senza blocchi?
Operation not permitted
tento di collegare la strace al processo NFS.