Wie kann die tatsächliche Speichernutzung einer Anwendung oder eines Prozesses gemessen werden?

712

Diese Frage wird hier ausführlich behandelt.

Wie messen Sie die Speichernutzung einer Anwendung oder eines Prozesses unter Linux?

Aus dem Blog-Artikel zum Verständnis der Speichernutzung unter Linux , dass dies pskein genaues Werkzeug für diese Absicht ist.

Warum psist "falsch"

Abhängig davon, wie Sie es betrachten, pswird nicht die tatsächliche Speichernutzung von Prozessen gemeldet. Was es wirklich tut, ist zu zeigen, wie viel realen Speicher jeder Prozess beanspruchen würde, wenn er der einzige Prozess wäre, der ausgeführt wird . Auf einem typischen Linux-Computer werden natürlich mehrere Dutzend Prozesse gleichzeitig ausgeführt, was bedeutet, dass die von gemeldeten VSZ- und RSS-Nummern psfast definitiv falsch sind .

ksuralta
quelle
6
Diese Frage gehört heutzutage wahrscheinlich stattdessen zu serverfault.com, obwohl sie mir sagt, dass sie "zu alt für eine Migration" ist. Ich will es aber eigentlich nicht schließen ...
Thomasrutter
Beziehen Sie sich auf diese Frage. stackoverflow.com/questions/669438/…
Bloodmoon
2
psZeigt eigentlich nicht einmal das an - es zeigt virtuelle und residente Speichernummern an, wobei virtuell die maximale Speichermenge ist, die der Prozess theoretisch verwenden könnte. Es war der einzige Prozess (niemals), der jede einzelne zugewiesene Seite verwendet (passiert nie). und keine Seiten zugeordnet oder aufgehoben (unwahrscheinlich). Während resident anzeigt, wie viel virtueller Speicher gerade physisch zugeordnet ist. Typischerweise ist es virt > usage > resjedoch auf einem 64-Bit-System virt ~= res*10ein sehr großer Bereich.
Dima Tisnek
5
Der Auszug aus dem verlinkten Artikel ist totaler Unsinn. Das RSS ist der tatsächlich verwendete physische Speicher, und die VSZ kann in die Verwendung des physischen Speichers übersetzt werden oder nicht, selbst wenn der Prozess der einzige war, der ausgeführt wurde.
David Schwartz

Antworten:

356

Mit psoder ähnlichen Tools erhalten Sie nur die Anzahl der durch diesen Prozess zugewiesenen Speicherseiten. Diese Nummer ist korrekt, aber:

  • spiegelt nicht die tatsächlich von der Anwendung verwendete Speichermenge wider, sondern nur die dafür reservierte Speichermenge

  • kann irreführend sein, wenn Seiten gemeinsam genutzt werden, z. B. von mehreren Threads oder mithilfe dynamisch verknüpfter Bibliotheken

Wenn Sie wirklich wissen möchten, wie viel Speicher Ihre Anwendung tatsächlich verwendet, müssen Sie ihn in einem Profiler ausführen. Sie können beispielsweise valgrindEinblicke in die verwendete Speichermenge und vor allem in mögliche Speicherverluste in Ihrem Programm erhalten. Das Heap-Profiler-Tool von valgrind heißt 'massif':

Massif ist ein Heap-Profiler. Es führt eine detaillierte Heap-Profilerstellung durch, indem regelmäßige Snapshots des Heaps eines Programms erstellt werden. Es wird ein Diagramm erstellt, das die Heap-Nutzung über die Zeit zeigt, einschließlich Informationen darüber, welche Teile des Programms für die meisten Speicherzuweisungen verantwortlich sind. Das Diagramm wird durch eine Text- oder HTML-Datei ergänzt, die weitere Informationen zum Bestimmen des Speicherplatzes enthält. Massif führt Programme etwa 20x langsamer als normal aus.

Wie in der Valgrind-Dokumentation erläutert , müssen Sie das Programm über Valgrind ausführen:

valgrind --tool=massif <executable> <arguments>

