samedi 1 février 2014

Tire-lire-lo combien j'ai de procesus sur mon serveur Linux?

Combien de processus peut-on créer?

  1. Un certain nombre? :-)
  2. Un nombre fixe déterminé par configuration lors de la génération du noyau?
  3. Un nombre fixe, fonction de la taille mémoire de la machine, déterminé par le noyau lors de son initialisation
  4. Réponse3, mais le super utilisateur peut aussi modifier dynamiquement cette valeur.
 La bonne réponse est la réponse N°4....Enfin, moyennant quelques précautions.

Dans ma machine virtuelle Ubuntu dotée de 1GB de RAM, la valeur de threads-max est : 15807.

# cat /proc/sys/kernel/threads-max 
15807
#

D'où sort cette valeur?

Pour simplifier, historiquement, le nombre de processus qu'un OS Unix pouvait créer était défini par une constante fixée lors de la génération du système. L'OS définissait une table de descripteurs de processus de la taille ainsi fixée. Cette constante qui imposait une reconstruction du noyau lors d'une modification est devenue un paramètre de configuration.

Le noyau Linux ne gère pas les processus (et/ou threads) dans une table mais dans une liste. Le noyau Linux calcule une valeur par défaut cette limite lors de son démarrage. Cette valeur est telle que l'occupation des piles systèmes des processus (et/ou threads) ne dépasse pas 1/8 de la mémoire physique disponible.

La taille d'une pile système est définie par la constante THREAD_SIZE. On peut en trouver une définition ici : http://lxr.free-electrons.com/source/arch/x86/include/asm/page_64_types.h#L5
On a donc une taille  de pile de 8K dans ce cas. La limite par défaut proposée par le noyau Linux est donc d'un processus pour 64KB de mémoire.

La valeur du champ MemTotal du fichier /proc/meminfo et le résultat de 15807*8KB*8 ne concordent pas exactement. Probablement parce que le calcul se base sur une taille plus petite tenant compte de réservations système.

En pratique

Mais cette valeur théorique peut être inatteignable si le nombre de pid que le système peut créer simultanément est inférieur à cette limite.

# cat /proc/sys/kernel/pid_max 
32768
#
Ici, les pid "sont recyclés" lorsqu'on atteint la valeur 32768. Autrement dit, on peut théoriquement avoir 32768 processus simultanés chacun ayant un pid différent. On peut donc normalement créer les 15807 processus maximum permis par le noyau Linux.

Sur des systèmes ayant beaucoup de mémoire physique (ex: 128 GB), le nombre maximum de processus que l'on peut créer sera évidemment bien plus grand (supérieur à 2 000 000). Et très souvent la valeur max de pid sera de l'ordre de 65 536. La limite sera alors imposée par las valeur max du pid.

Modifications de ces valeurs... avec prudence!

En fait, il est possible en tant qu'administrateur système de modifier dynamiquement ces deux valeurs, en écrivant la nouvelle valeur désirée dans ces fichiers...
# echo 1999999 > /proc/sys/kernel/pid_max 
# echo 100 > /proc/sys/kernel/threads-max #! Ne faites pas ça!
#
 
A priori le système ne fait aucune vérification. On peut sur un système où il y a déjà 157 processus (et/ou threads) réduire le nombre de processus maximum que l'on peut créer à 100. Pas malin, mais faisable. Le noyau ne tue aucun processus, mais refusera de créer de nouveau processus tant que le compte sera supérieur à 99.

# echo 100 >/proc/sys/kernel/threads-max
# ps
bash: fork: retry: No child processes
La seule chose à faire est de vous dépêcher de remettre une valeur correcte dans threads-max... echo étant un built-in du shell aucun processus n'est créé pour exécuter cette commande. Ouf.

Puis-je réellement créer tous ces processus?

 En fait, les pid servent à différentes choses:
  • identifier les processus,
  • identifier les threads,
  • identifier les groupes de processsus
  • identifier les sessions
Un pid, initialement attribué à un processus, ne pourra être réutilisé que si aucun groupe et aucune session n'utilise plus cet identifiant. Le noyau se charge de cette "comptabilité".

Donc le nombre de processus que vous pourrez créer sera souvent inférieur aux limites observées.
Comment déterminer le nombre de processus et de threads courants?
# ps -edf | wc -l # Nombre de proc
# echo /proc/[0-9]*/task/[0-9]* |wc -l # nombre de threads
 

Mais sur des serveurs?

On observe des nombres de processus très variables... Dans les grandes entreprises, les types d'applications se ressemblent (serveurs de base de données, serveur d'application web/Java)

Quand on a des applications de type Java le nombre de processus est souvent de quelques petites centaines (de l'ordre de 250  à 500).

Quand on a des applications de type base de données, on peut rencontrer un nombre de processus de 1000 à 1500.

Et on trouve des serveurs exécutant plus de 50 000 processus simultanément...

Aucun commentaire:

Enregistrer un commentaire