webentwicklung-frage-antwort-db.com.de

Wie kann man in Linux feststellen, wie viel Speicherprozesse verbrauchen?

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?

60

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 MByte

Andere 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 .

91

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
45
Greg Slepak

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"

34
Zaz

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 
16
Peter

Sie können pmap verwenden, um die Speichernutzung zu melden.

Zusammenfassung:

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

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
7
user3707180

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 "=================";
6
Paul Rubenstein

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
4
Bell

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" }'
4
Ilia Choly

Verwenden Sie top oder htop und achten Sie auf die Spalte "RES" (Resident Memory Size).

4
Gunther Piez

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
4
Brian C.

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

2
ballsystemlord

Verwenden

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

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
1
Costa