Comment puis-je afficher l'utilisation de la mémoire de chaque processus si je fais un «ps -ef»?

24

Sous Linux, comment afficher l'utilisation de la mémoire de chaque processus si je fais un ps -ef? J'aimerais voir la «mémoire virtuelle», la «mémoire res», la «mémoire partagée» de chaque progression. Je peux l'obtenir via top, mais je veux les mêmes informations ps -efafin de pouvoir diriger la sortie grepavec mon nom de processus.

hap497
la source

Réponses:

8

Obtenir l'utilisation de la mémoire via ps n'est pas très fiable. Si vous avez un noyau plus récent, il devrait prendre en charge / proc / pid # / smaps qui vous donne des informations détaillées sur l'utilisation de la mémoire de chaque processus. Vous trouverez ci-dessous un script assez sale et rapide pour parcourir chaque processus ouvert et saisir l'utilisation de Size, Rss, Pss et Shared Clean / Dirty. J'espère que cela peut être utile d'une manière ou d'une autre.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done
user26528
la source
1
Vous devez additionner la colonne Taille. Voir la réponse d'Ezsmith ci-dessous.
Basil A
11

ps ef -o command,vsize,rss,%mem,size

Je n'ai pas pu trouver d'option pour la mémoire partagée, mais j'ai trouvé des options pour% de la mémoire physique totale et la quantité d'espace de swap qui serait nécessaire pour échanger le processus. Ceci et bien plus est documenté dans la page de manuel de ps.

Justin Smith
la source
Linux représente la mémoire partagée dans la mémoire de chaque processus, ce qui peut conduire à de fausses sommes si vous avez beaucoup de processus attachés à un segment de mémoire partagée plus large. top, pset des programmes similaires sont tous concernés de la même manière.
Peter Eisentraut
Je sais comment fonctionne la mémoire partagée, mais il semble que ps ne puisse pas fournir ces informations (ou je n'ai pas pu les trouver dans ma documentation ps, au moins). top ou htop peuvent en fait afficher l'utilisation de la mémoire partagée par processus.
Justin Smith
9

La réponse de @ user26528 ne calcule pas tout à fait correctement la mémoire - vous avez besoin de la somme des mappages en smaps, pas seulement celle du haut. Ce script devrait le faire:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done
evsmith
la source
Sorties: ligne 16: +: erreur de syntaxe: opérande attendu (le jeton d'erreur est "+") qui est la ligne qui contient: echo "Private $ (($ pd + $ pc)) kB", je cours sur CentOS 7 .
basilic
2
@evsmith pourquoi ajouter 0,5 à Pss?
Pete
1
L'exécution de 10 000 petits scripts Awk est un contre-modèle massif, vous devez simplement refactoriser tout cela en un seul script Awk.
tripleee
mais ce script lui-même consomme trop de mémoire
mehmet riza oz
8

Liste des processus par utilisation de la mémoire

ps -e -orss =, args = | trier -b -k1,1n

vasily-vm
la source
Utilisez ps -e -orss=,pid=,args= | sort -b -k1,1npour inclure l'ID de processus
Jacob
pspeut trier seul:ps -eo rss=,args= --sort +rss
phil294
4

vous pouvez utiliser

top -n 1
Un m.
la source
3

Liste des processus par utilisation mem

commande: ps -e -orss =, args = | trier -b -k1,1n | pr -TW $ COLONNES \

Jijo John
la source
3

Mise à jour:

Le one-liner suivant fournit également des informations sur la consommation totale de mémoire par l'utilisateur actuel.

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

Je viens d'énumérer tous les processus utilisateur triés par utilisation de mémoire la plus élevée en Mo, comme ceci:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

Vous pouvez utiliser command=au lieu de comm=pour afficher le processus de chemin complet.

Le =supprime simplement le titre de la colonne.

raratiru
la source
3

J'ai constaté que plusieurs fois le même processus a un sous-processus fork et vous êtes intéressé par la mémoire totale utilisée par le processus. Par exemple, Google Chrome démarre plusieurs processus et vous souhaitez connaître la mémoire totale prise par Chrome. J'ai trouvé ci-dessous une commande de ligne très utile

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

Il prend en charge de nombreuses choses, comme l'affichage de la mémoire en Mo, le tri sur la mémoire et principalement le regroupement par commande. Il regroupe également% CPU et% mémoire. Il affiche les données dans un format convivial.

Cette commande a été inspirée de cette réponse et elle m'a beaucoup aidé à me faire une idée du processus qui utilise mes ressources.

ashah
la source