Massif schreibt einen Speicherauszug mit Snapshots zur Speichernutzung (z massif.out.12345. B. ). Diese bieten (1) eine Zeitleiste der Speichernutzung, (2) für jeden Schnappschuss eine Aufzeichnung darüber, wo in Ihrem Programmspeicher Speicher zugewiesen wurde. Ein großartiges grafisches Werkzeug zur Analyse dieser Dateien ist der Massif-Visualizer . Aber ich habe gefundenms_print , dass ein einfaches textbasiertes Tool, das mit valgrind geliefert wurde, bereits eine große Hilfe war.

Verwenden Sie das (Standard-) memcheckTool von valgrind, um Speicherlecks zu finden .

ypnos
quelle
44
Um die von valgrind generierten Ergebnisse zu interpretieren, kann ich alleyoop empfehlen. Es ist nicht allzu ausgefallen und sagt Ihnen einfach, was Sie wissen müssen, um Lecksquellen zu lokalisieren. Ein schönes Paar Dienstprogramme.
Dan
6
Punkt (a) ist korrekt. Es gibt einen Unterschied zwischen den verwendeten Seiten und dem tatsächlich von der Anwendung über Aufrufe von malloc (), new usw. zugewiesenen Speicher. Die residente Verwendung zeigt nur, wie viel des ausgelagerten Speichers im RAM resident ist.
Jcoffland
63
Dies sagt nicht wirklich aus, wie man mit valgrind die Speichernutzung erhält?
Matt Joiner
11
Das Standard-Valgrind-Tool memcheck ist nützlich, um Speicherlecks zu erkennen, aber es ist nicht wirklich ein Speicherprofiler. Dafür möchten Sie valgrind --tool = massif.
Todd befreit
3
@ DavidSchwartz Ich sehe nicht, wie deine Aussage meiner widerspricht. Ich habe das Gefühl, dass Sie zu besorgt darüber sind, dass ich "falsch" liege, als tatsächlich zu lesen, was ich sage. Mein ganzer Punkt hier ist, dass RSS ein unangemessenes Maß für die tatsächliche Speichernutzung der Anwendung ist, und Sie machen in Ihren letzten beiden Sätzen genau den gleichen Punkt. Was war Ihrer Meinung nach der Grund für mich, die RSS-Schrumpfung überhaupt erst zur Sprache zu bringen? Damit Sie es mir zurückschreiben, um mich durch genau das, worauf ich mich beziehe, als "falsch" zu beweisen? Ihre Einstellung zu mir ist ermüdend.
Ypnos
280

Versuchen Sie den Befehl pmap :

sudo pmap -x <process pid>
Anil
quelle
45
Mit sudo ausführen oder es gibt keinen Fehler und es wird kein Speicher belegt.
Matt
22
Existiert nicht unter OSX (für alle, die von Google hierher kommen)
jcollum
3
Das ist eine vollständige Antwort auf die Frage! ps. In meiner Shell kann pmap den Vorgang ohne sudo lesen.
MasterControlProgram
7
Zu OS X (anscheinend nicht das Anliegen des OP) können Sie einige ähnliche Daten mit vmmap (1) sehen
jrg
Hinweis: gibt eine völlig andere Antwort alsgnome-system-monitor
Ribamar
190

Schwer zu sagen, aber hier sind zwei "enge" Dinge, die helfen können.

$ ps aux 

gibt Ihnen Virtual Size (VSZ)

Sie können auch detaillierte Statistiken aus dem / proc-Dateisystem abrufen, indem Sie auf gehen /proc/$pid/status

Das wichtigste ist das VmSize, das nahe an dem liegen sollte, was es ps auxgibt.

/ proc / 19420 $ Katzenstatus
Name: Firefox
Zustand: S (schlafend)
Tgid: 19420
Pid: 19420
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Gruppen: 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
Themen: 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
freiwillige_ctxt_switches: 63422
nicht freiwillige_ctxt_switches: 7171

DustinB
quelle
21
Vermisse ich etwas Die Frage lautete, wie die Speichernutzung durch einen Prozess besser gemessen werden kann, da VSZ und RSS in ps irreführend sind. In Ihrer Antwort erfahren Sie, wie Sie die VSZ nachschlagen - der gleiche Wert, der als irreführend bezeichnet wurde.
Thomasrutter
16
@thomasrutter Ja, Ihnen fehlt die ursprüngliche Frage (Rev. 1), sie wurde mehrmals bearbeitet und ist ziemlich alt (2008). In der ursprünglichen Frage wurde nur gefragt, wie die Speichernutzung eines Prozesses gemessen werden soll. Sie können jedoch Fragen und Antworten bearbeiten, wenn die Dinge veraltet sind. :)
DustinB
1
Hinweis: gibt eine völlig andere Antwort alsgnome-system-monitor
Ribamar
131

