NFS performances d'écriture médiocres

20

J'ai deux machines connectées avec Ethernet 10Gbit. Laissez l'un d'eux être un serveur NFS et un autre sera un client NF.

Tester la vitesse du réseau sur TCP avec un iperfdébit ~ 9,8 Gbit / s dans les deux sens, le réseau est donc OK.

Test des performances du disque du serveur NFS:

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

Le résultat est ~ 150 Mo / s, donc le disque fonctionne bien pour l'écriture.

Le serveur /etc/exportsest:

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

Le client monte ce partage sur son emplacement local /mnt/testavec les options suivantes:

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)

Si j'essaie de télécharger un fichier volumineux (~ 5 Go) sur la machine cliente à partir du partage NFS, j'obtiens des performances de ~ 130 à 140 Mo / s qui sont proches des performances du disque local du serveur, donc c'est satisfaisant.

Mais lorsque j'essaie de télécharger un fichier volumineux sur le partage NFS, le téléchargement commence à ~ 1,5 Mo / s, augmente lentement jusqu'à 18-20 Mo / s et cesse d'augmenter. Parfois, le partage "se bloque" pendant quelques minutes avant le début du téléchargement, c'est-à-dire que le trafic entre les hôtes devient proche de zéro et si j'exécute ls /mnt/test, il ne revient pas pendant une minute ou deux. Ensuite, la lscommande revient et le téléchargement commence à sa vitesse initiale de 1,5 Mbit / s.

Lorsque la vitesse de téléchargement atteint son maximum (18-20 Mo / s), je cours iptraf-nget cela montre un trafic de ~ 190 Mbit / s sur l'interface réseau, donc le réseau n'est pas un goulot d'étranglement ici, ainsi que le disque dur du serveur.

Ce que j'ai essayé:

1. Configurez un serveur NFS sur un troisième hôte qui était connecté uniquement avec une carte réseau Ethernet 100 Mbits. Les résultats sont analogiques: DL affiche de bonnes performances et une utilisation presque complète du réseau à 100 Mbit, le téléchargement ne fonctionne pas plus rapidement que des centaines de kilo-octets par seconde, ce qui laisse une utilisation du réseau très faible (2,5 Mbit / s selon iptraf-ng).

2. J'ai essayé de régler certains paramètres NFS:

  • sync ou async

  • noatime

  • non hard

  • rsizeet wsizesont maximales dans mes exemples, j'ai donc essayé de les diminuer en plusieurs étapes jusqu'à 8192

3. J'ai essayé de changer de machine client et serveur (configurer le serveur NFS sur l'ancien client et vice versa). De plus, il y a six autres serveurs avec la même configuration, j'ai donc essayé de les monter les uns aux autres dans différentes variantes. Même résultat.

4. MTU = 9000, MTU = 9000 et agrégation de liens 802.3ad, agrégation de liens avec MTU = 1500.

5. réglage 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

Même résultat.

6. Montez depuis l'hôte local:

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/

Et ici, j'obtiens le même résultat: le téléchargement depuis /mnt/testmount/est rapide, le téléchargement vers /mnt/testmount/est très lent, pas plus rapide que 22 Mo / s et il y a un petit délai avant que le transfert ne commence réellement. Cela signifie-t-il que la pile réseau fonctionne parfaitement et que le problème est dans NFS?

Tout cela n'a pas aidé, les résultats ne différaient pas de manière significative de la configuration par défaut. echo 3 > /proc/sys/vm/drop_cachesa été exécuté avant tous les tests.

MTU de tous les NICS sur les 3 hôtes est de 1500, aucun réglage de réseau non standard effectué. Le commutateur Ethernet est Dell MXL 10 / 40Gbe.

Le système d'exploitation est 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

Quels sont les paramètres qui me manquent? Comment faire écrire NFS rapidement et sans blocages?

