Ich glaube, in meiner LAMP-Anwendung ist möglicherweise ein Speicherverlust aufgetreten (Speicher wird aufgebraucht, der Austausch beginnt, sich zu verbrauchen usw.). Wenn ich sehen könnte, wie viel Speicher die verschiedenen Prozesse verwenden, könnte es mir helfen, mein Problem zu lösen. Gibt es eine Möglichkeit für mich, diese Informationen in * nix zu sehen?
Die richtige Speichernutzung ist schwieriger als man denkt. Der beste Weg, den ich finden könnte, ist :
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
Wobei "PROCESS" der Name des Prozesses ist, den Sie überprüfen möchten, und "TYPE" einer der folgenden ist:
Rss
: residente Speichernutzung, der gesamte vom Prozess verwendete Speicher, einschließlich des gesamten Speichers, den dieser Prozess mit anderen Prozessen gemeinsam nutzt. Swap ist nicht inbegriffen.Shared
: Speicher, den dieser Prozess mit anderen Prozessen teilt;Private
: Privater Speicher, der von diesem Prozess verwendet wird. Hier können Sie nach Speicherlecks suchen.Swap
: Vom Prozess verwendeter Swap-Speicher;Pss
: Proportionale eingestellte Größe, ein guter Gesamtspeicherindikator. Dies ist der Rss, der für die gemeinsame Nutzung angepasst wurde: Wenn ein Prozess 1 MByte privat und 20 MByte von 10 anderen Prozessen gemeinsam genutzt wird, ist Pss 1 + 20/10 = 3 MByteAndere gültige Werte sind Size
(dh virtuelle Größe, die fast bedeutungslos ist) und Referenced
(die Menge an Speicher, die derzeit als referenziert markiert ist oder auf die zugegriffen wird).
Sie können watch
oder ein anderes bash-script-fu verwenden, um die Werte für die zu überwachenden Prozesse im Auge zu behalten.
Weitere Informationen zu smaps
: http://www.kernel.org/doc/Documentation/filesystems/proc.txt .
Ich weiß nicht, warum die Antwort so kompliziert zu sein scheint ... Es scheint ziemlich einfach zu sein, dies mit ps
zu tun:
mem()
{
ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i [email protected] | awk '{printf $1/1024 "MB"; $1=""; print }'
}
Anwendungsbeispiel:
$ 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
Verwenden Sie ps
, um die Prozess-ID für die Anwendung zu finden, und verwenden Sie dann top -p1010
(Ersatz 1010 für die reale Prozess-ID). Die RES-Spalte ist der verwendete physische Speicher und die VIRT-Spalte ist der verwendete virtuelle Speicher - einschließlich Bibliotheken und ausgelagertem Speicher.
Weitere Informationen finden Sie unter "man top"
Zuerst die PID holen:
ps ax | grep [process name]
Und dann:
top -p PID
Sie können verschiedene Prozesse gleichzeitig beobachten:
top -p PID1 -p PID2
Sie können pmap verwenden, um die Speichernutzung zu melden.
Zusammenfassung:
pmap [ -x | -d ] [ -q ] pids...
Eleganter Ansatz:
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
Vielen Dank. Ich habe damit dieses einfache Bash-Skript erstellt, mit dem ein Prozess und seine Speichernutzung überwacht werden können:
$ 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 "=================";
Falls Sie keinen aktuellen oder lang andauernden Prozess zum Verfolgen haben, können Sie /usr/bin/time
Verwenden.
Dies ist nicht dasselbe wie Bash time
(wie Sie sehen werden).
Z.B
# /usr/bin/time -f "%M" echo
2028
Dies ist "Maximale Größe des residenten Satzes des Prozesses während seiner Lebensdauer in Kilobyte" (aus der Manpage zitiert). Das heißt, dasselbe wie bei RES in top
et al.
Es gibt noch viel mehr, das Sie von /usr/bin/time
Erhalten können.
# /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
Sie können pmap
+ awk
verwenden.
Höchstwahrscheinlich interessieren wir uns für den RSS
Speicher, der die dritte Spalte in der letzten Zeile der folgenden Ausgabe des Beispiels pmap
ist (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 wird dann verwendet, um diesen Wert zu extrahieren.
$ pmap -x <pid> | awk '/total/ { print $4 "K" }'
Die pmap
Werte sind in Kilobyte. Wenn wir es in Megabyte wollten, könnten wir so etwas tun.
$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
Verwenden Sie top
oder htop
und achten Sie auf die Spalte "RES" (Resident Memory Size).
Das gewünschte Tool ist ps. Um Informationen darüber zu erhalten, was Java Programme tun:
ps -F -C Java
Informationen zu http erhalten:
ps -F -C httpd
Wenn Ihr Programm endet, bevor Sie die Möglichkeit haben, diese auszuführen, öffnen Sie ein anderes Terminal und führen Sie Folgendes aus:
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
Warum all diese komplizierten Antworten mit verschiedenen Shell-Skripten? Wenn Sie htop verwenden, werden die Größen automatisch geändert, und Sie können auswählen, welche Informationen angezeigt werden sollen. Das Programm funktioniert im Terminal, sodass kein Desktop erforderlich ist. Beispiel: htop -d8
Verwenden
Beispiel:
ps-of()
{
ps u `pidof "[email protected]"`
}
$ 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