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 :

  • VSIZE est la taille allouée dans son espace d'adressage virtuel. Cela comprend des pages en RAM (voir RSS ci-dessous), des pages dans le swap, et également des zones situées dans un système de fichiers (portions non encore chargées, fichiers mappés en mémoire).
  • RSS (Resident Set Size) correspond uniquement aux pages actuellement situées en RAM.

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) :

  • PSS (Proportional Set Size) : taille totale des pages du processus, chaque page étant divisée par le nombre de processus qui se la partagent. PSS mesure donc « quelle part du gâteau » un processus consomme. L'avantage est que si l'on fait la somme sur l'ensemble des processus, on retombe bien sur la mémoire totale allouée.
  • USS (Unique Set Size) : taille des pages non partagées, c'est-à-dire l'espace qui sera gagné si le processus est tué. Cela pourrait répondre à ma question initiale, « quelle taille pour chaque instance supplémentaire d'Apache ? »

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.