Sergey
la source
1
Vous avez un cas de test assez complet, mais j'essaierais de monter sur le serveur lui-même et d'écrire à partir de là, de cette façon, vous pouvez déterminer si la pile NFS ou la pile réseau est en faute. Essayez également de commuter le serveur et le client (exportation à partir du client, montage sur le serveur) et également, en utilisant un client différent. stracing les processus serveur / client n'a rien révélé?
Dalibor Karlović
@ DaliborKarlović J'ai tout essayé sauf Strace et j'ai ajouté des informations à la question. Le montage à partir de l'hôte local fonctionne lentement, donc la pile et le commutateur réseau ne semblent pas être en faute. J'utilise NFS dans l'espace noyau et Operation not permittedj'essaie de joindre une strace au processus NFS.
Sergey
Je suppose que cela signifie que vous pouvez exclure complètement la pile réseau (mais vous devez y attacher une strace pour vous en assurer). Vous devriez être en mesure de suivre n'importe quel processus en tant qu'utilisateur root s'il n'est pas atteint par un certain bug .
Dalibor Karlović
@ DaliborKarlović J'essaie sûrement strace en tant que root. Je peux me connecter à n'importe quel processus de l'espace utilisateur, mais pas à celui de l'espace noyau. Mais quelles informations puis-je obtenir de sa sortie? Je suppose que cela produira des centaines de milliers de lignes de sortie si je l'attache à NFS et commence à télécharger. Dois-je faire attention aux valeurs de retour non nulles?
Sergey
Vous avez raison, je ne pensais pas que ce soit un processus sans espace utilisateur. Je m'attendrais à voir ce qu'il faisait pendant qu'il "se bloque" au début du transfert, cela pourrait être quelque chose de trivial comme une recherche DNS inversée mal configurée.
Dalibor Karlović

Réponses:

3

Vous utilisez l'option de synchronisation dans votre déclaration d'exportation. Cela signifie que le serveur ne confirme les opérations d'écriture qu'une fois qu'elles ont été réellement écrites sur le disque. Étant donné que vous avez un disque en rotation (c'est-à-dire pas de SSD), cela nécessite en moyenne au moins 1/2 tour du disque par opération d'écriture, ce qui est la cause du ralentissement.

À l'aide du paramètre asynchrone, le serveur reconnaît immédiatement l'opération d'écriture sur le client lorsqu'elle est traitée mais pas encore écrite sur le disque. C'est un peu plus peu fiable, par exemple, en cas de panne de courant lorsque le client a reçu un accusé de réception pour une opération qui ne s'est pas produite. Cependant, il offre une énorme augmentation des performances d'écriture.

(modifier) ​​Je viens de voir que vous avez déjà testé les options async vs sync. Cependant, je suis presque sûr que c'est la cause de votre problème de dégradation des performances - j'ai eu une fois exactement la même indication avec une configuration idencitcal. Peut-être que vous le testez à nouveau. Avez-vous donné l'option async lors de l'instruction d'exportation du serveur ET dans l'opération de montage sur le client en même temps?

Bernd Gloss
la source
+1 L'explication la plus probable est que la synchronisation n'a pas été correctement désactivée.
David Schwartz
2

Cela peut être un problème lié à la taille et à la latence des paquets. Essayez ce qui suit:

Le rapport renvoie vos résultats.

shodanshok
la source
J'ai essayé des trames jumbo avec MTU = 9000, mais les résultats étaient les mêmes. J'ai également essayé l'agrégation de liens avec 802.3ad, encore une fois aucun changement. J'ai donc rétabli tous ces paramètres pour me rapprocher le plus possible de l'état par défaut. J'ai également essayé de régler cela net.core.*et de net.ipv4.*sysctls, mais j'ai peut-être fait trop peu d'expériences. OK, je ferai quelques tests supplémentaires et je ferai rapport.
Sergey
J'ai essayé une fois de plus de régler les sysctls sur le serveur et le client, mais cela n'a pas aidé.
Sergey
Avez-vous essayé avec UDP comme protocole de transport?
shodanshok
J'ai essayé UDP (proto = udp dans les options de montage), mais cela fonctionne même 1 à 2 Mo / s plus lentement que TCP. Le résultat a été le même montage de l'hôte local et de l'hôte distant.
Sergey
2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

La configuration du planificateur Linux sur des systèmes avec RAID matériel et la modification de la valeur par défaut de [cfq] à [noop] donne des améliorations d'E / S.

Utilisez la commande nfsstat pour calculer le pourcentage de lectures / écritures. Définissez le rapport de cache du contrôleur RAID pour qu'il corresponde.

Pour les charges de travail lourdes, vous devrez augmenter le nombre de threads de serveur NFS.

Configurez les threads nfs pour écrire sans délai sur le disque à l'aide de l'option no_delay.

Dites au noyau Linux de vider le plus rapidement possible afin que les écritures soient aussi petites que possible. Dans le noyau Linux, la fréquence d'écriture différée des pages sales peut être contrôlée par deux paramètres.

Pour des écritures de disque plus rapides, utilisez l'option filesystem data = journal et empêchez les mises à jour des temps d'accès aux fichiers, ce qui entraîne en soi des données supplémentaires écrites sur le disque. Ce mode est le plus rapide lorsque les données doivent être lues et écrites sur le disque en même temps où elles surpassent tous les autres modes

Vasco V.
la source