Verwenden Sie in neueren Linux-Versionen das Smaps- Subsystem. Zum Beispiel für einen Prozess mit einer PID von 1234:

cat /proc/1234/smaps

Hier erfahren Sie genau, wie viel Speicher zu diesem Zeitpunkt verwendet wird. Noch wichtiger ist, dass der Speicher in private und gemeinsam genutzte Speicher aufgeteilt wird, sodass Sie feststellen können, wie viel Speicher Ihre Instanz des Programms verwendet, ohne den von mehreren Instanzen des Programms gemeinsam genutzten Speicher einzubeziehen.

Paul Biggar
quelle
Ich denke, es pmapist eine einfachere Schnittstelle dazu.
Ribamar
126

Es gibt keine einfache Möglichkeit, dies zu berechnen. Aber einige Leute haben versucht, gute Antworten zu bekommen:

Bash
quelle
schöne Ausgaben eine saubere Auflistung von Speicher und Prozess
Rubytastic
Sehr schön, mit ziemlich kluger Gruppierung.
Rohmer
Ja, ganz nett. Ich finde ps_memund smemsehr nützlich für Endbenutzermaßnahmen, während z. pmapDie sehr detaillierte Ausgabe ist auf Entwickler ausgerichtet ... ermöglicht das Abrufen der Speichernutzung von Firefox für alle Schriftarten, Addons und Bibliotheken, zum Beispiel. Vielen Dank an alle exp. @Bash, @thomasruther.
Tuk0z
Dieser ist bis jetzt der einzige, der der Ausgabe vongnome-system-monitor
Ribamar
110

Verwenden Sie smem , eine Alternative zu ps , mit der USS und PSS pro Prozess berechnet werden. Was Sie wollen, ist wahrscheinlich die PSS.

  • USS - Einzigartige Setgröße. Dies ist die Menge an nicht gemeinsam genutztem Speicher, die für diesen Prozess eindeutig ist (stellen Sie sich U als eindeutigen Speicher vor). Shared Memory ist nicht enthalten. So dies wird unter -report die Größe des Speichers ein Verfahren verwendet, aber es ist hilfreich , wenn Sie gemeinsam benutzten Speicher ignorieren wollen.

  • PSS - Proportional Set Size. Das ist, was du willst. Es addiert den eindeutigen Speicher (USS) zusammen mit einem Teil seines gemeinsam genutzten Speichers geteilt durch die Anzahl der Prozesse, die diesen Speicher gemeinsam nutzen. Auf diese Weise erhalten Sie eine genaue Darstellung, wie viel tatsächlicher physischer Speicher pro Prozess verwendet wird - wobei der gemeinsam genutzte Speicher tatsächlich als gemeinsam genutzt dargestellt wird. Denken Sie an das P für das physische Gedächtnis.

Wie ist dies im Vergleich zu RSS, wie von ps und anderen Dienstprogrammen berichtet:

  • RSS - Resident Set Size. Dies ist die Menge an gemeinsam genutztem Speicher plus nicht gemeinsam genutztem Speicher, die von jedem Prozess verwendet wird. Wenn alle Prozesse gemeinsamen Speicher, wird dies über -report die Menge des verwendeten Speichers tatsächlich, weil die gleiche Shared Memory mehr gezählt werden als einmal - erscheint wieder in jedem anderen Verfahren , dass die Aktien der gleiche Speicher. Daher ist es ziemlich unzuverlässig, insbesondere wenn Prozesse mit hohem Arbeitsspeicher viele Gabeln haben - was auf einem Server bei Dingen wie Apache- oder PHP-Prozessen (fastcgi / FPM) üblich ist.

Hinweis: smem kann auch (optional) Diagramme wie Kreisdiagramme und dergleichen ausgeben. IMO brauchst du nichts davon. Wenn Sie es nur über die Befehlszeile verwenden möchten, wie Sie möglicherweise ps-A v verwenden, müssen Sie die von python-matplotlib empfohlene Abhängigkeit nicht installieren.

