929 Stimmen

Wie kann ich den tatsächlichen Speicherverbrauch einer Anwendung oder eines Prozesses messen?

Wie misst man den Speicherverbrauch einer Anwendung oder eines Prozesses in Linux?

In dem Blog-Artikel von Understanding memory usage on Linux ist ps kein genau richtiges Tool für diesen Zweck.

Warum ps "falsch" ist

Je nachdem, wie man es betrachtet, meldet ps nicht den tatsächlichen Speicherverbrauch von Prozessen. Was es wirklich tut, ist zu zeigen, wie viel echten Speicher jeder Prozess einnehmen würde, wenn er der einzige laufende Prozess wäre. Natürlich hat eine typische Linux-Maschine zu jedem beliebigen Zeitpunkt mehrere Dutzend Prozesse laufen, was bedeutet, dass die von ps gemeldeten VSZ- und RSS-Zahlen fast sicher falsch sind.

(Hinweis: Diese Frage wird <a href="https://stackoverflow.com/q/63166/15161">hier</a> sehr ausführlich behandelt.)

11 Stimmen

Diese Frage gehört wahrscheinlich heutzutage eher auf serverfault.com, obwohl es mir sagt, dass sie "zu alt zum Migrieren" ist. Möchte es allerdings nicht wirklich scließen...

0 Stimmen

Beziehen Sie sich auf diese Frage. stackoverflow.com/questions/669438/…

4 Stimmen

Tatsächlich zeigt ps nicht einmal das - es zeigt virtuelle und residente Speicherzahlen, wobei virtuelle die maximale Menge an Speicher ist, die der Prozess theoretisch nutzen könnte, wenn er der einzige Prozess wäre (niemals so), jede einzelne Seite, die er allokiert hat, verwendet (nie passiert) und keine Seiten abbildet oder abbildet oder entmappen (unwahrscheinlich). Während residente anzeigt, wie viel virtueller Speicher gerade physisch zugeordnet ist. Normalerweise virt > Nutzung > res jedoch auf einem 64-Bit-System virt ~= res*10 ist es eine sehr große Bandbreite.

451voto

ypnos Punkte 47895

Mit ps oder ähnlichen Tools erhalten Sie nur die Anzahl der vom Prozess allokierten Speicherseiten. Diese Zahl ist korrekt, aber:

  • spiegelt nicht die tatsächliche Menge an Speicher wider, die von der Anwendung verwendet wird, sondern nur die für sie reservierte Menge an Speicher.

  • kann irreführend sein, wenn Seiten gemeinsam genutzt werden, z. B. durch mehrere Threads oder durch die Verwendung von dynamisch verknüpften Bibliotheken.

Wenn Sie wirklich wissen möchten, wie viel Speicher Ihre Anwendung tatsächlich verwendet, müssen Sie sie mit einem Profiler ausführen. Zum Beispiel kann Ihnen Valgrind Einblicke in die verwendete Speichermenge geben und vor allem mögliche Speicherlecks in Ihrem Programm aufzeigen. Das Heap-Profiler-Tool von Valgrind heißt 'massif':

Massif ist ein Heap-Profiler. Er führt eine detaillierte Heap-Profilerstellung durch, indem er regelmäßig Schnappschüsse des Heaps eines Programms aufnimmt. Er erstellt einen Graphen, der die Heap-Nutzung im Laufe der Zeit zeigt, einschließlich Informationen darüber, welche Teile des Programms für die meisten Speicherzuweisungen verantwortlich sind. Der Graph wird durch eine Text- oder HTML-Datei ergänzt, die zusätzliche Informationen zur Bestimmung des Ortes enthält, an dem der meiste Speicher allokiert wird. Massif führt Programme etwa 20x langsamer als normal aus.

Wie in der Valgrind-Dokumentation erklärt, müssen Sie das Programm durch Valgrind ausführen:

valgrind --tool=massif  

Massif schreibt ein Dump von Speichernutzungsschnappschüssen (z. B. massif.out.12345). Diese bieten (1) einen Zeitplan der Speichernutzung, (2) für jeden Schnappschuss einen Bericht darüber, wo im Programm Speicher allokiert wurde. Ein großartiges grafisches Tool zur Analyse dieser Dateien ist massif-visualizer. Aber ich fand ms_print, ein einfaches textbasiertes Tool, das mit Valgrind geliefert wird, bereits sehr hilfreich.

Verwenden Sie zur Suche nach Speicherlecks das (standardmäßige) memcheck-Tool von Valgrind.

