J'ai installé un serveur NFSv4. Je partage des fichiers avec des machines Linux dans une batterie de machines virtuelles et des machines Windows 7, 8 et 10, je dois donc partager des fichiers avec NFS et Samba 1 . Dans le passé, j'ai fait cela en configurant une machine NFS avec un accès direct au système de fichiers ext4 sous-jacent et en configurant un serveur Samba séparé qui monte les exportations NFS et les partage 2 .

Je voudrais unifier le partage de fichiers sur un seul serveur. De manière critique, je dois être sûr que NFS et Samba ne marchent pas sur les fichiers de l'autre, ignorant parfaitement les verrous. En conséquence, je dois continuer à utiliser Samba au-dessus de NFS et non en parallèle avec NFS.

Cela semble banal. Le serveur NFS doit simplement monter son propre partage, comme l'aurait fait le serveur Samba, puis cette même machine doit exécuter Samba et exporter ce partage monté. La seule différence semble être que le trafic n'a pas besoin de circuler sur le réseau entre deux machines. Je m'attendrais à de meilleures performances.

Au lieu de cela, le serveur NFS sature le CPU de la machine en ne donnant que 2,5 Mo/s de performances !

top - 11:34:57 up 15 days,  1:18,  1 user,  load average: 32.09, 8.07, 2.74
Tasks: 101 total,  13 running,  88 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.6 us, 93.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem :   899776 total,   124840 free,   184624 used,   590312 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   261184 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
11058 root      20   0       0      0      0 R 11.5  0.0   5:53.84 nfsd
11061 root      20   0       0      0      0 R 11.5  0.0   5:53.88 nfsd
11057 root      20   0       0      0      0 R 11.2  0.0   5:53.72 nfsd
11059 root      20   0       0      0      0 R 11.2  0.0   5:53.78 nfsd
11060 root      20   0       0      0      0 R 11.2  0.0   5:53.80 nfsd
11062 root      20   0       0      0      0 R 11.2  0.0   5:53.86 nfsd
11064 root      20   0       0      0      0 R 11.2  0.0   9:23.40 nfsd
11063 root      20   0       0      0      0 R 10.9  0.0   6:00.00 nfsd

Le seul autre signe que je sache que quelque chose ne va pas est que d'innombrables lignes sont écrites dans /var/log/messages qui ressemblent plus ou moins à ça.

Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db7bbae000
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 5
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9615 slot_seqid 9614
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88db7b529080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db7bbaf000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 1
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9626 slot_seqid 9625
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88db7b529080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606f080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88db291eb000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 2
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9614 slot_seqid 9613
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606f080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac507e080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac507e080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #4: 9: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound returned 0
Apr 25 11:35:01 nas kernel: --> nfsd4_store_cache_entry slot ffff88dbf65cc000
Apr 25 11:35:01 nas kernel: nfsd_dispatch: vers 4 proc 1
Apr 25 11:35:01 nas kernel: nfsv4 compound op #1/4: 53 (OP_SEQUENCE)
Apr 25 11:35:01 nas kernel: __find_in_sessionid_hashtbl: 1555688119:2835816624:106:0
Apr 25 11:35:01 nas kernel: nfsd4_sequence: slotid 4
Apr 25 11:35:01 nas kernel: check_slot_seqid enter. seqid 9584 slot_seqid 9583
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dac5072080 opcnt 4 #1: 53: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #2/4: 22 (OP_PUTFH)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #2: 22: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #3/4: 38 (OP_WRITE)
Apr 25 11:35:01 nas kernel: nfsd: write complete host_err=131072
Apr 25 11:35:01 nas kernel: nfsv4 compound op ffff88dbf606a080 opcnt 4 #3: 38: status 0
Apr 25 11:35:01 nas kernel: nfsv4 compound op #4/4: 9 (OP_GETATTR)
Apr 25 11:35:01 nas kernel: nfsd: fh_verify(36: 01070001 00060001 00000000 9509b6fe 7a49ad56 5a4d5dbc)

Je ne monte pas les partages NFS localement via 127.0.0.1. Le montage NFS local utilise l'adresse IP privée de la machine elle-même. Je pourrais changer cela, mais cela nécessiterait une complexité supplémentaire dans la définition des exportations NFS, et je préférerais en fait que cette machine se voit exactement de la même manière que les autres machines qui monteront les partages NFS 3 .

Notes de bas de page

  1. Je connais des façons d'utiliser les clients NFS sur Windows et les clients Samba sur Linux. De telles options ne sont pas réalisables dans ce cas.
  2. Je suis au courant des avertissements concernant la réexportation des partages NFS avec Samba, mais moi et de nombreux autres administrateurs système que je connais le faisons régulièrement sans problème. Le problème semble s'être posé ici plutôt parce que le serveur NFS monte son propre partage. Néanmoins, je suis curieux de connaître les raisons exactes de ces avertissements, donc si vous le savez, partagez-les.
  3. Si quelqu'un a une raison pour laquelle toute cette architecture est fondamentalement défectueuse, je suis ouvert à l'entendre. J'ai des années d'expérience au service de Samba en plus de NFS en utilisant deux machines, j'ai donc supposé que je pouvais couper la machine Samba et déplacer Samba vers la machine serveur NFS avec un auto-montage NFS.
answer

Il est très probable que votre charge de travail meurt d'une mort programmée. Vous demandez une tonne de commutateurs de contexte sur le même système lors de l'exportation d'un système de fichiers vers lui-même, puis de l'exportation à nouveau de cette exportation.

Vous pouvez constater que la répartition de cette charge de travail sur plusieurs noyaux (noyaux qui ne partagent pas le même cœur de processeur) entraîne une augmentation des performances, malgré l'implication d'un lien réseau entre ces systèmes.

Cela pourrait facilement être accompli avec un ensemble de machines virtuelles colocalisées ; un exécutant NFS, un exécutant Samba. Les colocaliser sur le même hyperviseur devrait éliminer la plupart des latences du réseau et devrait bien fonctionner à condition que ces machines virtuelles ne partagent pas les mêmes cœurs de processeur.

Il existe également des implémentations en espace utilisateur pour NFS - NFS Ganesha étant très courant. Cependant, Samba sera également responsable d'une quantité non négligeable de cette commutation répétitive entre l'espace utilisateur et le noyau. NFS Ganesha peut valoir la peine d'être testé si ces charges de travail doivent absolument partager un noyau pour une raison quelconque.

En bref, réduire le changement de contexte au sein d'un même système devrait y contribuer de manière significative.