vendredi 13 novembre 2015

GNU Parallel

Avant de se lancer dans la programmation du cluster il faut mettre en place des outils de gestion du cluster permettant, par exemple, d’exécuter la même tache sur tous les nœuds du cluster, ou copier un  fichier d’un nœud vers tous les autres nœuds etc… Pour cela il y a « gnu parallel ». C’est un utilitaire d’un usage un peu spécial mais très puissant. A ne pas confondre avec ‘parallel’ inclus dans le package moreutils et qui ne permet de gérer le parallélise que sur la machine où il s’exécute.

Installation de gnu parallel

 La version classique consisterai à faire
apt-get install parallel
parallel --version
Mais 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 :
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

Tapez
parallel -j0 ping -nc 2 :::  google.com yahoo.com bing.com
Ceci 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.com
C’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...

mardi 3 novembre 2015

DD for Windows

DD for Windows est un outil open source très puissant pour manipuler les disques et partitions. Dans notre cas c'est la manipulation des cartes SD qui nous intéresse. Il est une adaptation écrite en Pascal de la commande UNIX dd.

ATTENTION: Il est facile de faire une erreur de frappe et d’écrire sur le mauvais disque ou la mauvaise partition et donc de perdre définitivement beaucoup de données. Soyez très prudent...
Renommer dd.exe en dd-removable.exe est une première sécurité qui restreint dd aux disques amovibles (voir la doc)

Il existe d'autres outils avec une interface plus sexy comme Win32 Disk Imager ou WinFlashTool, mais, même s'ils couvrent 80% des besoins, ils n'offrent pas la flexibilité de dd.
  • Avec dd vous pouvez écrire une image disque sur un carte ou créer une image d'une carte. Ce n'est pas le cas avec  WinFlashTool.
  • Avec dd vous pouvez lire les 8 Go d'une carte qui en fait 16 mais dont les partitions n'occupent que les 8 premiers. Ceci n'est possible ni avec Win32 Disk Image, ni avec WinFlashTool (de toute façon ce dernier ne permet même pas de lire la carte).

Avant d'utiliser DD pour Windows il ne faut pas oublier que :
  • Pour écrire, lire, lister les partitions (Volumes dans le vocabulaire Microsoft) n’importe quel utilisateur fait l’affaire.
  • Pour écrire, lire, lister les disques (Devices dans le vocabulaire Microsoft) il faut être le véritable administrateur de Windows. Pas juste un utilisateur avec les droits d’administration.
  • Bien que DD for Windows s’utilise en ligne de commande (via cmd.exe) il est dangereux  de faire des batchs car la manière qu'a Windows de nommer les périphériques fait que le même périphérique peut changer de nom surtout quand c'est un disque amovible.
Pour ouvrir une invite de commande (cmd.exe) en tant qu’administrateur procéder en trois étapes comme indiqué ici (on passe de 2 à 3 en cliquant avec le boutons droit sur "cmd.exe") :



Une variante consiste à taper "cmd.exe" et valider avec CTRL+SHIFT+ENTER.

Exemple:
La commande "dd --list" n'affichera les "Block Device" que si on est l'administrateur.


Le nom de ces 'Block Device' est important quand on veut manipuler la carte SD dans son ensemble (table de partitions, les partitions, l'espace non alloué) et non les partitions.

Rappel: sous Windows une lettre désigne une partition. Donc le "disque I:" est en fait une partition.

Pour vous familiariser avec la dénomination des disques et partitions vous pouvez utiliser l'utilitaire WinObj de Sysinternals (Là aussi il faut être administrateur sinon le panneau de droite reste vide)

Cet écran de WinObj :


Correspond à ceci avec la commande  dd --list

Win32 Available Volume Information

  \\.\Volume{92177b02-d34c-11e4-9eae-002215896b38}\
    link to \\?\Device\HarddiskVolume5
    removeable media
    Mounted on \\.\i:


NT Block Device Objects (faut être admin pour voir cette partie)


  \\?\Device\Harddisk3\Partition0
    link to \\?\Device\Harddisk3\DR3
    Removable media other than floppy. Block size = 512
    size is 15931539456 bytes
  \\?\Device\Harddisk3\Partition1
    link to \\?\Device\HarddiskVolume5


Attention aux pièges tendu par Microsoft :
Partition0 n'est JAMAIS une partition mais toujours un lien symbolique pour représenter TOUT le disque.
Partition1 est TOUJOURS présent même si la carte SD n'est pas insérée dans le lecteur de carte.