Frage

Diese Frage wird href="https://stackoverflow.com/q/63166/15161"> hier im Detail

Wie messen Sie die Speichernutzung einer Anwendung oder einen Prozess in Linux?

Aus dem Blog-Artikel von , ps ist kein genaues Werkzeug für diese Absicht zu verwenden.

  

Warum ps ist "falsch"

     

Je nachdem, wie man es betrachtet, ps ist die reale Speichernutzung von Prozessen nicht berichten. Was es wirklich tut, zeigt, wie viel Realspeicher jeder Prozess dauern würde , wenn es der einzige Prozess waren ausgeführt . Natürlich hat eine typische Linux-Maschine verarbeitet mehrere Dutzend zu einem bestimmten Zeitpunkt ausgeführt wird, was bedeutet, dass die VSZ und RSS von ps gemeldeten Zahlen sind fast auf jeden Fall falsch .

War es hilfreich?

Lösung

Mit ps oder ähnlichen Werkzeugen, die Sie bekommen nur die Größe des Speicher von diesem Prozess zugeordneten Seiten. Diese Zahl ist richtig, aber:

  • nicht die tatsächliche Größe des Speichers von der Anwendung verwendet reflektieren, nur die Menge an Speicher für sie reserviert

  • kann irreführend sein, wenn Seiten gemeinsam genutzt werden, beispielsweise durch mehrere Threads oder von dynamisch verknüpften Bibliotheken mit

Wenn Sie wirklich wissen wollen, was wie viel Speicher Ihre Anwendung tatsächlich verwendet, müssen Sie es in einem Profiler auszuführen. Zum Beispiel können Sie valgrind geben Einblicke über die Menge des verwendeten Speichers, und, was noch wichtiger ist, über mögliche Speicherlecks in Ihrem Programm. Das Heap-Profiler-Tool von valgrind ist 'Massiv' genannt:

  

Massif ist ein Haufen Profiler. Es führt detaillierte Heap-Profilierung durch regelmäßige Schnappschüsse eines Programms Haufen nehmen. Es erzeugt einen Graphen Heap-Nutzung über die Zeit zeigt, einschließlich Informationen darüber, welche Teile des Programms für die meisten Speicherzuordnungen verantwortlich sind. Die Grafik wird durch einen Text oder HTML-Datei ergänzt, die für die Bestimmung, wo die meisten Speicher mehr Informationen enthält, wird zugeordnet ist. Massivs führt Programme über 20x langsamer als normal.

Wie in der valgrind Dokumentation , müssen Sie das Programm zu durchlaufen valgrind:

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

Massif schreibt einen Dump der Speichernutzung Snapshots (z massif.out.12345). Diese bieten, (1) ein Zeitplan für die Speichernutzung, (2) für jeden Schnappschuss, eine Aufzeichnung, wo in Ihrem Programmspeicher zugeordnet wurde. Ein großes grafisches Tool für die Auswertung dieser Dateien ist Massiv-Visualizer . Aber ich fand ms_print, einen einfachen Text-basiertes Tool mit valgrind ausgeliefert, bereits eine große Hilfe zu sein.

Um Speicherlecks zu finden, verwenden Sie das (Standard) memcheck Werkzeug valgrind.

Andere Tipps

Versuchen Sie die pmap Befehl:

sudo pmap -x <process pid>

Hard sicher zu sagen, aber hier sind zwei „close“ Dinge, die helfen können.

$ ps aux 

geben Ihnen Virtuelle Größe (VSZ)

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

Das wichtigste ist die VmSize, die zu nah sein sollten, was ps aux gibt.

/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

In den letzten Versionen von Linux, verwenden Sie die smaps Subsystem. Zum Beispiel für einen Prozess mit der PID 1234:

cat /proc/1234/smaps

Es wird Ihnen genau sagen, wie viel Speicher es zu dieser Zeit verwendet. Noch wichtiger ist, wird es den Speicher in privaten teilen und gemeinsam genutzt, so können Sie, wie viel Speicher Sie Ihren Instanz des Programms ist es verwenden, ohne zwischen mehreren Instanzen des Programms gemeinsam genutzten Speicher inklusive.

Es gibt keinen einfachen Weg, dies zu berechnen. Aber einige Leute haben versucht, ein paar gute Antworten zu bekommen:

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

  • USS - Einzigartiges Set Größe. Dies ist die Menge des ungeteilten Speicher einzigartig für diesen Prozess (man denke an ihn als U für unique Speicher). Dabei spielt es keine gemeinsam genutzten Speicher umfasst. So wird diese 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 fügt die einzigartige Speicher (USS) zusammen, zusammen mit einem Teil seines Shared Memory durch die Anzahl anderer Prozesse aufgeteilt, die einen gemeinsamen Speicher. So wird es Ihnen eine genaue Darstellung, wie viel tatsächliche physische Speicher pro Prozess verwendet wird - mit gemeinsam genutzten Speicher wirklich als Shared vertreten. Denken Sie an die P ist für physischen Speicher.

