Forum Linux.debian/ubuntu Problème de transfert NFS - Comment limiter les IO d'un processus

Posté par (page perso) . Licence CC by-sa
1
31
jan.
2014

Bonjour à tous,

Je rencontre depuis la mise en place de mes VMs, un problème récurent sur le transfert de gros fichiers.
Mon architecture est la suivante (basée sur une debian 7 avec des VM sous xen) :
HOST
- vm DATA (serveur NFS)
- vm WEB (client NFS, apache2, python etc ..)

voici le résultat de plusieurs dd depuis WEB vers DATA :

10240000 octets (10 MB) copiés, 0,207398 s, 49,4 MB/s
102400000 octets (102 MB) copiés, 1,27832 s, 80,1 MB/s
1024000000 octets (1,0 GB) copiés, 11,0655 s, 92,5 MB/s
2048000000 octets (2,0 GB) copiés, 18,9003 s, 108 MB/s
3072000000 octets (3,1 GB) copiés, 27,9743 s, 110 MB/s
4096000000 octets (4,1 GB) copiés, 41,8006 s, 98,0 MB/s
5120000000 octets (5,1 GB) copiés, 51,1537 s, 100 MB/s
6144000000 octets (6,1 GB) copiés, 54,8313 s, 112 MB/s
7168000000 octets (7,2 GB) copiés, 63,8901 s, 112 MB/s
8192000000 octets (8,2 GB) copiés, 2076,4 s, 3,9 MB/s
9216000000 octets (9,2 GB) copiés, 142,461 s, 64,7 MB/s
10240000000 octets (10 GB) copiés, 145,172 s, 70,5 MB/s
20480000000 octets (20 GB) copiés, 2961,35 s, 6,9 MB/s
30720000000 octets (31 GB) copiés, 8162,79 s, 3,8 MB/s

Lors de la copie, un iotop m'affiche quelques chose comme ca :
depuis WEB :

29888 be/4 root 0.00 B/s 551.82 K/s 0.00 % 99.17 % dd if=/dev/zero of=/mnt/nfs/home/www/test.dd bs=4k count=10000000

depuis DATA :

93 be/3 root 0.00 B/s 0.00 B/s 0.00 % 93.40 % [jbd2/xvda2-8]
81744 be/4 root 0.00 B/s 634.10 K/s 0.00 % 0.65 % [nfsd]
31744 be/4 root 0.00 B/s 634.10 K/s 0.00 % 0.58 % [nfsd]
11746 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.46 % [nfsd]
51742 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.41 % [nfsd]
61747 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.39 % [nfsd]
41746 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.38 % [nfsd]
71743 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.35 % [nfsd]
21745 be/4 root 0.00 B/s 507.28 K/s 0.00 % 0.35 % [nfsd]

Enfin un htop sur WEB :
Proc1 1.3% / Load average: 57.50 41.70 21.83
Proc2 0.0% / Mem 684/5822MB
Proc3 0.0% / Swp 74/1023MB
Proc4 1.3%

