Quelle est la mémoire occupée par un processus Linux donné ? C’est dans certains cas très important de le savoir, par exemple pour déterminer combien de processus peut créer un serveur Apache sans risquer de faire swapper la machine (paramètre MaxClients). À première vue, la réponse devrait être donnée par la commande ps
. Cette dernière renvoie deux valeurs, VSIZE et RSS :
Clairement, la métrique RSS ne convient pas, car il se peut que le processus ait swappé. Malheureusement, VSIZE ne convient pas non plus, car cette métrique ne tient pas compte des pages qui peuvent être partagées entre plusieurs processus : bibliothèques partagées, code partagé (entre des processus qui ont forké, par exemple diverses instances d’Apache), et même données partagées (sous Linux, fork fonctionne en copy-on-write, c’est-à-dire que les pages du processus fils ne sont dupliquées que lorsque le fils ou le parent effectue une écriture).
Si on y réfléchit un peu, il n’y a pas de solution universelle à la définition d’une métrique de consommation mémoire. Ainsi, les propositions suivantes ont été effectuées (mais pas intégrées dans le noyau à ma connaissance) :
Depuis le noyau 2.6.14, il existe également un fichier /proc/*<PID>*/smaps
qui fournit des informations détaillées sur la mémoire d’un processus. Cela demande certainement un peu de mise en forme, mais il doit être possible d’en tirer des informations du type PSS et USS.