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.