Mes questions et mon problème : Pourquoi un load aussi élevé, alors que les procs et mémoire ne sont pas utilisé ?
Et pourquoi ce genre de problème ne se pose qu'avec de GROS fichier (en général, au dessus de 7Go) ?
Et ma question bonus : Est-il possible de limiter le thread NFS d'un application/processus ? (de façon par exemple, à limiter l'utilisation en IO d'une appli ?)

  • # meme disque ?

    Posté par . Évalué à 3.

    tes VMs sont sur le meme disque physique ?

    tu lis une donnée dessus, tu la transfert par le reseau, tu la recupere de l'autre coté, tu la reecrit sur le meme disque.

    du coup ton disque physique fait des I/O de lecture ET d'ecriture.

    regarde la charge, les waits, et les iotop de ton dom0

    ensuite des pistes :
    tu peux limiter le nombre de daemon nfs (donc leur consommation)
    tu dois aussi pouvoir changer la taille des buffers (option rsize et wsize dans le mount) pour optimiser les transferts reseaux

    • [^] # Re: meme disque ?

      Posté par (page perso) . Évalué à 1.

      Alors, oui, les VMs sont sur les mêmes disque physique.

      Je ne comprend pas bien ton "lire / transfert / recup / réécrit" puisque le DD se fait sur WEB et s'écrit sur DATA. donc c'est de l'écriture direct sur DATA depuis WEB non ?!

      Je ne comprend pas bien ce que tu entends par "regarde les waits et les iotop dans mon dom0", ma machine host n'affiche rien dans iotop et la charge est quasi nul …

      Enfin, l'idée n'est pas de limiter le nombre de daemon nfs, mais de limiter l'encombrement que peut faire 1 process. Car du coup, comme DD bouffe 99% (en gros), il n'y a plus de place pour mysql/apache etc … (toutes mes autres applis freeze).

      Au niveau des buffers, j'y ai pensé, mais ne vais-je pas perdre en qualité de transfert pour les petits fichiers ?! Pour l'instant, je suis en rsize=131072,wsize=131072 qui est déjà assez élevé !

      • [^] # Re: meme disque ?

        Posté par . Évalué à 2.

        dans ton scenario
        tu lis les données de la machine WEB (mais du disque physique sdXY)
        tu les envoies sur le reseau par NFS (i/o sur les cartes reseaux)
        puis DATA les recoit et les stocke… sur le meme disque physique sdXY, mais à un autre endroit.

        j'ai pas fait de xen depuis un moment,
        mais normalement ton hyperviseur devrait voir les actions sur le disque physique.

        limiter l'encombrement d'un process, oui c'est possible,
        enfin il fut un temps ou ca se faisait à coup de ulimit generalement pour un utilisateur plutot qu'un process.

        • [^] # Re: meme disque ?

          Posté par (page perso) . Évalué à 1.

          Je sais pas si le NFS (entre mes vm xen) passe par la carte réseau, en tout cas, les i/o sur ma machine hote ne s'affole pas du tout !

          Du coup, est-ce possible ? peut-on limiter ca ? vu que c'est des process apache, je peux peut-être y arriver en limitant www-data, mais ca n'arrangera pas tout :/

  • # ionice

    Posté par (page perso) . Évalué à 4.

    Extrait du man : ionice - Obtenir ou définir la classe et la priorité d'ordonnancement des entrées et sorties d'un processus

    Par exemple :

    $ ionice -c3 rsync (...)
  • # goulot étranglement I/O

    Posté par . Évalué à 3.

    Ton problème ressemble à un goulot d'étranglement sur les I/O.
    Si tu as assez de mémoire tu peux essayer de transférer un gros fichier depuis la mémoire du serveur NFS vers celle du client NFS, en utilisant /dev/shm sur chacun d'eux. Tu sauras ainsi si c'est le disque ou le réseau qui te bride.

    PS: je suis un peu surpris par la taille des tampons NFS que tu utilises (128K), moi j'utilise rsize=8192,wsize=8192 sinon il y a trop de fragmentation et les performances s'écroulent lors des gros transferts. (mais peut être as tu activé les Jumbo frame sous XEN et dans ce cas les grands tampons sont pertinents).

    • [^] # Re: goulot étranglement I/O

      Posté par (page perso) . Évalué à 1.

      Merci pour tes indications koopa. Mais si je comprend la théorie de la mémoire partagé, je vois mal comment l’exécuter ?!
      mount -o remount,size=8G /dev/shm
      et un dd vers /dev/shm par exemple ?!

      Au niveau des tampons, c'etait ce que j'ai pu avoir de plus ""stable"", plus petit, les gros transferts commencait la même histoire des IO. de Cette facon, ca me permet de n'avoir pas trop de souci pour les "moyens transferts" de l'ordre de 4/5Go.

      Enfin, je vais regarder du coté des jumbo frame car je ne savais pas qu'on pouvait le configurer pour xen (mais si tu as une piste, je suis preneur :) ).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.