Neuere Tools, die ich selbst noch nicht ausprobiert habe, sind HeapTrack und der Heap-Profiler in gperftools.

46 Stimmen

Um die Ergebnisse, die von Valgrind generiert werden, zu interpretieren, kann ich Alleyoop empfehlen. Es ist nicht zu ausgefallen und sagt Ihnen einfach, was Sie wissen müssen, um die Quellen von Speicherlecks zu lokalisieren. Ein praktisches Paar von Dienstprogrammen.

2 Stimmen

Das Element (a) ist nicht korrekt. ps zeigt sowohl die virtuelle Größe als auch den tatsächlichen Speicherverbrauch an, was die tatsächliche Anzahl der Seitencodes des Prozesses ist.

8 Stimmen

Das Element (a) ist korrekt. Es gibt einen Unterschied zwischen den verwendeten Seiten und dem tatsächlich vom Programm über Aufrufe von malloc(), new usw. allozierten Speicher. Die Resident-Nutzung zeigt nur, wie viel vom gepufferten Speicher im RAM vorhanden ist.

356voto

Anil Punkte 3199

Versuchen Sie den pmap Befehl:

sudo pmap -x

50 Stimmen

Führen Sie es mit sudo aus, sonst gibt es keine Fehlermeldung und es wird kein Speicher verbraucht angezeigt.

32 Stimmen

Existiert nicht unter OSX (für alle, die über Google hierher kommen)

8 Stimmen

Das ist eine vollständige Antwort auf die Frage! ps. In meiner Shell kann pmap den Prozess ohne sudo lesen.

212voto

DustinB Punkte 10743

Es ist schwer zu sagen, aber hier sind zwei "nahe" Dinge, die helfen können.

$ ps aux

gibt dir Virtual Size (VSZ)

Detaillierte Statistiken kannst du auch vom /proc Dateisystem erhalten, indem du zu /proc/$pid/status gehst.

Am wichtigsten ist die VmSize, die nah an dem sein sollte, was ps aux liefert.

/proc/19420$ cat status
Name:      firefox
State:     S (sleeping)
Tgid:      19420
Pid:       19420
PPid:      1
TracerPid: 0
Uid:       1000    1000    1000    1000
Gid:       1000    1000    1000    1000
FDSize:    256
Groups:    4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak:    222956 kB
VmSize:    212520 kB
VmLck:          0 kB
VmHWM:     127912 kB
VmRSS:     118768 kB
VmData:    170180 kB
VmStk:        228 kB
VmExe:         28 kB
VmLib:      35424 kB
VmPTE:        184 kB
Threads:   8
SigQ:      0/16382
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000000000
SigIgn:    0000000020001000
SigCgt:    000000018000442f
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
Cpus\_allowed:    03
Mems\_allowed:    1
voluntary\_ctxt\_switches:    63422
nonvoluntary\_ctxt\_switches: 7171

28 Stimmen

Fehlt mir etwas? Die Frage lautete, wie der Speicherverbrauch eines Prozesses besser gemessen werden kann, da die in ps gemeldeten Werte von VSZ und RSS irreführend sind. Ihre Antwort erläutert, wie man den VSZ nachschlägt - denselben Wert, der als irreführend bezeichnet wurde.

24 Stimmen

@thomasrutter Ja, du verpasst die originale Frage (rev 1), sie wurde mehrmals bearbeitet und ist ziemlich alt (2008). Die originale Frage hat nur gefragt, wie man den Speicherverbrauch eines Prozesses messen kann. Fühle dich frei, Fragen und Antworten zu bearbeiten, wenn sie veraltet sind. :)

1 Stimmen

Hinweis: gibt eine völlig andere Antwort als gnome-system-monitor

197voto

ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1

Verwenden Sie dies als Root und Sie erhalten eine klare Ausgabe für die Speichernutzung durch jeden Prozess.

