samedi 10 mars 2012

#node.js en cluster


Dans son mode de fonctionnement normal Node.js sera vu  par le système d'exploitation comme un programme mono-thread tournant sur un seul processeur. Ce mode d’exécution est optimum pour Node.js: il n'aura pas à partager des variables ni à synchroniser des threads. C'est plus une philosophie qu'une limite de Node.js.
Si vous avez  besoin de renforcer votre infrastructure en utilisant tous les processeurs,vous pouvez utiliser le module cluster. Ce dispositif permet de lancer le même  programme javascript sur plusieurs instances Node.js. Attention tous les programmes ne se prêtent pas à cette forme d'écriture et d'utilisation. Dans certains cas il sera nécessaire de mettre en place une communication inter-processus, mais c'est une autre histoire. L'installation se fait par


npm install -g cluster


Structure du programme.


La structure du programme est classique pour ce type d'utilisation :
La partie père du programme  accède à une fonction qui  retourne la liste des processeurs disponibles sur le PC. Puis en fonction du nombre, la partie père lance autant de fils que nécessaire. Dans l'exemple proposé, un numéro de PID pair d'un fils retourne un code OK '200', un numéro impair retourne une erreur '400'.
 


Après le lancement du script via node.js, la commande ps ax|grep node donnera:

 ps ax|grep node

 2596 pts/0    Sl+    0:00 node cluster1.js

 2598 pts/0    Sl+    0:00 /usr/local/bin/node /home/german/cluster1.js

 2599 pts/0    Sl+    0:00 /usr/local/bin/node /home/german/cluster1.js



La première ligne correspond au job du père, les deux autres aux  fils. Ce sont eux qui prennent indifféremment les connexions entrantes.
En cas de perte d'une instance le flux sera pris par la deuxième.
Les règles de répartion sont gérées par l'OS.
La fonction cpus donne sur ma machine:



[ { model: 'Intel(R) Atom(TM) CPU N450   @ 1.66GHz',
    speed: 1667,
    times:
     { user: 1768110,
       nice: 31500,
       sys: 936040,
       idle: 2281930,
       irq: 160 } },
  { model: 'Intel(R) Atom(TM) CPU N450   @ 1.66GHz',
    speed: 1667,
    times:
     { user: 1753240,
       nice: 40410,
       sys: 910150,
       idle: 2252070,
       irq: 140 } } ]


Tests avec jmeter

J'ai utilisé le projet libre jmeter pour tester le bon fonctionnement du dispositif.
Les copies d'écran présentent le plan de charge et le résultat de son exécution. 
Le plan de test

En  vert les codes retour 200 (OK)  en rouge les codes 400 (erreurs)


La aussi pas de surprise: plus la taille de l'échantillon augmente et plus la répartition est proche de la médiane.

En conclusion: Le mode cluster est à réserver pour un usage limité. Si on recherche de la tolérance de panne, le module forever sera plus adapté.

1 commentaire:

Olivier Coutin a dit…

Bonjour,

Si on déploie une application Node.js sur le cloud, est ce que la clusterisation reste possible ? J'ai lu que dans ce contexte, il était interdit d'écrire dirèctement sur le serveur ou d'accéder à l'OS ... est on limité dans le nombre de processus que l'on crée ?