web-dev-qa-db-fra.com

Sous Linux, comment savoir combien de processus mémoire utilisent?

Je pense que mon application LAMP présente peut-être une fuite de mémoire (la mémoire est épuisée, l'échange commence à être utilisé, etc.). Si je pouvais voir la quantité de mémoire utilisée par les divers processus, cela pourrait m'aider à résoudre mon problème. Existe-t-il un moyen pour moi de voir cette information dans * nix?

60

Obtenir une utilisation correcte de la mémoire est plus délicat qu'on pourrait le penser. La meilleure façon que je pourrait trouver est :

echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc

Où "PROCESS" est le nom du processus que vous voulez inspecter et "TYPE" est l'un des suivants:

  • Rss: utilisation de la mémoire résidente, toute la mémoire utilisée par le processus, y compris toute la mémoire que ce processus partage avec d'autres processus. Cela n'inclut pas l'échange;
  • Shared: mémoire que ce processus partage avec d'autres processus;
  • Private: mémoire privée utilisée par ce processus, vous pouvez rechercher les fuites de mémoire ici;
  • Swap: mémoire d'échange utilisée par le processus;
  • Pss: Taille du jeu proportionnel, un bon indicateur de mémoire globale. C'est le Rss ajusté pour le partage: si un processus a 1 Mo privé et 20 Mo partagés entre 10 autres processus, Pss est 1 + 20/10 = 3 Mo

Les autres valeurs valides sont Size (c'est-à-dire la taille virtuelle qui n'a presque pas de sens) et Referenced (la quantité de mémoire actuellement marquée comme référencée ou consultée).

Vous pouvez utiliser watch ou un autre serveur bash-script-fu pour surveiller ces valeurs pour les processus que vous souhaitez surveiller.

Pour plus d'informations sur smaps: http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

91
Giuseppe Cardone

Je ne sais pas pourquoi la réponse semble si compliquée ... Cela semble assez simple de faire cela avec ps:

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}

Exemple d'utilisation:

$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
45
Greg Slepak

Utilisez ps pour trouver l'ID de processus de l'application, puis utilisez top -p1010 _ (remplacez 1010 par l'ID de processus réel). La colonne RES est la mémoire physique utilisée et la colonne VIRT est la mémoire virtuelle utilisée, y compris les bibliothèques et la mémoire permutée.

Plus d'informations peuvent être trouvées en utilisant "man top"

34
Zaz

D'abord obtenir le pid:

ps ax | grep [process name]

Et alors:

top -p PID

Vous pouvez regarder différents processus en même temps:

top -p PID1 -p PID2 
16
Peter

Vous pouvez utiliser pmap pour signaler l'utilisation de la mémoire.

Synopsis:

pmap [ -x | -d ] [ -q ] pids... 
13
Sunil Bojanapally

Approche plus élégante:

echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done
7
user3707180

Merci. J'ai utilisé cela pour créer ce script bash simple qui peut être utilisé pour surveiller un processus et son utilisation de la mémoire:

$ watch watchmypid.sh

#!/bin/bash
#

PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`

echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps  | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps  | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps  | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`

Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`

echo "Rss     " $Rss
echo "Shared  " $Shared
echo "Private " $Private
echo "Swap    " $Swap
echo "Pss     " $Pss
echo "=================";
echo "Mem     " $Mem
echo "=================";
6
Paul Rubenstein

Si vous n'avez pas de processus en cours ou long à suivre, vous pouvez utiliser /usr/bin/time.

Ce n'est pas la même chose que Bash time (comme vous le verrez).

Par exemple

# /usr/bin/time -f "%M" echo

2028

Il s'agit de "Taille maximale définie par le résident du processus au cours de son exécution, en kilo-octets" (extrait de la page de manuel). C'est la même chose que RES dans top et al.

Il y a beaucoup plus que vous pouvez obtenir de /usr/bin/time.

# /usr/bin/time -v echo

Command being timed: "echo"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
4
Bell

Vous pouvez utiliser pmap + awk.

Très probablement, nous nous intéressons à la mémoire RSS qui est la 3ème colonne de la dernière ligne de l'exemple pmap sortie ci-dessous (82564).

$ pmap -x <pid>

Address           Kbytes     RSS   Dirty Mode   Mapping

....

00007f9caf3e7000       4       4       4 r----  ld-2.17.so
00007f9caf3e8000       8       8       8 rw---  ld-2.17.so
00007fffe8931000     132      12      12 rw---    [ stack ]
00007fffe89fe000       8       8       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          688584   82564    9592

Awk est ensuite utilisé pour extraire cette valeur.

$ pmap -x <pid> | awk '/total/ { print $4 "K" }'

Les valeurs pmap sont en kilo-octets. Si nous le voulions en mégaoctets, nous pourrions faire quelque chose comme ceci.

$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
4
Ilia Choly

Utilisez top ou htop et faites attention à la colonne "RES" (taille de la mémoire résidente).

4
Gunther Piez

L'outil que vous voulez, c'est ps. Pour obtenir des informations sur ce que font les Java):

ps -F -C Java 

Pour obtenir des informations sur http:

ps -F -C httpd

Si votre programme se termine avant que vous n'ayez une chance de l'exécuter, ouvrez un autre terminal et exécutez:

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
4
Brian C.

Pourquoi toutes ces réponses compliquées avec différents scripts Shell? Utilisez htop, cela change automatiquement les tailles et vous pouvez sélectionner les informations que vous voulez afficher et cela fonctionne dans le terminal, de sorte qu'il ne nécessite pas de bureau. Exemple: htop -d8

2
ballsystemlord

Utilisation

  • ps u `pidof $ TASKS_LIST` ou ps u-$ TASK
  • ps xu --sort% mem
  • ps h -o pmem -C $ TASK

Exemple:

ps-of()
{
 ps u `pidof "$@"`
}

$ ps-of firefox
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const    18464  5.9  9.4 1190224 372496 ?      Sl   11:28   0:33 /usr/lib/firefox/firefox

$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;\$q;N;6,\$D;ba'"
$ ps-mem 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const     3656  0.0  0.4 565728 18648 ?        Sl   Nov21   0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const    11361  0.3  0.5 1054156 20372 ?       Sl   Nov25  43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const     3402  0.0  0.5 1415848 23328 ?       Sl   Nov21   1:16 nautilus -n
const     3577  2.3  2.0 1534020 79844 ?       Sl   Nov21 410:02 konsole
const    18464  6.6 12.7 1317832 501580 ?      Sl   11:28   1:34 /usr/lib/firefox/firefox

$ ps h -o pmem -C firefox
12.7
1
Costa