J'ai deux machines connectées avec Ethernet 10Gbit. Laissez l'un d'entre eux être un serveur NFS et un autre sera un client NF.
Le test de la vitesse du réseau sur TCP avec iperf
affiche un débit de ~ 9,8 Gbit/s dans les deux directions, donc le réseau est 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.
Les serveurs /etc/exports
est:
/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)
Le client monte ce partage sur son local /mnt/test
avec 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, c'est donc 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. La commande ls
revient et le téléchargement démarre à sa vitesse initiale de 1,5 Mbit/s.
Lorsque la vitesse de téléchargement atteint son maximum (18-20 Mo/s), je lance iptraf-ng
et il affiche ~ 190 Mbit/s de trafic 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 montre 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
rsize
et wsize
sont maximales dans mes exemples, j'ai donc essayé de les diminuer en plusieurs étapes jusqu'à 8192
. 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. Monter 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 là, j'obtiens le même résultat: téléchargement depuis /mnt/testmount/
est rapide, téléchargez 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 démarre 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_caches
a é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?
Vous utilisez l'option sync 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 asynchrone à l'instruction d'exportation du serveur ET dans l'opération de montage sur le client en même temps?
Il peut s'agir d'un problème lié à la taille des paquets et à la latence. Essayez ce qui suit:
Le rapport renvoie vos résultats.
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