Cette question est traitée ici en détail.
Comment mesurez-vous l'utilisation de la mémoire d'une application ou d'un processus sous Linux?
De l'article de blog Comprendre l'utilisation de la mémoire sous Linux , ps
n'est pas un outil précis à utiliser à cette fin.
Pourquoi
ps
est "faux"Selon la façon dont vous le regardez,
ps
ne rapporte pas l'utilisation réelle de la mémoire des processus. Ce qu'il fait réellement, c'est montrer combien de mémoire réelle chaque processus prendrait s'il était le seul processus en cours d'exécution . Bien sûr, une machine Linux typique a plusieurs dizaines de processus en cours d'exécution à tout moment, ce qui signifie que les numéros VSZ et RSS signalés parps
sont presque certainement faux .
ps
fait, ne montre même pas cela - il montre les numéros de mémoire virtuelle et résidente, où virtuel est la quantité maximale de mémoire que le processus pourrait théoriquement utiliser, c'était le seul processus (jamais), utilisé chaque page allouée (ne se produit jamais) et n'a mappé ou démappé aucune page (peu probable). Tandis que résident montre combien de mémoire virtuelle est mappée en physique en ce moment. En règle généralevirt > usage > res
cependant sur un système 64 bits ,virt ~= res*10
il est une gamme très large.Réponses:
Avec
ps
ou des outils similaires, vous n'obtiendrez que la quantité de pages mémoire allouées par ce processus. Ce nombre est correct, mais:ne reflète pas la quantité réelle de mémoire utilisée par l'application, uniquement la quantité de mémoire qui lui est réservée
peut être trompeur si les pages sont partagées, par exemple par plusieurs threads ou en utilisant des bibliothèques liées dynamiquement
Si vous voulez vraiment savoir quelle quantité de mémoire votre application utilise réellement, vous devez l'exécuter dans un profileur. Par exemple,
valgrind
peut vous donner des informations sur la quantité de mémoire utilisée et, plus important encore, sur les éventuelles fuites de mémoire dans votre programme. L'outil profileur de tas de valgrind est appelé «massif»:Comme expliqué dans la documentation de valgrind , vous devez exécuter le programme via valgrind:
Massif écrit un cliché des instantanés d'utilisation de la mémoire (par exemple
massif.out.12345
). Ceux-ci fournissent, (1) une chronologie de l'utilisation de la mémoire, (2) pour chaque instantané, un enregistrement de l'emplacement dans la mémoire de votre programme qui a été alloué. Un excellent outil graphique pour analyser ces fichiers est le massif-visualizer . Mais j'ai trouvéms_print
, un outil simple basé sur du texte livré avec valgrind, déjà très utile.Pour trouver les fuites de mémoire, utilisez l'
memcheck
outil (par défaut) de valgrind.la source
Essayez la commande pmap :
la source
gnome-system-monitor
Difficile à dire avec certitude, mais voici deux choses "proches" qui peuvent aider.
vous donnera la taille virtuelle (VSZ)
Vous pouvez également obtenir des statistiques détaillées à partir du système de fichiers / proc en allant sur
/proc/$pid/status
Le plus important est le VmSize, qui devrait être proche de ce qui
ps aux
donne.la source
gnome-system-monitor
Dans les versions récentes de linux, utilisez le sous-système smaps . Par exemple, pour un processus avec un PID de 1234:
Il vous dira exactement combien de mémoire il utilise à ce moment-là. Plus important encore, il divisera la mémoire en privé et partagé, de sorte que vous pouvez indiquer la quantité de mémoire utilisée par votre instance du programme, sans inclure la mémoire partagée entre plusieurs instances du programme.
la source
pmap
c'est une interface plus simple.Il n'y a pas de moyen simple de calculer cela. Mais certaines personnes ont essayé d'obtenir de bonnes réponses:
la source
ps_mem
etsmem
très utile pour les mesures des utilisateurs finaux, par exemple.pmap
La sortie très détaillée est orientée vers les développeurs ... permet de récupérer l'utilisation de la mémoire de Firefox pour chaque police, addon, bibliothèque par exemple. Merci à tous, exp. @Bash, @thomasruther.gnome-system-monitor
Utilisez smem , qui est une alternative à ps qui calcule l'USS et le PSS par processus. Ce que vous voulez, c'est probablement le PSS.
USS - Taille d'ensemble unique. Il s'agit de la quantité de mémoire non partagée unique à ce processus (pensez-y comme U pour mémoire unique ). Il n'inclut pas la mémoire partagée. Ainsi, cela sous- indiquera la quantité de mémoire utilisée par un processus, mais est utile lorsque vous souhaitez ignorer la mémoire partagée.
PSS - Taille de jeu proportionnelle. Voici ce que tu veux. Il additionne la mémoire unique (USS), ainsi qu'une proportion de sa mémoire partagée divisée par le nombre de processus partageant cette mémoire. Ainsi, il vous donnera une représentation précise de la quantité de mémoire physique réelle utilisée par processus - avec une mémoire partagée réellement représentée comme partagée. Pensez au P étant pour la mémoire physique .
Comment cela se compare au RSS tel que rapporté par ps et d'autres utilitaires:
Remarque: smem peut également (en option) générer des graphiques tels que des graphiques circulaires et similaires. OMI, vous n'avez besoin de rien de tout cela. Si vous souhaitez simplement l'utiliser à partir de la ligne de commande comme vous pourriez utiliser ps -A v, vous n'avez pas besoin d'installer la dépendance recommandée par python-matplotlib.
la source
Utilisez-le en tant que root et vous pouvez obtenir une sortie claire pour l'utilisation de la mémoire par chaque processus.
EXEMPLE DE SORTIE:
la source
x=2
à sortir également pid et user.Et alors
time
?Pas le Bash intégré
time
mais celui que vous pouvez trouver avecwhich time
, par exemple/usr/bin/time
Voici ce qu'il couvre, sur un simple
ls
:la source
brew install gnu-time
puis utilisezgtime
si vous êtes sur macOS.Ceci est un excellent résumé des outils et des problèmes: lien archive.org
Je vais le citer, afin que plus de développeurs le lisent.
la source
En plus des solutions listées dans tes réponses, tu peux utiliser la commande Linux "top"; Il fournit une vue dynamique en temps réel du système en cours d'exécution, il donne l'utilisation du CPU et de la mémoire, pour l'ensemble du système ainsi que pour chaque programme, en pourcentage:
filtrer par un programme pid:
filtrer par nom de programme:
"top" fournit également des champs tels que:
VIRT - Virtual Image (kb): la quantité totale de mémoire virtuelle utilisée par la tâche
RES - Taille résidente (Ko): La mémoire physique non permutée qu'une tâche a utilisée; RES = CODE + DONNÉES.
DATA - Data + Stack size (kb): La quantité de mémoire physique consacrée à un code autre que le code exécutable, également connu sous le nom de «data resident set» size ou DRS.
SHR - Shared Mem size (kb): quantité de mémoire partagée utilisée par une tâche. Il reflète simplement la mémoire qui pourrait être potentiellement partagée avec d'autres processus.
Référence ici .
la source
Il n'y a pas de réponse unique à cela, car vous ne pouvez pas déterminer avec précision la quantité de mémoire utilisée par un processus. La plupart des processus sous Linux utilisent des bibliothèques partagées. Par exemple, supposons que vous souhaitiez calculer l'utilisation de la mémoire pour le processus «ls». Comptez-vous uniquement la mémoire utilisée par l'exécutable 'ls' (si vous pouviez l'isoler)? Et la libc? Ou toutes ces autres bibliothèques nécessaires pour exécuter «ls»?
Vous pourriez faire valoir qu'ils sont partagés par d'autres processus, mais «ls» ne peut pas être exécuté sur le système sans qu'ils soient chargés.
De plus, si vous avez besoin de connaître la quantité de mémoire dont un processus a besoin pour planifier la capacité, vous devez calculer la quantité utilisée par chaque copie supplémentaire du processus. Je pense que / proc / PID / status pourrait vous donner suffisamment d'informations sur l'utilisation de la mémoire à la fois. D'autre part, valgrind vous donnera un meilleur profil de l'utilisation de la mémoire tout au long de la durée de vie du programme
la source
pmap
Si votre code est en C ou C ++, vous pourriez être en mesure d'utiliser
getrusage()
ce qui vous renvoie diverses statistiques sur la mémoire et l'utilisation du temps de votre processus.Cependant, toutes les plates-formes ne prennent pas en charge cela et renverront 0 valeurs pour les options d'utilisation de la mémoire.
Au lieu de cela, vous pouvez regarder le fichier virtuel créé dans
/proc/[pid]/statm
(où[pid]
est remplacé par votre identifiant de processus. Vous pouvez l'obtenir auprès degetpid()
).Ce fichier ressemblera à un fichier texte avec 7 entiers. Vous êtes probablement le plus intéressé par les premiers (utilisation de toute la mémoire) et sixième (utilisation de la mémoire de données) de ce fichier.
la source
getpid()
, parce que je ne connais pas degetprocessid()
fonction en C / C ++ sous Linux.Valgrind peut afficher des informations détaillées mais il ralentit considérablement l'application cible et, la plupart du temps, il modifie le comportement de l'application.
Exmap était quelque chose que je ne savais pas encore, mais il semble que vous ayez besoin d'un module noyau pour obtenir les informations, ce qui peut être un obstacle.
Je suppose que ce que tout le monde veut savoir sur "l'utilisation de la mémoire" WRT est le suivant ...
Sous Linux, la quantité de mémoire physique qu'un seul processus peut utiliser peut être grossièrement divisée en catégories suivantes.
Ma mémoire mappée anonyme
Mn nommée mémoire mappée
L'utilitaire inclus dans Android appelé showmap est très utile
la source
Trois autres méthodes à essayer:
ps aux --sort pmem
Il trie la sortie par
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Il trie à l'aide de tuyaux.
top -a
Il commence le tri par
%MEM
(Extrait d' ici )
la source
top
et probablement les autres ne donnent pas une représentation précise de la mémoire réellement utilisée par le processus. Par exemple, j'ai 64 Go de RAM, et j'ai 10postgres
processus rapportant chacun 16 Go de RES et 25% de MEM. Bien sûr, ils ne peuvent pas tous utiliser 25% ... Chacun a également 15GiB SHR, et il semble qu'ils partagent cela.la source
sed | awk
et fonctionne dans Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
J'utilise
htop
; c'est un très bon programme de console similaire au Gestionnaire des tâches de Windows.la source
htop
et c'est mieux que top, mais il vous montrera toujours tous les threads de différentes applications sans les regrouper, ce qui le rend presque aussi inutile que top.Si le processus n'utilise pas trop de mémoire (soit parce que vous vous attendez à ce que ce soit le cas, soit parce qu'une autre commande a donné cette indication initiale), et que le processus peut résister à un arrêt pendant une courte période, vous pouvez essayer de utilisez la commande gcore.
Vérifiez la taille du fichier core généré pour avoir une bonne idée de la quantité de mémoire utilisée par un processus particulier.
Cela ne fonctionnera pas trop bien si le processus utilise des centaines de mégaoctets ou des concerts, car la génération du noyau peut prendre plusieurs secondes ou minutes pour être créée en fonction des performances d'E / S. Pendant la création du noyau, le processus est arrêté (ou "gelé") pour empêcher les changements de mémoire. Donc sois prudent.
Assurez-vous également que le point de montage où le core est généré a beaucoup d'espace disque et que le système ne réagira pas négativement au fichier core créé dans ce répertoire particulier.
la source
J'utilise Arch Linux et il y a ce merveilleux paquet appelé
ps_mem
Exemple de sortie
la source
La ligne de commande ci-dessous vous donnera la mémoire totale utilisée par les différents processus en cours d'exécution sur la machine Linux en Mo
la source
Un bon test de l'utilisation la plus "réelle" est d'ouvrir l'application, puis d'exécuter
vmstat -s
et de vérifier la statistique "mémoire active". Fermez l'application, attendez quelques secondes et exécutez àvmstat -s
nouveau. Cependant, une grande partie de la mémoire active libérée était de toute évidence utilisée par l'application.la source
Obtenez valgrind. donnez-lui votre programme à exécuter, et il vous en dira beaucoup sur son utilisation de la mémoire.
Cela ne s'appliquerait que dans le cas d'un programme qui s'exécute pendant un certain temps et s'arrête. Je ne sais pas si valgrind peut mettre la main sur un processus déjà en cours ou ne devrait pas arrêter des processus tels que les démons.
la source
Edit: cela ne fonctionne à 100% que lorsque la consommation de mémoire augmente
Si vous souhaitez surveiller l'utilisation de la mémoire par un processus donné (ou un groupe de noms communs de partage traités, par exemple
google-chrome
, vous pouvez utiliser mon script bash:cela recherchera continuellement les modifications et les imprimera.
la source
Si vous voulez quelque chose de plus rapide que le profilage avec Valgrind et que votre noyau est plus ancien et que vous ne pouvez pas utiliser de smaps, un ps avec les options pour montrer l'ensemble résident du processus (avec
ps -o rss,command
) peut vous donner un aperçu rapide et raisonnable_aproximation_
de la quantité réelle de mémoire non échangée utilisée.la source
Je suggère que vous utilisiez au sommet. Vous pouvez tout trouver sur cette page . Il est capable de fournir tous les KPI nécessaires à vos processus et peut également être capturé dans un fichier.
la source
atop -R
. Pour afficher une poussée récapitulative par utilisateurp
, pour trier par utilisation de la mémoire, appuyez sur" M "de l'intérieur au sommet. Cela donne des nombres similaires à smem.Vérifier le script shell pour vérifier utilisation de la mémoire par application sous Linux . Aussi disponible sur github et dans une version sans pâte ni bc .
la source
Un autre vote pour valgrindici, mais je voudrais ajouter que vous pouvez utiliser un outil comme Alleyoop pour vous aider à interpréter les résultats générés par valgrind.
J'utilise les deux outils tout le temps et j'ai toujours du code allégé et sans fuite pour le montrer fièrement;)
la source
Bien que cette question semble concerner l'examen des processus en cours d'exécution, je voulais voir le pic de mémoire utilisé par une application du début à la fin. Outre valgrind, vous pouvez utiliser tstime , qui est beaucoup plus simple. Il mesure l'utilisation de la mémoire "highwater" (RSS et virtuelle). De cette réponse .
la source
Basé sur la réponse à une question connexe .
Vous pouvez utiliser SNMP pour obtenir la mémoire et l'utilisation du processeur d'un processus dans un périphérique particulier du réseau :)
Exigences:
Remarques:
HOST-RESOURCES-MIB :: hrSWRunPerfCPU est le nombre de centi-secondes des ressources CPU totales du système consommées par ce processus. Notez que sur un système multiprocesseur, cette valeur peut augmenter de plus d'un centième de seconde en un centième de seconde en temps réel (horloge murale).
HOST-RESOURCES-MIB :: hrSWRunPerfMem est la quantité totale de mémoire système réelle allouée à ce processus.
**
Script de surveillance des processus:
**
la source
/ prox / xxx / numa_maps y donne quelques informations: N0 = ??? N1 = ???. Mais ce résultat peut être inférieur au résultat réel, car il ne compte que ceux qui ont été touchés.
la source
Utilisez l' outil graphique intégré du « moniteur système » disponible dans Ubuntu
la source