2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26

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 fais un ps -ef ? J'aimerais voir la “mémoire virtuelle”, la “mémoire de secours”, la “mémoire partagée” de chaque processus. Je peux l'obtenir via top, mais je veux les mêmes informations dans ps -ef afin de pouvoir faire passer la sortie à grep avec le nom de mon processus.

Réponses (8)

11
11
11
2015-03-11 13:16:28 +0000

La réponse de @user26528 ne calcule pas tout à fait correctement la mémoire - vous avez besoin de la somme des mappages dans les smaps, pas seulement de celui 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
11
11
11
2010-01-29 07:09:40 +0000

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 le % de la mémoire physique totale et la quantité d'espace d'échange qui serait nécessaire pour échanger le processus. Tout cela et bien d'autres choses encore sont documentées dans la page de manuel pour ps.

8
8
8
2012-02-04 10:26:12 +0000

Liste des processus par utilisation de la mémoire

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

7
7
7
2010-01-29 11:20:18 +0000

Obtenir l'utilisation de la mémoire par le biais de ps est assez peu fiable. Si vous avez un noyau plus récent, il devrait supporter /proc/pid#/smaps qui vous donne des informations détaillées sur l'utilisation mémoire de chaque processus. Vous trouverez ci-dessous un script assez sale et rapide pour passer en boucle chaque processus ouvert et obtenir la taille, l'utilisation Rss, Pss et Shared Clean/Dirty. Nous espérons qu'il pourra vous ê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
4
4
4
2010-01-29 04:20:47 +0000

vous pouvez utiliser

top -n 1
3
3
3
2016-09-23 15:51:44 +0000

Mise à jour :

La ligne unique 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 de lister tous les processus utilisateurs triés par la plus grande utilisation de 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 chemin complet du processus.

Le = supprime simplement le titre de la colonne.

3
3
3
2017-04-04 12:27:34 +0000

J'ai constaté que souvent le même processus a des sous-processus de bifurcation 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é la commande ci-dessous 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

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

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

3
3
3
2014-12-05 07:40:22 +0000

Liste des processus par utilisation de mem

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