thomasrutter
quelle
2
Ein kritischer Punkt bei RSS ist, dass die meisten Anwendungen heutzutage viele Codepages gemeinsam nutzen. Jede gemeinsam genutzte Bibliothek (z. B. libc und libstdc ++) wird für jeden Prozess gezählt, der sie verwendet. Und wenn mehrere Instanzen eines Prozesses ausgeführt werden, wird der gesamte Code doppelt gezählt.
David C.
1
Genau deshalb meldet RSS in Bezug auf das tatsächliche physische Gedächtnis pro Prozess zu viel.
Thomasrutter
3
smem ist was ich brauchte. Wenn ich es jedes Mal mit -t ausführe, wenn ich eine neue Prozessinstanz starte, kann ich den Speicher sehen, den jede Instanz belegt. Für Chrom: smem -t -P '/ opt / google /
chrome
Es fällt mir schwer, eine Dokumentation für smem zu finden. Wird sie standardmäßig in Bytes, Kilobytes oder Megabytes ausgegeben?
ZN13
4
TL; DR: USS = Menge des physischen Speichers, der freigegeben wird, wenn der Prozess beendet wird, PSS = Menge des physischen Speichers, den dieser Prozess vom System benötigt, wenn keine vorhandenen Prozesse beendet werden, RSS = Menge des physischen Speichers, auf den zugegriffen werden kann dieser Vorgang (aber nicht immer exklusiver Zugriff).
Mikko Rantalainen
95
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

Wenn Sie dies als Root verwenden, erhalten Sie von jedem Prozess eine eindeutige Ausgabe für die Speichernutzung.

AUSGABEBEISPIEL:

     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] 
Lokendra Singh Rawat
quelle
1
Gibt es eine Möglichkeit, die Liste so zu filtern, dass nur Prozesse vorhanden sind, die beispielsweise 30 Sekunden lang mehr als 25% des Speichers belegen? Ich versuche zu sehen, wie Prozesse wie der Chrome-Browser bei Verwendung eines PHPEclipse-Debuggers ausgeführt werden.
Stephane
Dieser Filter wäre fantastisch
Aleix
1
Ich werde das veröffentlichen, sobald ich kann.
Lokendra Singh Rawat
2
Großartig! Die Schleife sollte jedoch beginnen, x=2um auch pid und user auszugeben.
Boris Brodski
70

Wie wäre es mit time ?

Nicht der eingebaute Bash,time sondern der, mit dem Sie which timezum Beispiel finden können/usr/bin/time

Hier ist, was es auf einfache Weise abdeckt ls:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
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): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Mondkind
quelle
Ich bin auch. Auf diese Weise profiliere ich Aufgaben in powercron.eu :)
Moonchild
5
brew install gnu-timedann verwenden, gtimewenn Sie unter macOS sind.
Nobu
4
Nachteil: Die Ergebnisse werden erst angezeigt, wenn der Prozess seine Ausführung abgeschlossen hat. Kann nicht zur Echtzeitüberwachung des laufenden Prozesses verwendet werden.
Makesh
/ usr / bin / time -f '% M'
Infomaniac
1
Sie können es auch mit \ time aufrufen (mit einem Backslash, um die interne Zeit der Shell nicht zu verwenden).
Raúl Salinas-Monteagudo
39

Dies ist eine hervorragende Zusammenfassung der Tools und Probleme: Link archive.org

Ich werde es zitieren, damit mehr Entwickler es tatsächlich lesen.

Wenn Sie die Speichernutzung des gesamten Systems oder die Speichernutzung einer Anwendung (nicht nur die Heap-Nutzung) gründlich analysieren möchten , verwenden Sie exmap . Finden Sie für die Analyse des gesamten Systems Prozesse mit der höchsten effektiven Nutzung, beanspruchen Sie in der Praxis den meisten Speicher, finden Sie Prozesse mit der höchsten beschreibbaren Nutzung, erstellen Sie die meisten Daten (und verlieren Sie daher möglicherweise oder sind in ihrer Datennutzung sehr ineffektiv). Wählen Sie eine solche Anwendung aus und analysieren Sie ihre Zuordnungen in der zweiten Listenansicht. Weitere Informationen finden Sie im Abschnitt exmap. Verwenden Sie xrestop auch , um die hohe Auslastung der X-Ressourcen zu überprüfen, insbesondere wenn der Prozess des X-Servers viel Speicherplatz beansprucht . Weitere Informationen finden Sie im Abschnitt xrestop.