Wie das RSS vergleicht, wie von ps und anderen utilties:

  • RSS - Resident Set Size. Dies ist die Menge des gemeinsam genutzten Speichers plus unshared Speicher von jedem Prozess verwendet. Wenn alle Prozesse einen gemeinsamen Speicher zu, dies wird über -report die Größe des Speichers tatsächlich verwendet wird, weil die gleiche Shared Memory mehr als einmal gezählt werden - erscheinen wieder in jedem anderen Prozess, der den gleichen Speicher teilt. So ist es recht unzuverlässig, insbesondere wenn hochGedächtnisProzesse viele Gabeln haben -., Die in einem Server gemeinsam ist, mit Dingen wie Apache oder PHP (fastcgi / FPM) Prozesse

Hinweis: smem kann auch (optional) Ausgangsgraphen wie Tortendiagramme und dergleichen. IMO brauchen Sie nichts davon. Wenn Sie es nur über die Befehlszeile verwenden möchten, wie Sie ps -A v verwenden könnte, dann brauchen Sie nicht über die Python-matplotlib empfohlen Abhängigkeit zu installieren.

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 Wurzel und Sie können von jedem Prozess einen klaren Ausgang für die Speichernutzung bekommen.

OUTPUT Beispiel:

     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] 

Was ist time?

Nicht die Bash builtin time aber diejenige, die Sie mit which time finden können, zum Beispiel /usr/bin/time

Hier ist, was es umfasst, auf einem einfachen 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

Dies ist eine ausgezeichnete Zusammenfassung der Werkzeuge und Probleme: archive.org Link

Ich werde es zitieren, so dass mehr Entwickler wird es tatsächlich lesen.

  

Wenn Sie die Speichernutzung des gesamten Systems analysieren möchten oder gründlich Speichernutzung einer Anwendung (nicht nur seine Heap-Nutzung), verwenden Sie exmap zu analysieren. Für ganze Systemanalyse finden Prozesse mit der höchsten effektiven Nutzung, sie in der Praxis die meisten Speicher nehmen, finden Prozesse mit der höchsten beschreibbaren Nutzung, sie schaffen die meisten Daten (und damit möglicherweise undicht werden oder sind sehr ineffektiv in ihre Datennutzung). eine solche Anwendung auswählen und ihre Zuordnungen in der zweiten Listenansicht analysieren. Siehe exmap Abschnitt für weitere Details. Verwenden Sie auch xrestop hohe Nutzung von X-Ressourcen zu überprüfen, vor allem, wenn der Prozess des X-Servers viel Speicher braucht. Siehe xrestop Abschnitt.

     

Wenn Sie möchten, um Lecks zu ermitteln, verwenden Sie valgrind oder möglicherweise kmtrace .

     

Wenn Sie wollen Haufen analysieren (malloc etc.) Nutzung einer Anwendung, entweder führen Sie es in memprof oder mit kmtrace , das Anwendungsprofil und den Funktionsaufruf suchen Baum für größte Zuweisungen. Sehen Sie die Abschnitte für weitere Details.

Neben den in deinen Antworten aufgelistet Lösungen, können Sie den Linux-Befehl „von oben“ verwenden; Es bietet eine dynamische Echtzeitansicht des laufenden Systems, es gibt die CPU und Speicherauslastung, für das gesamte System zusammen mit für jedes Programm, in Prozent:

top

durch ein Programm pid filtern:

top -p <PID>

durch einen Programmnamen filtern:

top | grep <PROCESS NAME>

"top" bietet auch einige Felder wie zum Beispiel:

VIRT - Virtual Image (kb): Die Gesamtmenge des virtuellen Speichers durch die Aufgabe verwendet

RES - Resident Größe (kb): Der nicht-ausgelagert physischer Speicher eine Aufgabe verwendet hat; RES = CODE + DATA.

DATA - Daten + Stack-Größe (kb). Die Menge an physikalischem Speicher für andere gewidmet als ausführbaren Code, der auch als 'Daten Resident Set' Größe oder DRS bekannt

SHR - Geteilt Mem Größe (kb): Die Menge des gemeinsam genutzten Speichers von einer Task verwendet. Es spiegelt einfach Speicher, der mit anderen Prozessen gemeinsam genutzt werden könnte möglicherweise.

Referenz hier .