Beispiel für die Ausgabe:

     0.00 Mb COMMAND
  1288.57 Mb /usr/lib/firefox
   821.68 Mb /usr/lib/chromium/chromium
   762.82 Mb /usr/lib/chromium/chromium
   588.36 Mb /usr/sbin/mysqld
   547.55 Mb /usr/lib/chromium/chromium
   523.92 Mb /usr/lib/tracker/tracker
   476.59 Mb /usr/lib/chromium/chromium
   446.41 Mb /usr/bin/gnome
   421.62 Mb /usr/sbin/libvirtd
   405.11 Mb /usr/lib/chromium/chromium
   302.60 Mb /usr/lib/chromium/chromium
   291.46 Mb /usr/lib/chromium/chromium
   284.56 Mb /usr/lib/chromium/chromium
   238.93 Mb /usr/lib/tracker/tracker
   223.21 Mb /usr/lib/chromium/chromium
   197.99 Mb /usr/lib/chromium/chromium
   194.07 Mb conky
   191.92 Mb /usr/lib/chromium/chromium
   190.72 Mb /usr/bin/mongod
   169.06 Mb /usr/lib/chromium/chromium
   155.11 Mb /usr/bin/gnome
   136.02 Mb /usr/lib/chromium/chromium
   125.98 Mb /usr/lib/chromium/chromium
   103.98 Mb /usr/lib/chromium/chromium
    93.22 Mb /usr/lib/tracker/tracker
    89.21 Mb /usr/lib/gnome
    80.61 Mb /usr/bin/gnome
    77.73 Mb /usr/lib/evolution/evolution
    76.09 Mb /usr/lib/evolution/evolution
    72.21 Mb /usr/lib/gnome
    69.40 Mb /usr/lib/evolution/evolution
    68.84 Mb nautilus
    68.08 Mb zeitgeist
    60.97 Mb /usr/lib/tracker/tracker
    59.65 Mb /usr/lib/evolution/evolution
    57.68 Mb apt
    55.23 Mb /usr/lib/gnome
    53.61 Mb /usr/lib/evolution/evolution
    53.07 Mb /usr/lib/gnome
    52.83 Mb /usr/lib/gnome
    51.02 Mb /usr/lib/udisks2/udisksd
    50.77 Mb /usr/lib/evolution/evolution
    50.53 Mb /usr/lib/gnome
    50.45 Mb /usr/lib/gvfs/gvfs
    50.36 Mb /usr/lib/packagekit/packagekitd
    50.14 Mb /usr/lib/gvfs/gvfs
    48.95 Mb /usr/bin/Xwayland :1024
    46.21 Mb /usr/bin/gnome
    42.43 Mb /usr/bin/zeitgeist
    42.29 Mb /usr/lib/gnome
    41.97 Mb /usr/lib/gnome
    41.64 Mb /usr/lib/gvfs/gvfsd
    41.63 Mb /usr/lib/gvfs/gvfsd
    41.55 Mb /usr/lib/gvfs/gvfsd
    41.48 Mb /usr/lib/gvfs/gvfsd
    39.87 Mb /usr/bin/python /usr/bin/chrome
    37.45 Mb /usr/lib/xorg/Xorg vt2
    36.62 Mb /usr/sbin/NetworkManager
    35.63 Mb /usr/lib/caribou/caribou
    34.79 Mb /usr/lib/tracker/tracker
    33.88 Mb /usr/sbin/ModemManager
    33.77 Mb /usr/lib/gnome
    33.61 Mb /usr/lib/upower/upowerd
    33.53 Mb /usr/sbin/gdm3
    33.37 Mb /usr/lib/gvfs/gvfsd
    33.36 Mb /usr/lib/gvfs/gvfs
    33.23 Mb /usr/lib/gvfs/gvfs
    33.15 Mb /usr/lib/at
    33.15 Mb /usr/lib/at
    30.03 Mb /usr/lib/colord/colord
    29.62 Mb /usr/lib/apt/methods/https
    28.06 Mb /usr/lib/zeitgeist/zeitgeist
    27.29 Mb /usr/lib/policykit
    25.55 Mb /usr/lib/gvfs/gvfs
    25.55 Mb /usr/lib/gvfs/gvfs
    25.23 Mb /usr/lib/accountsservice/accounts
    25.18 Mb /usr/lib/gvfs/gvfsd
    25.15 Mb /usr/lib/gvfs/gvfs
    25.15 Mb /usr/lib/gvfs/gvfs
    25.12 Mb /usr/lib/gvfs/gvfs
    25.10 Mb /usr/lib/gnome
    25.10 Mb /usr/lib/gnome
    25.07 Mb /usr/lib/gvfs/gvfsd
    24.99 Mb /usr/lib/gvfs/gvfs
    23.26 Mb /usr/lib/chromium/chromium
    22.09 Mb /usr/bin/pulseaudio
    19.01 Mb /usr/bin/pulseaudio
    18.62 Mb (sd
    18.46 Mb (sd
    18.30 Mb /sbin/init
    18.17 Mb /usr/sbin/rsyslogd
    17.50 Mb gdm
    17.42 Mb gdm
    17.09 Mb /usr/lib/dconf/dconf
    17.09 Mb /usr/lib/at
    17.06 Mb /usr/lib/gvfs/gvfsd
    16.98 Mb /usr/lib/at
    16.91 Mb /usr/lib/gdm3/gdm
    16.86 Mb /usr/lib/gvfs/gvfsd
    16.86 Mb /usr/lib/gdm3/gdm
    16.85 Mb /usr/lib/dconf/dconf
    16.85 Mb /usr/lib/dconf/dconf
    16.73 Mb /usr/lib/rtkit/rtkit
    16.69 Mb /lib/systemd/systemd
    13.13 Mb /usr/lib/chromium/chromium
    13.13 Mb /usr/lib/chromium/chromium
    10.92 Mb anydesk
     8.54 Mb /sbin/lvmetad
     7.43 Mb /usr/sbin/apache2
     6.82 Mb /usr/sbin/apache2
     6.77 Mb /usr/sbin/apache2
     6.73 Mb /usr/sbin/apache2
     6.66 Mb /usr/sbin/apache2
     6.64 Mb /usr/sbin/apache2
     6.63 Mb /usr/sbin/apache2
     6.62 Mb /usr/sbin/apache2
     6.51 Mb /usr/sbin/apache2
     6.25 Mb /usr/sbin/apache2
     6.22 Mb /usr/sbin/apache2
     3.92 Mb bash
     3.14 Mb bash
     2.97 Mb bash
     2.95 Mb bash
     2.93 Mb bash
     2.91 Mb bash
     2.86 Mb bash
     2.86 Mb bash
     2.86 Mb bash
     2.84 Mb bash
     2.84 Mb bash
     2.45 Mb /lib/systemd/systemd
     2.30 Mb (sd
     2.28 Mb /usr/bin/dbus
     1.84 Mb /usr/bin/dbus
     1.46 Mb ps
     1.21 Mb openvpn hackthebox.ovpn
     1.16 Mb /sbin/dhclient
     1.16 Mb /sbin/dhclient
     1.09 Mb /lib/systemd/systemd
     0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data
     0.97 Mb /lib/systemd/systemd
     0.96 Mb /lib/systemd/systemd
     0.89 Mb /usr/sbin/smartd
     0.77 Mb /usr/bin/dbus
     0.76 Mb su
     0.76 Mb su
     0.76 Mb su
     0.76 Mb su
     0.76 Mb su
     0.76 Mb su
     0.75 Mb sudo su
     0.75 Mb sudo su
     0.75 Mb sudo su
     0.75 Mb sudo su
     0.75 Mb sudo su
     0.75 Mb sudo su
     0.74 Mb /usr/bin/dbus
     0.71 Mb /usr/lib/apt/methods/http
     0.68 Mb /bin/bash /usr/bin/mysqld_safe
     0.68 Mb /sbin/wpa_supplicant
     0.66 Mb /usr/bin/dbus
     0.61 Mb /lib/systemd/systemd
     0.54 Mb /usr/bin/dbus
     0.46 Mb /usr/sbin/cron
     0.45 Mb /usr/sbin/irqbalance
     0.43 Mb logger
     0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }
     0.40 Mb /usr/bin/ssh
     0.34 Mb /usr/lib/chromium/chrome
     0.32 Mb cut
     0.32 Mb cut
     0.00 Mb [kthreadd]
     0.00 Mb [ksoftirqd/0]
     0.00 Mb [kworker/0:0H]
     0.00 Mb [rcu_sched]
     0.00 Mb [rcu_bh]
     0.00 Mb [migration/0]
     0.00 Mb [lru
     0.00 Mb [watchdog/0]
     0.00 Mb [cpuhp/0]
     0.00 Mb [cpuhp/1]
     0.00 Mb [watchdog/1]
     0.00 Mb [migration/1]
     0.00 Mb [ksoftirqd/1]
     0.00 Mb [kworker/1:0H]
     0.00 Mb [cpuhp/2]
     0.00 Mb [watchdog/2]
     0.00 Mb [migration/2]
     0.00 Mb [ksoftirqd/2]
     0.00 Mb [kworker/2:0H]
     0.00 Mb [cpuhp/3]
     0.00 Mb [watchdog/3]
     0.00 Mb [migration/3]
     0.00 Mb [ksoftirqd/3]
     0.00 Mb [kworker/3:0H]
     0.00 Mb [kdevtmpfs]
     0.00 Mb [netns]
     0.00 Mb [khungtaskd]
     0.00 Mb [oom_reaper]
     0.00 Mb [writeback]
     0.00 Mb [kcompactd0]
     0.00 Mb [ksmd]
     0.00 Mb [khugepaged]
     0.00 Mb [crypto]
     0.00 Mb [kintegrityd]
     0.00 Mb [bioset]
     0.00 Mb [kblockd]
     0.00 Mb [devfreq_wq]
     0.00 Mb [watchdogd]
     0.00 Mb [kswapd0]
     0.00 Mb [vmstat]
     0.00 Mb [kthrotld]
     0.00 Mb [ipv6_addrconf]
     0.00 Mb [acpi_thermal_pm]
     0.00 Mb [ata_sff]
     0.00 Mb [scsi_eh_0]
     0.00 Mb [scsi_tmf_0]
     0.00 Mb [scsi_eh_1]
     0.00 Mb [scsi_tmf_1]
     0.00 Mb [scsi_eh_2]
     0.00 Mb [scsi_tmf_2]
     0.00 Mb [scsi_eh_3]
     0.00 Mb [scsi_tmf_3]
     0.00 Mb [scsi_eh_4]
     0.00 Mb [scsi_tmf_4]
     0.00 Mb [scsi_eh_5]
     0.00 Mb [scsi_tmf_5]
     0.00 Mb [bioset]
     0.00 Mb [kworker/1:1H]
     0.00 Mb [kworker/3:1H]
     0.00 Mb [kworker/0:1H]
     0.00 Mb [kdmflush]
     0.00 Mb [bioset]
     0.00 Mb [kdmflush]
     0.00 Mb [bioset]
     0.00 Mb [jbd2/sda5
     0.00 Mb [ext4
     0.00 Mb [kworker/2:1H]
     0.00 Mb [kauditd]
     0.00 Mb [bioset]
     0.00 Mb [drbd
     0.00 Mb [irq/27
     0.00 Mb [i915/signal:0]
     0.00 Mb [i915/signal:1]
     0.00 Mb [i915/signal:2]
     0.00 Mb [ttm_swap]
     0.00 Mb [cfg80211]
     0.00 Mb [kworker/u17:0]
     0.00 Mb [hci0]
     0.00 Mb [hci0]
     0.00 Mb [kworker/u17:1]
     0.00 Mb [iprt
     0.00 Mb [iprt
     0.00 Mb [kworker/1:0]
     0.00 Mb [kworker/3:0]
     0.00 Mb [kworker/0:0]
     0.00 Mb [kworker/2:0]
     0.00 Mb [kworker/u16:0]
     0.00 Mb [kworker/u16:2]
     0.00 Mb [kworker/3:2]
     0.00 Mb [kworker/2:1]
     0.00 Mb [kworker/1:2]
     0.00 Mb [kworker/0:2]
     0.00 Mb [kworker/2:2]
     0.00 Mb [kworker/0:1]
     0.00 Mb [scsi_eh_6]
     0.00 Mb [scsi_tmf_6]
     0.00 Mb [usb
     0.00 Mb [bioset]
     0.00 Mb [kworker/3:1]
     0.00 Mb [kworker/u16:1]

1 Stimmen

Gibt es eine Möglichkeit, die Liste so zu filtern, dass nur Prozesse angezeigt werden, die beispielsweise mehr als 25 % des Speichers für etwa 30 Sekunden verwenden? Ich versuche, entlaufene Prozesse zu identifizieren, wie den Chrome-Browser beim Verwenden eines PHPEclipse-Debuggers.

0 Stimmen

Dieses Filter wäre großartig

2 Stimmen

Ich werde das so schnell wie möglich posten.

163voto

Paul Biggar Punkte 25771

In den neuesten Versionen von Linux verwenden Sie das smaps-Subsystem. Zum Beispiel für einen Prozess mit einer PID von 1234:

cat /proc/1234/smaps

Es wird Ihnen genau sagen, wie viel Speicher es zu diesem Zeitpunkt verwendet. Noch wichtiger ist, dass es den Speicher in privat und geteilt aufteilt, so dass Sie sagen können, wie viel Speicher Ihre Instanz des Programms verwendet, ohne den Speicher einzubeziehen, der zwischen mehreren Instanzen des Programms geteilt wird.

1 Stimmen

Ich denke, dass pmap eine einfachere Schnittstelle dazu ist.

3 Stimmen

Diese Antwort ist Gold wert für Embedded-Systeme, die kein pmap haben.

13 Stimmen

Das bietet eine Menge Informationen. Wofür kann ich greifen, um den tatsächlichen Gesamtspeicher zu erhalten, der verwendet wird?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X