Wenn Sie Lecks erkennen möchten, verwenden Sie Valgrind oder möglicherweise kmtrace .

Wenn Sie die Heap-Nutzung (Malloc usw.) einer Anwendung analysieren möchten, führen Sie sie entweder in memprof oder mit kmtrace aus , profilieren Sie die Anwendung und durchsuchen Sie den Funktionsaufrufbaum nach den größten Zuordnungen. Weitere Informationen finden Sie in den entsprechenden Abschnitten.

Phoku
quelle
28

Neben den in Ihren Antworten aufgeführten Lösungen können Sie den Linux-Befehl "top" verwenden. Es bietet eine dynamische Echtzeitansicht des laufenden Systems, die CPU- und Speicherauslastung für das gesamte System sowie für jedes Programm in Prozent:

top

nach einer Programm-PID filtern:

top -p <PID>

nach einem Programmnamen filtern:

top | grep <PROCESS NAME>

"top" bietet auch einige Felder wie:

VIRT - Virtual Image (kb): Die Gesamtmenge des von der Aufgabe verwendeten virtuellen Speichers

RES - Resident Size (kb): Der nicht ausgelagerte physische Speicher, den eine Aufgabe verwendet hat. RES = CODE + DATA.

DATA - Data + Stack size (kb): Die Menge an physischem Speicher, die nicht für ausführbaren Code verwendet wird, auch als DRS-Größe (Data Resident Set Set) bezeichnet.

SHR - Shared Mem Size (kb): Die Menge an Shared Memory, die von einer Task verwendet wird. Es spiegelt einfach den Speicher wider, der möglicherweise mit anderen Prozessen geteilt werden könnte.

Referenz hier .

Yahya Yahyaoui
quelle
20

Es gibt keine einzige Antwort darauf, da Sie nicht genau bestimmen können, wie viel Speicher ein Prozess verwendet. Die meisten Prozesse unter Linux verwenden gemeinsam genutzte Bibliotheken. Angenommen, Sie möchten die Speichernutzung für den Prozess 'ls' berechnen. Zählen Sie nur den Speicher, der von der ausführbaren Datei 'ls' verwendet wird (wenn Sie ihn isolieren könnten)? Wie wäre es mit libc? Oder all diese anderen Bibliotheken, die benötigt werden, um 'ls' auszuführen?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

Sie könnten argumentieren, dass sie von anderen Prozessen gemeinsam genutzt werden, aber 'ls' kann nicht auf dem System ausgeführt werden, ohne dass sie geladen werden.

Wenn Sie wissen möchten, wie viel Speicher ein Prozess für die Kapazitätsplanung benötigt, müssen Sie außerdem berechnen, wie viel jede zusätzliche Kopie des Prozesses verwendet. Ich denke, / proc / PID / status gibt Ihnen möglicherweise genug Informationen über die Speichernutzung auf einmal. Auf der anderen Seite erhalten Sie mit valgrind ein besseres Profil der Speichernutzung während der gesamten Lebensdauer des Programms

Dprado
quelle
Ich versuche herauszufinden, wie viel Speicher ein Prozess auf einer VM belegt, und möchte dies verwenden, um das Speicherlimit in Kubernetes einzurichten. Ich stimme dieser Antwort zu und werde daher den vonpmap
Deepak Deore
16

Wenn sich Ihr Code in C oder C ++ befindet, können Sie ihn möglicherweise verwenden getrusage() verschiedene Statistiken zur Speicher- und Zeitnutzung Ihres Prozesses verwenden.

Dies wird jedoch nicht von allen Plattformen unterstützt und es werden 0 Werte für die Speicherverwendungsoptionen zurückgegeben.

Stattdessen können Sie sich die in erstellte virtuelle Datei ansehen /proc/[pid]/statm(wobei diese [pid]durch Ihre Prozess-ID ersetzt wird. Sie können diese von erhalten getpid()).

Diese Datei sieht aus wie eine Textdatei mit 7 Ganzzahlen. Sie interessieren sich wahrscheinlich am meisten für die erste (alle Speichernutzung) und sechste (Datenspeichernutzung) Nummer in dieser Datei.