Es gibt keine einzige Antwort auf diese, weil Sie nicht Punkt genau die Menge an Speicher ein Prozess verwendet Pin kann. Die meisten Prozesse unter Linux Shared Libraries. Zum Beispiel, sagen wir, Sie Speichernutzung für die ‚ls‘ Prozess berechnet werden soll. Zählen Sie nur die durch die ausführbare Datei ‚ls‘ verwendet Speicher (wenn Sie könnte es isolieren)? Wie wäre es libc? Oder all diese anderen Libs, die benötigt werden ‚ls‘ laufen?

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)

Man könnte argumentieren, dass sie von anderen Prozessen gemeinsam genutzt werden, aber ‚ls‘ kann nicht auf dem System ausgeführt werden, ohne dass sie geladen wird.

Auch wenn Sie müssen wissen, wie viel Speicher ein Prozess, um die Planung zu tun, müssen die Kapazitäten, müssen Sie berechnen, wie viel jede zusätzliche Kopie des Prozesses verwendet. Ich denke, / proc / PID / Status könnten Sie genug Informationen der Speichernutzung zu einem einzigen Zeitpunkt geben. Auf der anderen Seite, werden Sie valgrind geben ein besseres Profil der Speichernutzung während der gesamten Lebensdauer des Programms

Wenn Ihr Code in C oder C ++ Sie könnten in der Lage sein getrusage() zu verwenden, die Sie verschiedene Statistiken über Speicher- und Zeitnutzung des Prozesses zurück.

Nicht alle Plattformen unterstützen diese jedoch und 0 Werte für die Speichernutzung Optionen zurück.

Sie können stattdessen an der virtuellen Datei in /proc/[pid]/statm erstellt aussehen (wo [pid] durch Ihre Prozess-ID ersetzt wird. Sie dies aus getpid() erhalten können).

Diese Datei wird mit 7 Zahlen wie eine Textdatei suchen. Sie sind wahrscheinlich am meisten interessiert in der ersten (alle Speichernutzung) und sechsten (Datenspeicher verwenden) Zahlen in dieser Datei.

Valgrind können Detailinformationen anzeigen, aber es verlangsamt die Zielanwendung erheblich, und die meiste Zeit es das Verhalten der App ändert.
exmap war etwas, was ich wusste noch nicht, aber es scheint, dass Sie ein Kernel-Modul benötigen , um die Informationen zu erhalten, die ein Hindernis sein kann.

Ich gehe davon aus, was jeder will WRT „Speichernutzung“ wissen, wird der folgende ...
Unter Linux kann die Menge an physikalischem Speicher ein einzelner Prozess unterteilt werden können grob in folgende Kategorien.

  • m.a anonymer Map-Speicher

    • .p privat
      • .d schmutzig == malloc / mmapped Heap und Stack zugewiesen und geschrieben Speicher
      • .c sauber == malloc / mmapped Heap und Stack-Speicher einmal vergeben, geschrieben, dann befreit, aber nicht aufgearbeiteten noch
    • .S geteilt
      • .d schmutzig == malloc / mmaped Haufen copy-on-write und gemeinsam von den Prozessen bekommen konnte (bearbeitet)
      • .c sauber == malloc / mmaped Haufen copy-on-write und gemeinsam von den Prozessen bekommen konnte (bearbeitet)
  • m.n Namen abgebildet Speicher

    • .p privat
      • .d schmutzig == Datei geschrieben Speicher privaten mmapped
      • .c sauber == kartiert Programm / Bibliothekstext Privater kartiert
    • .S geteilt
      • .d schmutzig == Datei mmapped geschrieben gemeinsamen Speicher
      • .c sauber == Bibliothek Text eingebundenen gemeinsamen abgebildet

Utility in Android enthalten 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

Ich verwende htop; es ist ein sehr gutes Konsolenprogramm ähnlich dem Windows Task-Managers.

Valgrind ist erstaunlich, wenn Sie die Zeit, um es auszuführen haben. valgrind --tool=massif ist die richtige Lösung.

Aber ich fange größere Beispiele zu laufen, und valgrind Verwendung ist nicht mehr praktikabel. Gibt es eine Möglichkeit, die maximale Speichernutzung (Modulo Seitengröße und freigegebene Seiten) ein Programm zu sagen?

Auf einem echten Unix-System arbeitet /usr/bin/time -v. Unter Linux Dies schließt jedoch nicht Arbeit.

Drei weitere Methoden, um zu versuchen:

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

(Extrahiert von hier )

#!/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

Ein guter Test für die mehr „reale Welt“ Nutzung ist die Anwendung zu öffnen, dann läuft vmstat -s und überprüfen Sie die „aktive Speicher“ Statistik. Schließen Sie die Anwendung, einige Sekunden warten und laufen vmstat -s wieder. in offenbar im Gebrauch jedoch viel aktiver Speicher freigegeben wurde von der App war.

