web-dev-qa-db-fra.com

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

Sous Linux, comment puis-je afficher l'utilisation de la mémoire de chaque processus si je crée un ps -ef? Je voudrais voir la "mémoire virtuelle", "mémoire en mémoire", "mémoire partagée" de chaque progrès. Je peux obtenir cela via top, mais je veux les mêmes informations dans ps -ef afin de pouvoir diriger la sortie vers grep avec le nom de mon processus.

23
hap497

Obtenir l'utilisation de la mémoire via ps est assez peu fiable. Si vous avez un noyau plus récent, il devrait prendre en charge/proc/pid #/smaps, qui fournit 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 permettant de parcourir chaque processus ouvert et de saisir les utilisations Size, Rss, Pss et Shared Clean/Dirty. Espérons que cela puisse être utile d'une certaine manière.

#!/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
8
user26528

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

Je ne pouvais pas trouver d’option pour la mémoire partagée, mais j’avais trouvé des options pour le% de la mémoire physique totale et la quantité d’espace de swap nécessaire pour échanger le processus. Ceci et bien d’autres sont documentés dans la page de manuel de ps.

11
Justin Smith

La réponse de @ user26528 ne calcule pas correctement la mémoire - vous avez besoin de la somme des mappages dans les 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
9
evsmith

Lister les processus par utilisation de la mémoire

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

8
vasily-vm

vous pouvez utiliser

top -n 1
4
Am.

J'ai constaté que plusieurs fois le même processus a un processus secondaire et que 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 quantité totale de mémoire utilisée par chrome. J'ai trouvé ci-dessous une commande 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 s’occupe de beaucoup de 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 montre les données dans un format convivial.

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

3
ashah

Mettre à jour:

La ligne suivante fournit également des informations sur la consommation totale de mémoire de 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 la plus grande utilisation de la mémoire 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.

3
raratiru

Liste des processus par utilisation de mem

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

3
Jijo John