Goldesel
quelle
Beachten Sie, dass dies nicht auf allen Plattformen unterstützt wird.
CashCow
Laut der Linux-Manpage ( linux.die.net/man/2/getrusage ) ist getrusage Teil der SVr4-, 4.3BSD- und POSIX.1-2001-Spezifikationen (wobei POSIX nur die Felder utime und stime angibt). I. Ich würde nicht erwarten, dass es auf Nicht-UNIX-Plattformen funktioniert (außer vielleicht über eine Umgebung wie Cygwin, die UNIX-Funktionen für andere Plattformen bereitstellt).
David C.
@ DavidC. Das OP fragt nach Linux.
Alexis Wilke
@CashCow, meintest du getpid(), weil ich keine getprocessid()Funktion in C / C ++ unter Linux kenne .
Alexis Wilke
12

Valgrind kann detaillierte Informationen anzeigen, verlangsamt jedoch die Zielanwendung erheblich und ändert meistens das Verhalten der App.
Exmap war etwas, das ich noch nicht wusste, aber es scheint, dass Sie ein Kernelmodul benötigen , um die Informationen zu erhalten, was ein Hindernis sein kann.

Ich gehe davon aus, dass jeder wissen möchte, dass WRT "Speichernutzung" Folgendes ist ...
Unter Linux kann die Menge an physischem Speicher, die ein einzelner Prozess möglicherweise verwendet, grob in die folgenden Kategorien unterteilt werden.

  • Ein anonymer zugeordneter Speicher

    • .p privat
      • .d dirty == malloc / mmapped Heap und Stack zugewiesener und geschriebener Speicher
      • .c clean == malloc / mmapped Heap- und Stack-Speicher, sobald er zugewiesen, geschrieben und dann freigegeben, aber noch nicht zurückgefordert wurde
    • .s geteilt
      • .d schmutzig == malloc / mmaped Heap könnte beim Schreiben kopiert und zwischen Prozessen geteilt werden (bearbeitet)
      • .c sauber == malloc / mmaped Heap könnte beim Schreiben kopiert und zwischen Prozessen geteilt werden (bearbeitet)
  • Mn benannter zugeordneter Speicher

    • .p privat
      • .d schmutzig == Datei mmapped geschriebener Speicher privat
      • .c clean == zugeordneter Programm- / Bibliothekstext privat zugeordnet
    • .s geteilt
      • .d schmutzig == Datei mmapped geschriebener Speicher gemeinsam genutzt
      • .c clean == zugeordneter Bibliothekstext, der gemeinsam zugeordnet ist

Das in Android enthaltene Dienstprogramm namens showmap ist sehr nützlich

virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL
Holmes
quelle
10

Drei weitere Methoden zum Ausprobieren:

  1. ps aux --sort pmem
    Es sortiert die Ausgabe nach %MEM.
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    Es sortiert mit Rohren.
  3. top -a
    Es beginnt von oben zu sortieren %MEM

(Auszug aus hier )

Thomas Shaiker
quelle
2
topund wahrscheinlich geben die anderen keine genaue Darstellung des tatsächlich vom Prozess verwendeten Speichers. Zum Beispiel habe ich 64 GB RAM und 10 postgresProzesse, die jeweils 16 GB RES und 25% MEM melden. Natürlich können sie nicht alle 25% verwenden ... Jeder hat auch 15GiB SHR, und es scheint, dass sie das teilen.
Sudo
8
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'\n'

