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?
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 MoLes 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 .
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
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"
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
Vous pouvez utiliser pmap pour signaler l'utilisation de la mémoire.
Synopsis:
pmap [ -x | -d ] [ -q ] pids...
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
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 "=================";
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
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" }'
Utilisez top
ou htop
et faites attention à la colonne "RES" (taille de la mémoire résidente).
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
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
Utilisation
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