Ma vie rêvée

Aller au contenu | Aller au menu | Aller à la recherche

La consommation mémoire avec Linux, rapide survol

Il est assez fréquent de rencontrer sur les forums de discussion des intervenants s'étonnant de la quantité affolante de mémoire consommée par leur système tournant sous Linux.

La plupart du temps, cet étonnement vient d'une méconnaissance de la gestion de la mémoire par ledit système. Je vais donc tenter, assez grossièrement, d'expliquer comment ça marche. Il faut comprendre que de la mémoire inutilisé est de la mémoire inutile. C'est à dire que tant qu'il peut (c'est à dire tant qu'une application n'en a pas besoin), le système va essayer d'utiliser la mémoire pour faire quelque chose d'utile (un cache disque par exemple). Une partie de la mémoire est consommée mais reste disponible dès qu'un programme en a besoin.
Certains outils (comme top) vont par défaut afficher la mémoire consommée et par les applications et par le système, d'où l'étonnement ci-dessus.

Prenons, un exemple pour bien comprendre. Au moment où j'écris, J'ai sur ma machine 2Go de RAM physique et quelques programmes ouverts.

Voici le résultat de top :

Mem:   1997536k total,  1624688k used,   372848k free,   245772k buffers
Swap:   843372k total,        0k used,   843372k free,   501948k cached

D'après lui, 1,6Go de mémoire est occupé (arrgh), 350Mo est libre, 250Mo est dans les tampons et 500Mo est de la mémoire cache (je passe sous silence le swap qui n'est pas utilisé).

Si on fait la somme de ses valeurs, on arrive à bien plus que 2Go, ce qui est normal puisqu'en réalité, les tampons et les caches sont à déduire de la mémoire utilisée. Ce que fait automatiquement l'outil free :

             total       used       free     shared    buffers     cached
Mem:          1950       1586        364          0        240        490
-/+ buffers/cache:        856       1094

cette fois-ci la mémoire consommée est redescendue à 856Mo. Ce qui est déjà plus raisonnable mais quand même toujours important.

En réalité, la mémoire réellement consommée par les programmes n'est pas si importante. L'outil free ne prend pas en compte tous les caches existant et en particulier ceux se trouvant en espace noyau.

Pour cela, on peut utiliser l'outil slabtop (classé par consommation mémoire) :

 Active / Total Objects (% used)    : 1179886 / 1181585 (99.9%)
 Active / Total Slabs (% used)      : 131149 / 131149 (100.0%)
 Active / Total Caches (% used)     : 57 / 66 (86.4%)
 Active / Total Size (% used)       : 496560.55K / 496815.30K (99.9%)
 Minimum / Average / Maximum Object : 0.01K / 0.42K / 4.00K
 OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
480555 480537  99%    0.75K  96111        5    384444K ext3_inode_cache
505153 505145  99%    0.20K  26587       19    106348K dentry
18669  18666  99%    0.55K   2667        7     10668K radix_tree_node
190051  90009  99%    0.10K   2309       39      9236K buffer_head
3105   3100  99%    0.77K    621        5      2484K shmem_inode_cache
37376  37282  99%    0.06K    584       64      2336K kmalloc-64
3794   3791  99%    0.55K    542        7      2168K inode_cache
7728   7703  99%    0.17K    336       23      1344K vm_area_struct
916    912  99%    1.00K    229        4       916K kmalloc-1024
1326   1319  99%    0.59K    221        6       884K proc_inode_cache
0965  10965 100%    0.08K    215       51       860K sysfs_dir_cache
4389   4346  99%    0.19K    209       21       836K kmalloc-192
368    344  93%    2.00K     92        4       736K kmalloc-2048
172    167  97%    1.97K     43        4       344K task_struct
  96     93  96%    2.06K     32        3       256K sighand_cache
286    275  96%    0.69K     26       11       208K sock_inode_cache

Ainsi, on voit que le cache des inodes (les références vers les fichiers) fait 384Mo, celui des noms de dossiers (dentry) fait 100Mo.

Il suffit alors de soustraire ces 2 valeurs pour arriver à quelques choses de plus réaliste en terme de mémoire occupée, ici autour de 380Mo.
On est bien loin des 1,6 Go initiaux, ouf ;).

Toutes ces données sont également directement disponible dans le fichier /proc/meminfo (regarder notamment la ligne Sreclaimable qui fait le total des caches récupérables dans le noyau)

Voilà, c'est fini pour cette courte explication du mythe de la consommation de mémoire avec Linux. N'hésiter pas à corriger ou compléter en commentaire, je suis loin d'être un expert sur le sujet.

PS : A noter que dans mon cas, mon pilote graphique se réserve une zone mémoire importante en RAM, sans pour autant l'utiliser constamment.
Elle n'en est pas moins considérée occupée par les différents outils et je n'ai pas trouvé comment la mettre en évidence.