for line in $(</proc/$1/smaps)
do
   [[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb
pokute
quelle
5
ksh ist eine Standard-Shell. Es ist möglicherweise nicht standardmäßig in Linux- Distributionen für Desktop-Benutzer oder für minimalistische Zwecke installiert , aber in fast jedem Unix- / Linux-Betriebssystem ist es nur einen Befehl entfernt. (dh auf allen BSDs, auf allen echten UNIX, auf RHEL, auf SLES, auf Debian, auf Ubuntu, auf OSX)
Florian Heigl
Auf diese Datei kann standardmäßig nur Root-Benutzer zugreifen.
Dmitry Ginzburg
Das Folgende ist nur das oben sed | awkGenannte, das in Busybox v1.23.2 umgeschrieben wurde und funktioniert: sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Ján Sáreník
1
@Catskul - Der POSIX-Standard spezifiziert seine Standard-Shell als strikte Teilmenge der Korn-Shell, einer erweiterten Version der Bourne-Shell.
Ceph3us
8

Ich benutze htop; Es ist ein sehr gutes Konsolenprogramm ähnlich dem Windows Task Manager.

Tomasz Dzięcielewski
quelle
Ich habe verwendet htopund ist besser als top, aber es zeigt dir trotzdem alle Threads von verschiedenen Apps, ohne sie zu gruppieren, was es fast so nutzlos macht wie top.
Sorin
1
$ htop -p $ (pgrep <Ihr Prozessname> | xargs | tr '' ',')
AAAfarmclub
6

Wenn der Prozess nicht zu viel Speicher belegt (entweder weil Sie erwarten, dass dies der Fall ist, oder weil ein anderer Befehl diesen ersten Hinweis gegeben hat) und der Prozess für kurze Zeit angehalten werden kann, können Sie dies versuchen Verwenden Sie den Befehl gcore.

gcore <pid>

Überprüfen Sie die Größe der generierten Kerndatei, um eine gute Vorstellung davon zu erhalten, wie viel Speicher ein bestimmter Prozess verwendet.

Dies funktioniert nicht gut, wenn der Prozess Hunderte von Megabyte oder Gigs verwendet, da die Erstellung der Kerngenerierung je nach E / A-Leistung einige Sekunden oder Minuten dauern kann. Während der Kernerstellung wird der Prozess gestoppt (oder "eingefroren"), um Speicheränderungen zu verhindern. Also sei vorsichtig.

Stellen Sie außerdem sicher, dass der Einhängepunkt, an dem der Kern generiert wird, über ausreichend Speicherplatz verfügt und dass das System nicht negativ auf die in diesem bestimmten Verzeichnis erstellte Kerndatei reagiert.

Rocco Corsi
quelle
6

Ich benutze Arch Linux und es gibt dieses wunderbare Paket namens ps_mem

ps_mem -p <pid>

Beispielausgabe

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================
GypsyCosmonaut
quelle
5

Unter der Befehlszeile finden Sie den Gesamtspeicher, der von den verschiedenen auf dem Linux-Computer ausgeführten Prozessen in MB verwendet wird

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 "" }' | awk '{total=total + $1} END {print total}'
Vineeth
quelle
5

Ein guter Test für die Verwendung in der "realen Welt" besteht darin, die Anwendung zu öffnen, die vmstat -sStatistik "aktiver Speicher" auszuführen und zu überprüfen. Schließen Sie die Anwendung, warten Sie einige Sekunden und führen Sie sie vmstat -serneut aus. Wie viel aktiver Speicher freigegeben wurde, wurde offenbar von der App verwendet.

Nick W.
quelle
3
Wie wäre das besser als ps? Es kommt mit allen Einschränkungen von ps und ist noch ungenauer ...
Lester Cheung
Ein typisches Unix-System hat viele Prozesse, die ständig gestartet und beendet werden. Sie können Ihren freien Arbeitsspeicher nicht vorhersagen.
Raúl Salinas-Monteagudo
4

Holen Sie sich Valgrind. Geben Sie ihm Ihr Programm zum Ausführen, und es wird Ihnen viel über seine Speichernutzung erzählen.

Dies gilt nur für ein Programm, das einige Zeit ausgeführt wird und stoppt. Ich weiß nicht, ob valgrind einen bereits laufenden Prozess in die Hände bekommen kann oder Prozesse wie Dämonen nicht stoppen sollte.

DarenW
quelle
Nein, es ist nicht möglich, valgrind an einen laufenden Prozess anzuhängen. Das ist beabsichtigt.
Dima Tisnek
3

Bearbeiten: Dies funktioniert nur dann zu 100%, wenn der Speicherverbrauch steigt

Wenn Sie die Speichernutzung anhand eines bestimmten Prozesses (oder einer Gruppe verarbeiteter gemeinsamer Namen für die gemeinsame Nutzung) überwachen möchten google-chrome, können Sie beispielsweise mein Bash-Skript verwenden:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

Dadurch wird kontinuierlich nach Änderungen gesucht und diese gedruckt.

Geben Sie hier die Bildbeschreibung ein

test30
quelle
3

Wenn Sie etwas schnelleres als die Profilerstellung mit Valgrind möchten und Ihr Kernel älter ist und Sie keine Smaps verwenden können, können Sie mit einem ps mit den Optionen zum Anzeigen des residenten Satzes des Prozesses (mit ps -o rss,command) schnell und vernünftig einen Überblick _aproximation_über die tatsächliche Menge von erhalten Nicht getauschter Speicher wird verwendet.

Juanjux
quelle
3

Ich würde vorschlagen, dass Sie oben verwenden. Alles dazu finden Sie auf dieser Seite . Es kann alle erforderlichen KPIs für Ihre Prozesse bereitstellen und in einer Datei erfassen.

Jain Rach
quelle
2
Um die PSIZE ["proportionale Speichergröße dieses Prozesses (oder Benutzers)] anzuzeigen, starten Sie oben mit atop -R. Um einen Zusammenfassungs-Push pro Benutzer anzuzeigen p, um nach Speichernutzung zu sortieren, drücken Sie 'M' von oben. Dies ergibt ähnliche Zahlen wie smem.
Markus Strauss
1

Eine weitere Abstimmung für hier, aber ich möchte hinzufügen, dass Sie ein Tool wie Alleyoop verwenden können , um die von valgrind generierten Ergebnisse zu interpretieren.

Ich benutze die beiden Tools die ganze Zeit und habe immer schlanken, nicht leckenden Code, um stolz darauf zu zeigen;)

Dan
quelle
1

Während es bei dieser Frage anscheinend darum geht, derzeit laufende Prozesse zu untersuchen, wollte ich den von einer Anwendung verwendeten Anfangsspeicher von Anfang bis Ende sehen. Neben valgrind können Sie auch tstime verwenden , was viel einfacher ist. Es misst die "Hochwasser" -Speicherauslastung (RSS und virtuell). Aus dieser Antwort .

jtpereyda
quelle
Die meisten Anwendungen - dh diejenigen, die malloc () - und malloc-ähnliche Speicherbibliotheken verwenden - geben Seiten erst nach Beendigung des Prozesses an das Betriebssystem zurück. Die Menge, die Sie mit PS (oder einem anderen Tool, das sich nicht in den Haufen des Prozesses gräbt) sehen, ist also die Hochwassermarke.
David C.
0

Basierend auf der Antwort auf eine verwandte Frage .

Sie können SNMP verwenden, um den Speicher und die CPU-Auslastung eines Prozesses in einem bestimmten Gerät im Netzwerk abzurufen :)

