Installation de gnu parallel
La version classique consisterai à faireapt-get install parallelMais il y a de fortes chances que la version ainsi obtenue ne soit pas récente. Heureusement vous pouvez installer manuellement la dernière version. Mais avant, pour éviter les conflits, il faut supprimer le package (sudo apt-get remove parallel) puis effectuer l’installation manuelle que voici :
parallel --version
wget http://ftpmirror.gnu.org/parallel/parallel-latest.tar.bz2
tar xjf parallel-latest.tar.bz2
cd parallel-[date]
./configure && make && sudo make install
Éditer ou créer si nécessaire le fichier /etc/parallel/config.
Supprimer ce qu’il contient (--tollef en particulier)
Ajouter la ligne :
--wc
Test
Tapezparallel -j0 ping -nc 2 ::: google.com yahoo.com bing.comCeci exécutera en parallèle 3 commandes « ping –nc 2 »
A cause de l'option -j0 chaque commande s’exécutera sur un processeur diffèrent.
Remplacez -j0 par -j1 pour n’utiliser qu’un seul processeur
parallel –j1 ping -nc 2 ::: google.com yahoo.com bing.comC’est au moins deux fois plus lent.
NB : Comme tout s’est passé sur la même machine on aurait pu utiliser le parallel de moreutils pour cela. Mais on ne va pas en rester là…
Introduction
Deux trois trucs à comprendre pour utiliser gnu parallel :- La ligne de commande de gnu parallel est pléthorique. Certaines options existent sous deux, trois ou quatre noms. Certaines sont obsolètes. Beaucoup (trop) de choses sont configurables. Et pour aggraver les choses le man est très complet mais aussi très verbeux (plus de 3600 lignes). Par exemple, le man explique comment utiliser gnu parallel avec TOR ! Le tout donne une sensation de ‘gros machin’.
- Gnu parallel utilise un système de template basé sur la syntaxe {xxx}. C’est un peu comme le %xxx dans le printf() de C. Ce %xxx est remplacé par un paramètre de la fonction printf(). Avec parallel le paramètre qui va remplacer un {xxx} peut venir de stdin, de la ligne de commande ou d’un fichiers. Il y a donc plusieurs façons de faire la même chose. Le xxx définit comment le paramètre est utilisé dans la substitution.
Commençons pas exécuter la commande uptime sur les serveur node01,02,03,04 du cluster:
parallel --nonall –S node01,node02,node03,node04 uptime
00:36:33 up 12:56, 0 users, load average: 0.00, 0.01, 0.05
00:36:33 up 12:56, 0 users, load average: 0.00, 0.01, 0.06
00:36:33 up 12:56, 0 users, load average: 0.03, 0.01, 0.05
00:36:33 up 12:56, 0 users, load average: 0.00, 0.02, 0.05
Le résultat n’est pas lisible car on ne sait pas à qui appartient ce qui s’affiche. On va ajouter un echo et on va y inclure $(hostname). ATTENTION il faut que $(hostname) s’exécute sur le serveur distant pas local. Il faut donc utiliser des quotes simples pour que la commande arrive intacte sur le serveur distant. Avec des quotes doubles on aurait à chaque fois le nom du serveur local.
parallel --nonall –S node01,node02,node03,node04 'echo ==== $(hostname) ====; uptime'Ce n’est pas pratique de devoir lister les serveurs un a un. On peut utiliser ceci :
parallel --nonall -Snode0{1..4} 'echo ==== $(hostname) ====; free'NB: Malgré la ressemblance la notation {1..4} ne relève pas de parallel mais de bash. C’est pour cela que dans ce cas il ne faut pas d’espace après le -S (je vous laisse chercher pourquoi …)
Voici une commande qui récupère la charge et la température des cpu des 9 serveurs:
parallel --nonall -Snode0{1..9} 'echo ==== $(hostname) ====; uptime; /opt/vc/bin/vcgencmd measure_temp'
==== node01 ====
00:38:51 up 12:58, 0 users, load average: 0.00, 0.01, 0.05
temp=37.4'C
==== node02 ====
00:38:51 up 12:58, 0 users, load average: 0.01, 0.01, 0.06
temp=39.0'C
==== node03 ====
00:38:51 up 12:58, 0 users, load average: 0.00, 0.01, 0.05
temp=36.9'C
==== node04 ====
... etc ...
==== node09 ====
00:38:52 up 12:59, 0 users, load average: 0.03, 0.02, 0.05
temp=36.9'C
Un dernier exemple: Stress des 9 nodes avec affichage de la température avant et après le stress. Bien sur il faut avoir installé le package 'stress' sur chaque node (voila un autre travail pour gnu parallel)
parallel --nonall -j0 -Snode0{1..9} 'echo ==== $(hostname) ====; /opt/vc/bin/vcgencmd measure_temp; stress -c 4 -i 4 --timeout 30; /opt/vc/bin/vcgencmd measure_temp'
...
==== node05 ====
temp=37.4'C
stress: info: [2352] dispatching hogs: 4 cpu, 4 io, 0 vm, 0 hdd
stress: info: [2352] successful run completed in 30s
temp=46.5'C
==== node07 ====
temp=40.6'C
stress: info: [2350] dispatching hogs: 4 cpu, 4 io, 0 vm, 0 hdd
stress: info: [2350] successful run completed in 30s
temp=49.2'C
...
Attention: les programmes ainsi exécuté via parallel sur des serveurs distants n'ont pas de tty associé. Cela peut poser divers problèmes. Le plus évident est l'impossibilité d'interagir avec ces programmes.
Exemple:
parallel --nonall -j0 -Snode0{1..9} 'echo ==== $(hostname) ====; apt-get autoremove'
==== node08 ====
Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
... ... ...
Do you want to continue [Y/n]? Abort.
apt-get abandonne puisque, faute de tty, il ne peut pas lire la réponse [Y/n]
La bonne invocation est:
parallel --nonall -j0 -Snode0{1..9} 'echo ==== $(hostname) ====; apt-get -y autoremove'
qui force apt-get a toujours prendre 'y' comme reponse aux questions.
à suivre...
Aucun commentaire:
Enregistrer un commentaire