(Il est probablement un peu tard pour l'OP, mais cela est demandé assez souvent, donc je vais essayer)
free
affiche normalement quelque chose comme ceci :
total used free shared buffers cached
Mem: 8195284 8137708 57576 0 1232328 2651156
-/+ buffers/cache: 4254224 3941060
Swap: 18892216 759852 18132364
Les gens ont tendance à regarder le Mem:
ligne en essayant de savoir combien de mémoire libre ils ont. Malheureusement, cette ligne est assez trompeuse, car le noyau Linux essaie d'optimiser l'utilisation de la mémoire disponible de (au moins) ces manières :
-
Il mettra en cache les données du sous-système d'E/S (par exemple, le disque), afin qu'elles soient facilement disponibles si nécessaire.
-
Il expulsera activement les processus qui ont été inactifs pendant un certain temps vers l'espace d'échange, en faveur de la mise en cache des données pour les processus actifs. Cela a tendance à favoriser le débit plutôt que la réactivité, de sorte que certaines personnes adaptent leur noyau pour modifier ce comportement.
Le premier point est source de confusion concernant free
, car le Mem:
La ligne inclut la mémoire utilisée pour la mise en cache dans la quantité de mémoire utilisée. Le noyau, cependant, mettra en cache autant que possible pour des raisons de performances. En fait, sur tout système Linux qui fonctionne depuis un certain temps, la mémoire libre a tendance à être proche de zéro - la mémoire inutilisée est de la mémoire gaspillée.
La mémoire cache, cependant, peut être libérée par le noyau si nécessaire par un autre processus. Bien que cela ait un impact sur les performances d'E/S dans une certaine mesure, d'autres processus peuvent avoir plus de mémoire sans utiliser l'espace d'échange . Par conséquent, dans la plupart des cas, cette mémoire est libre .
C'est pourquoi free
inclut une deuxième ligne, où la mémoire cache est considérée comme libre :
-/+ buffers/cache: 4254224 3941060
Cette deuxième ligne est ce que les gens devraient regarder lorsqu'ils veulent savoir s'ils ont suffisamment de mémoire libre pour un certain usage.
Dans l'exemple ci-dessus, selon le Mem:
ligne il y a environ 57 Mo de mémoire libre. Si l'on lit la deuxième ligne, cependant, il y a en fait environ 3,9 Go qui peut être utilisé sans forcer les processus actifs à échanger. En passant, il y a aussi environ 760 Mo de données rarement utilisées qui ont été échangées, pour faire plus d'espace dans la mémoire principale pour les processus et la mise en cache.
À peu près au même moment, le contenu de /proc/meminfo
:
MemTotal: 8195284 kB
MemFree: 57660 kB
Buffers: 1232352 kB
Cached: 2651156 kB
SwapCached: 119936 kB
.
.
.
MemTotal
:la mémoire physique disponible détectée par le noyau.
MemFree
:la mémoire physique inutilisée - la mémoire libre indiquée dans le Mem:
ligne de free
.
Buffers
:stockage relativement temporaire de blocs de disque bruts.
Cached
:cache en mémoire pour les fichiers lus depuis le disque. Il n'inclut pas la mémoire SwapCached.
SwapCached
:mémoire qui a été une fois échangée, puis réintroduite mais qui est toujours dans l'espace d'échange. Si nécessaire, son contenu peut être simplement supprimé (très rapide !), sans avoir à l'échanger (plus lent).
Donc, pour avoir une estimation semi-précise de la mémoire réellement disponible
MemFree + Buffers + Cached + SwapCached
est un bon point de départ - et celui free
apparaît dans cette deuxième ligne.
Naturellement, la gestion de la mémoire et les statistiques et mesures associées sont plus compliquées que cela. Les nombres indiqués par free
sont au mieux de simples estimations, car il y a beaucoup d'autres variables à prendre en compte si vous voulez aller plus loin. Pour les personnes qui effectuent régulièrement des optimisations de l'utilisation de la mémoire, c'est presque une forme d'art.
MODIFIER :
Un lien un peu humoristique sur ce "problème":
http://www.linuxatemyram.com/
ÉDITION 2 :
Pour confirmer le commentaire selon lequel l'analyse de l'utilisation de la mémoire est presque une forme d'art :
Même free
manque une grande partie des données mises en cache sur les systèmes Linux modernes. À partir de /proc/meminfo
sur mon système :
SReclaimable: 2253576 kB
Cela représente environ 2 Go de mémoire utilisée par l'allocateur de dalle système pour la mise en cache des entrées de répertoire, etc., et elle est récupérable (c'est-à-dire qu'elle peut être effacée et utilisée par les processus si nécessaire). Pourtant free
ne le considère pas comme mémoire cache et ne l'entre dans aucun de ses calculs et donc il apparaît comme mémoire utilisée.
Le slabtop
L'utilitaire, s'il est disponible, permet à l'administrateur système de savoir à quoi sert le cache de dalle.
Un moyen (pour l'utilisateur root uniquement) d'avoir free
afficher l'utilisation réelle de la mémoire du système est la suivante :
# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers cached
Mem: 8195284 3181468 5013816 0 8656 228832
-/+ buffers/cache: 2943980 5251304
Swap: 0 0 0
# swapon -a
La première commande désactive l'espace d'échange. Il ne doit pas être émis si la mémoire disponible n'est pas suffisante pour contenir les données qui ont été échangées - dans ce cas, il faut prendre en compte le Swap:
ligne de free dans leurs calculs d'utilisation de la mémoire.
La deuxième commande pousse toutes les données mises en mémoire tampon sur le disque. Cela permet de libérer plus de mémoire cache à l'étape suivante.
La troisième commande est la plus importante de l'ensemble - elle force le noyau à supprimer autant de données mises en cache que possible (cache de pages, entrées de répertoire, inodes, etc.).
Alors free
montre enfin ce que les processus en cours d'exécution utilisent réellement dans son -/+ buffers/cache:
ligne. Il est tout à fait remarquable que même après avoir supprimé toutes les données en cache, le noyau recommence rapidement à mettre en cache - dans ce cas, il a déjà atteint près de 250 Mo de données en cache en quelques secondes.
La dernière commande active à nouveau l'espace d'échange - elle n'est nécessaire que si la première commande a également été utilisée.
Il convient de noter que ces commandes doivent être exécutées par l'utilisateur root afin d'avoir les privilèges nécessaires.