Bedarf:

  • Auf dem Gerät, auf dem der Prozess ausgeführt wird, sollte snmp installiert sein und ausgeführt werden
  • snmp sollte so konfiguriert sein, dass Anforderungen akzeptiert werden, von denen aus Sie das folgende Skript ausführen (möglicherweise in snmpd.conf konfiguriert).
  • Sie sollten die Prozess-ID (pid) des Prozesses kennen, den Sie überwachen möchten

Anmerkungen:

  • HOST-RESOURCES-MIB :: hrSWRunPerfCPU ist die Anzahl der Centi-Sekunden der CPU-Ressourcen des Gesamtsystems, die von diesem Prozess verbraucht werden. Beachten Sie, dass auf einem Multiprozessorsystem dieser Wert in einer Centi-Sekunde Echtzeit (Wanduhr) um mehr als eine Centi-Sekunde erhöht werden kann.

  • HOST-RESOURCES-MIB :: hrSWRunPerfMem ist die Gesamtmenge des diesem Prozess zugewiesenen realen Systemspeichers.

** **.

Prozessüberwachungsskript:

** **.

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done
Roselyn Verbo Domingo
quelle
0

/ prox / xxx / numa_maps gibt dort einige Infos: N0 = ??? N1 = ???. Dieses Ergebnis kann jedoch niedriger sein als das tatsächliche Ergebnis, da nur diejenigen gezählt werden, die berührt wurden.

ptan
quelle
-1

Verwenden Sie das in Ubuntu verfügbare integrierte GUI-Tool " Systemmonitor "

Sudheesh.MS
quelle
1
Zumindest seit dem 16.04 funktioniert das sehr gut. Es ist sehr ähnlich wie oben, der verwendete Speicher ist nicht extrem genau ...
Alexis Wilke