Je suis un peu confus sur certains des résultats que je vois de ps et free .
Sur mon serveur, ceci est le résultat de free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Ma compréhension de la manière dont Linux gère la mémoire consiste à stocker l’utilisation du disque dans la RAM, de sorte que chaque accès ultérieur soit plus rapide. Je crois que cela est indiqué par les colonnes "mises en cache". De plus, divers tampons sont stockés dans la RAM, indiqués dans la colonne "tampons".
Donc, si je comprends bien, l’utilisation "réelle" est supposée être la valeur "utilisée" de "- / + buffers / cache", ou 561 dans ce cas.
Donc, si tout cela est correct, la partie qui me jette est le résultat de ps aux
.
D'après ce que je comprends des ps
résultats, la 6ème colonne (RSS) représente la taille en kilo-octets utilisée par le processus pour la mémoire.
Alors quand je lance cette commande:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
Le résultat ne devrait-il pas être la colonne "utilisée" de "- / + buffers / cache" from free -m
?
Alors, comment puis-je déterminer correctement l'utilisation de la mémoire d'un processus sous Linux? Apparemment, ma logique est imparfaite.
htop
auteur à une question similaire que j'avais posée l'autre jour ... Comment calculer l'utilisation de la mémoire à partir de / proc / meminfo (comme htop)Réponses:
Ce exact même question a été posée sur serverfault l'autre jour :-)
Le système de mémoire virtuelle Linux n'est pas si simple. Vous ne pouvez pas simplement additionner tous les champs RSS et obtenir la valeur indiquée
used
parfree
. Il y a de nombreuses raisons à cela, mais je vais aborder quelques-unes des plus importantes.Lorsqu'un processus se divise, le parent et l'enfant s'affichent avec le même flux RSS. Cependant, Linux utilise
copy-on-write
pour que les deux processus utilisent vraiment la même mémoire. Ce n’est que lorsque l’un des processus modifie la mémoire que celle-ci sera réellement dupliquée. Ainsi, lefree
nombre sera inférieur à latop
somme RSS.La valeur RSS n'inclut pas la mémoire partagée. Parce que la mémoire partagée n'appartient à aucun processus,
top
ne l'incluez pas dans RSS. Ainsi, lefree
nombre sera supérieur à latop
somme RSS.la source
shmget
oummap
. La formulation autour de la mémoire est très délicate. Utiliser le mauvais mot au mauvais endroit peut totalement bousiller le sens d'une phrase.Si vous cherchez des nombres de mémoire qui s'additionnent jetez un coup d'oeil à smem :
Par exemple ici:
Il en
PSS
va de même de la colonne intéressante car elle prend en compte la mémoire partagée.Contrairement à
RSS
cela, il est significatif de l'additionner. Nous obtenons un total de 654 Mo pour les processus utilisateur ici.La sortie globale du système indique le reste:
Donc, 1 Go de RAM au total = 654 Mo de processus utilisateur + 346 Mo de mémoire du noyau + 16 Mo d' espace libre
(à quelques Mo près)
Globalement, environ la moitié de la mémoire est utilisée pour le cache (494 Mo).
Question bonus : qu'est-ce que le cache utilisateur et le cache noyau ici?
btw pour quelque chose de visuel essayez:
la source
Un très bon outil est la
pmap
liste de l’utilisation actuelle de la mémoire pour un processus donné:Pour plus d'informations à ce sujet, consultez la page de manuel
man pmap
et consultez également 20 outils de surveillance du système Linux que chaque administrateur système devrait connaître , liste des outils que j'utilise toujours pour obtenir des informations sur ma machine Linux.la source
free
vous indique.pmap -x PID
inclut également une colonne RSS qui est souvent très utile pour avoir une idée de la somme RSS d’un processus (comme observé par exemple viatop
provient).Courrez en haut, appuyez
h
pour obtenir de l'aide puisf
pour ajouter des champs. vous pouvez ajouter les champs suivants:RSS
quantité de mémoire physique utilisée par l'applicationCODE
quantité totale de mémoire utilisée par le code exécutable du processusDATA
- quantité totale de mémoire (kb) dédiée aux données et à la pile d'un processusEntre ces 3, vous devriez avoir des résultats assez précis. Vous pouvez également utiliser des remplacements plus détaillés pour top que je recommande
htop
ouatop
.Edit: Presque oublié si vous voulez des informations vraiment détaillées. Trouvez le PID et cat le fichier suivant.
PID=123
cat /proc/123/status
Edit 2: Si vous pouvez le trouver ou l'avoir le livre:
-a une section Chapitre 5: Outils de performance: Mémoire spécifique au processus -elle contient beaucoup plus d'informations que vous ne voudriez jamais.
la source
ps
vous donne la quantité de mémoire utilisée par chaque processus. Une partie de cette mémoire est constituée de fichiers mappés, qui comptent sous cache. Une partie de cette mémoire (en particulier du code) est partagée avec d'autres processus. Par conséquent, si vous additionnez les valeurs RSS, elle est comptée plusieurs fois.Il n'y a pas de bonne réponse à “combien de mémoire ce processus utilise-t-il?”, Car il ne dépend pas du processus seul, il dépend également de l'environnement. Il existe de nombreuses valeurs que vous pouvez appeler «utilisation de la mémoire» du processus. Elles ne correspondent ni ne s'additionnent car elles comptent des éléments différents.
la source
Comme d'autres l'ont souligné à juste titre, il est difficile de connaître la mémoire réellement utilisée par un processus, les régions partagées, les fichiers mmap'ed, etc.
Si vous êtes un expérimentateur, vous pouvez exécuter valgrind et massif . Cela peut paraître un peu lourd pour l'utilisateur occasionnel, mais vous aurez une idée du comportement de la mémoire d'une application au fil du temps. Si une application malloc () correspond exactement à ce dont elle a besoin, cela vous donnera une bonne représentation de l'utilisation réelle de la mémoire dynamique d'un processus. Mais cette expérience peut être "empoisonnée".
Pour compliquer les choses, Linux vous permet de surcharger votre mémoire. Lorsque vous malloc (), vous indiquez votre intention de consommer de la mémoire. Mais l'allocation ne se produit vraiment que lorsque vous écrivez un octet dans une nouvelle page de votre "RAM" allouée. Vous pouvez vous le prouver en écrivant et en exécutant un petit programme C comme ceci:
Exécutez cette application sur une machine disposant de moins de 16 Go de RAM et, voila!, Vous venez de bénéficier de 16 Go de mémoire! (non, pas vraiment).
Notez que
top
vous voyez "VIRT" comme 16.004G mais% MEM est 0.0Exécutez ceci à nouveau avec valgrind:
Et massif dit "somme de tous les allocs () = 16 Go". Donc ce n'est pas très intéressant.
MAIS, si vous l'exécutez sur un processus sain :
Et nous voyons ici (très empiriquement et avec une très grande confiance) que le compilateur a alloué 77 Ko de tas.
Pourquoi essayer si fort d’obtenir une utilisation juste du tas? Parce que tous les objets partagés et les sections de texte utilisés par un processus (dans cet exemple, le compilateur) ne sont pas très intéressants. Ils sont des frais généraux constants pour un processus. En fait, les invocations ultérieures du processus sont presque "gratuites".
En outre, comparez les éléments suivants:
MMAP () un fichier de 1 Go. Votre VMSize sera 1 + GB. Mais votre taille de groupe de résidents ne sera que les parties du fichier dans lesquelles vous avez paginé (en supprimant la référence d'un pointeur vers cette région). Et si vous "lisez" l'intégralité du fichier, le noyau aura peut-être déjà commencé à paginer au début (c'est facile à faire, car le noyau sait exactement comment et où remplacer ces pages si elles sont à nouveau déréférencées ). Dans les deux cas, ni VMSize ni RSS ne sont un bon indicateur de votre "utilisation" en mémoire. Vous n'avez rien fait de malloc ().
En revanche, Malloc () et appuyez sur BEAUCOUP de mémoire - jusqu'à ce que votre mémoire soit échangée sur le disque. Donc, votre mémoire allouée dépasse maintenant votre RSS. Ici, votre VMSize pourrait commencer à vous dire quelque chose (votre processus possède plus de mémoire que ce qui se trouve réellement dans votre RAM). Cependant, il est toujours difficile de faire la distinction entre une machine virtuelle composée de pages partagées et une machine virtuelle échangeant des données.
C'est là que valgrind / massif devient intéressant. Il vous montre ce que vous avez intentionnellement alloué (quel que soit l'état de vos pages).
la source
Essayez ceci: cela vous donnera la quantité totale de RAM réellement utilisée par tous les processus en cours d'exécution en Mo
la source
size
signalé parps
a peu de relation avec l'utilisation réelle de la mémoire. C'est la taille virtuelle de chaque processus qui n'est pas nécessairement allouée en mémoire. Il n'inclut pas non plus certains segments alloués.Il va vous montrer combien de mémoire utilisateur par les utilisateurs ..
la source
Utilisez cette commande pour rechercher une utilisation de la mémoire en%.
Mémoire utilisée:
mémoire libre
la source
grep
je resterai juste là à attendre vos commentaires.free -m | grep Mem | awk '{print $3/$2 * 100.0}'