Wenn der Prozess nicht zu viel Speicher mit bis (entweder weil Sie erwarten, dass dies der Fall sein, oder ein anderer Befehl hat diese erste Indikation gegeben), und der Prozess standhalten kann, für eine kurze Zeit angehalten zu werden, Sie kann versuchen, den gcore Befehl zu verwenden.

gcore <pid>

Überprüfen Sie die Größe des erzeugten Core-Datei eine gute Vorstellung davon zu bekommen, wie viel Speicher ein bestimmter Prozess verwendet wird.

Das wird nicht so gut funktionieren, wenn Prozess Hunderte von megs oder Gigs verwenden, da die Kern Generation einige Sekunden oder Minuten dauern, je nach I / O-Leistung geschaffen werden. Während der Kern Schöpfung wird der Prozess (oder „eingefroren“) gestoppt Speicher Änderungen zu verhindern. Seien Sie also vorsichtig.

Auch den Mount-Punkt stellen Sie sicher, wo der Kern erzeugt wird, viel Speicherplatz und dass das System nicht negativ Datei auf den Kern reagiert in diesem speziellen Verzeichnis erstellt werden.

Unter Befehlszeile geben Sie den Gesamtspeicher von den verschiedenen laufenden Prozess verwendet auf der Linux-Maschine in MB

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}'

Ich bin mit Arch Linux und es gibt dieses wunderbare Paket namens ps_mem

ps_mem -p <pid>

Ausgabe

$ 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
=============================================

Get valgrind. geben Sie Ihr Programm auszuführen, und es wird Ihnen sagen, viel über seine Speichernutzung.

Dies würde nur für den Fall eines Programms gelten, die für einige Zeit und Anschläge läuft. Ich weiß nicht, ob valgrind kann seine Hände auf einem bereits laufenden Prozess oder shouldn't-Stop-Prozesse wie Daemons erhalten.

Edit: das funktioniert 100% nur gut, wenn Speicherverbrauch steigt

Wenn Sie die Speichernutzung überwachen mögen durch gegebene Verfahren (oder eine Gruppe von verarbeiteten Sharing gemeinsamen Namen, zum Beispiel google-chrome, können Sie meinen 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;

Dies wird kontinuierlich für Änderungen suchen und ausdrucken.

eingeben Bild Beschreibung hier

Wenn Sie etwas wollen, schneller als mit Valgrind Profilierung und der Kernel ist älter und Sie können nicht smaps verwenden, ein ps mit den Optionen des Resident Set des Prozesses zeigen (mit ps -o rss,command) können Sie ein schnelle und angemessene _aproximation_ die realen Menge an nicht vertauscht Speicher verwendet wird.

Ich würde vorschlagen, dass Sie oben auf verwenden. Sie können alles über sie auf dieser Seite finden. Es ist in der Lage alle notwendigen KPI für Ihre Prozesse zu schaffen und es kann auch in einer Datei erfassen.

Überprüfen Sie Shell-Skript zu überprüfen Speichernutzung durch die Anwendung unter Linux . Auch auf Github und in einer Version ohne Paste und bc .

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

Ich verwende den beiden Werkzeugen die ganze Zeit und immer mager, nicht undicht Code zu stolz dafür zu zeigen;)

Während diese Frage zu prüfen derzeit laufende Prozesse zu sein scheint, wollte ich den Spitzenwertspeicher von einer Anwendung verwendet, um sehen von Anfang bis Ende. Neben valgrind, können Sie tstime , das ist viel einfacher. Er misst die „High-Water“ Speichernutzung (RSS und virtuell). href="https://unix.stackexchange.com/a/18858/15954"> diese Antwort von

Mit dem eingebauten ' Systemmonitor ' GUI-Tool zur Verfügung in Ubuntu

Basierend auf Antwort auf eine ähnliche Frage .

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

Anforderungen:

  • das Gerät den Prozess ausgeführt wird, sollte haben snmp installiert und ausgeführt
  • snmp sollte Anfragen konfiguriert werden, zu akzeptieren, von wo aus Sie das Skript unten (kann es in snmpd.conf konfiguriert werden)
  • sollten Sie den Prozess-ID (pid) des Verfahrens wissen Sie überwachen möchten

Weitere Informationen:

  • HOST-RESOURCES-MIB :: hrSWRunPerfCPU ist die Anzahl der Zenti-Sekunden der von diesem Prozess verbraucht CPU-Ressourcen des Gesamtsystems. Man beachte, dass auf einem Multiprozessorsystem, wobei dieser Wert um mehr als eine centi-Sekunden erhöhen kann, in einer centi-Sekunden von real (Wanduhr) Zeit.

  • HOST-RESOURCES-MIB :: hrSWRunPerfMem ist die Gesamtmenge an realen Systemspeicher zu diesem Prozess zugeordnet werden.

**

Prozessüberwachung Skript:

**

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top