Logo
  Erlang-fr.org  

Présentation du site
Cours Erlang
Articles
Projets
Autour d'Erlang-fr
Liens
 
English Area
Miroir: Documentation Erlang
Miroir: Archives Erlang/OTP
 
Recherche

Logo Process-one
Erlang

L'administration d'un environnement Erlang

par Mickaël Rémond

Version anglaise: En cours de traduction.
English Version: being translated.

Dès lors que l'on souhaite utiliser l'environnement Erlang pour faire fonctionner des programmes dans des conditions de production, il est nécessaire de connaître certaines techniques pour pouvoir suivre certains paramètres de la machine virtuelle.

J'essaie dans cette rubrique de rassembler quelques techniques que j'ai pu expérimenter. Cette liste est loin d'être exhaustive, alors n'hésitez pas à m'envoyer vos techniques afin que je les ajoute à cette page.

Ouverture d'un shell sur un noeud Erlang distant

C'est souvent la première tâche avant de passer à l'étude proprement dit du comportement des processus tournant dans une machine virtuelle. Le plus souvent, cette machine virtuelle est lancé sur une machine distante, sans aucun shell, lorsqu'il s'agit d'un environnement de production.

Avant de pouvoir vous connecter à ce noeud, vous devez paramétrer votre cookie pour qu'il soit identique à celui de la machine distante. Lancez un shell Erlang, avec le réseau (utilisation de l'option -sname de la commande erl), puis utiliser la fonction set_cookie:

   mikl@louxor:~$ erl -sname admin
   Erlang (BEAM) emulator version 5.0.2 [source]

   Eshell V5.0.2  (abort with ^G)
   (admin@louxor)1> erlang:set_cookie(node(), 'cookie_de_la_machine_distante').
   true
   (admin@louxor)2> 

Une fois que l'on a mis en place un cookie identique au noeud distant, les machines virtuelles Erlang peuvent interagir. Elles sont considérées comme faisant partie du même sous réseau. La fonction ping du module net_adm permet de vérifier que la connexion est bien établie:

   (admin@louxor)2> net_adm:ping('prod@memphis').
   pong
   (test2@louxor)3> net_adm:ping('zog@zog').
   pang
Les réponses à la commande ping peuvent être de deux types: pong signifie que la communication avec le noeud Erlang ciblée est établie; pang signifie que le noeud Erlang ciblé n'a pas répondu, soit parce qu'il n'existe pas physiquement ou n'est pas relié physiquement au même réseau, soit parce que les cookies ne sont pas identiques.

L'opération suivante consiste à ouvrir un shell sur un noeud distant:
Control-g (Passage en mode «contrôle des travaux»)
r 'prod@memphis' (Ouverture d'un shell sur le noeud Erlang ciblé)
j (Pour lister les «travaux» en cours)
c 3 (pour se connecter sur le shell souhaité. Dans notre exemple, le job 3)

Des informations sur les processus

Une fois que l'on a ouvert un shell sur le noeud souhaité, on peut lancer des commandes pour lancer de nouveaux traitements ou analyse ce qui se passe sur le noeud en question. Voici quelques fonctions utiles pour monitorer des processus:

  • Suivre la taille des files d'attente de message des processus Erlang:
       lists:map(fun(X) -> 
                     {X, process_info(X,message_queue_len)} 
                 end, 
                 processes()).
    Cette approche est utile pour repérer les processus qui constituent des goulets d'étranglement dans le système.
  • Suivre l'évolution des réductions opérée pour chaque processus Erlang:
       lists:map(fun(X) -> 
                     {X, process_info(X,reductions)} 
                 end, 
                 processes()).
    Il s'agit ici de repérer les processus consommateurs d'un temps de traitement important.
  • Suivre l'occupation mémoire d'un processus:
    La taille de la mémoire occupée:
       lists:map(fun(X) -> 
                     {X, process_info(X,heap_size)} 
                 end, 
    	     processes()).
    La taille de la pile:
       lists:map(fun(X) -> 
                     {X, process_info(X,stack_size)}
                 end,
    	     processes()).
    Ou mieux, le cumul des deux:
       lists:map(fun(X) -> 
                     {stack_size, SSize}= process_info(X,stack_size),
                     {heap_size, HSize}= process_info(X, heap_size),
                     {X, SSize+HSize}
                 end,
                 processes()).

Isoler la machine virtuelle Erlang du reste du système: chroot

A suivre ...

Ce cours devrait s'agrémenter d'autres techniques permettant d'administrer correctement et efficacement des machines virtuelles Erlang.

Historique du document

Version 1.0 - 2001-03-21 - Mickaël Rémond.

Pour tout commentaire: erlang@erlang-fr.org

Dernière modification: 2005-11-11 18:47:48