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 ps
kein genaues Werkzeug für diese Absicht ist.
Warum
ps
ist "falsch"Abhängig davon, wie Sie es betrachten,
ps
wird 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-Nummernps
fast definitiv falsch sind .
ps
Zeigt 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 esvirt > usage > res
jedoch auf einem 64-Bit-Systemvirt ~= res*10
ein sehr großer Bereich.Antworten:
Mit
ps
oder ä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
valgrind
Einblicke in die verwendete Speichermenge und vor allem in mögliche Speicherverluste in Ihrem Programm erhalten. Das Heap-Profiler-Tool von valgrind heißt 'massif':Wie in der Valgrind-Dokumentation erläutert , müssen Sie das Programm über Valgrind ausführen:
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-)
memcheck
Tool von valgrind, um Speicherlecks zu finden .quelle
Versuchen Sie den Befehl pmap :
quelle
gnome-system-monitor
Schwer zu sagen, aber hier sind zwei "enge" Dinge, die helfen können.
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 aux
gibt.quelle
gnome-system-monitor
Verwenden Sie in neueren Linux-Versionen das Smaps- Subsystem. Zum Beispiel für einen Prozess mit einer PID von 1234:
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.
quelle
pmap
ist eine einfachere Schnittstelle dazu.Es gibt keine einfache Möglichkeit, dies zu berechnen. Aber einige Leute haben versucht, gute Antworten zu bekommen:
quelle
ps_mem
undsmem
sehr nützlich für Endbenutzermaßnahmen, während z.pmap
Die 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.gnome-system-monitor
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:
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.
quelle
Wenn Sie dies als Root verwenden, erhalten Sie von jedem Prozess eine eindeutige Ausgabe für die Speichernutzung.
AUSGABEBEISPIEL:
quelle
x=2
um auch pid und user auszugeben.Wie wäre es mit
time
?Nicht der eingebaute Bash,
time
sondern der, mit dem Siewhich time
zum Beispiel finden können/usr/bin/time
Hier ist, was es auf einfache Weise abdeckt
ls
:quelle
brew install gnu-time
dann verwenden,gtime
wenn Sie unter macOS sind.Dies ist eine hervorragende Zusammenfassung der Tools und Probleme: Link archive.org
Ich werde es zitieren, damit mehr Entwickler es tatsächlich lesen.
quelle
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:
nach einer Programm-PID filtern:
nach einem Programmnamen filtern:
"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 .
quelle
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?
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
quelle
pmap
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 erhaltengetpid()
).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.
quelle
getpid()
, weil ich keinegetprocessid()
Funktion in C / C ++ unter Linux kenne .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
Mn benannter zugeordneter Speicher
Das in Android enthaltene Dienstprogramm namens showmap ist sehr nützlich
quelle
Drei weitere Methoden zum Ausprobieren:
ps aux --sort pmem
Es sortiert die Ausgabe nach
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Es sortiert mit Rohren.
top -a
Es beginnt von oben zu sortieren
%MEM
(Auszug aus hier )
quelle
top
und wahrscheinlich geben die anderen keine genaue Darstellung des tatsächlich vom Prozess verwendeten Speichers. Zum Beispiel habe ich 64 GB RAM und 10postgres
Prozesse, 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.quelle
sed | awk
Genannte, 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}'
Ich benutze
htop
; Es ist ein sehr gutes Konsolenprogramm ähnlich dem Windows Task Manager.quelle
htop
und 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.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.
Ü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.
quelle
Ich benutze Arch Linux und es gibt dieses wunderbare Paket namens
ps_mem
Beispielausgabe
quelle
Unter der Befehlszeile finden Sie den Gesamtspeicher, der von den verschiedenen auf dem Linux-Computer ausgeführten Prozessen in MB verwendet wird
quelle
Ein guter Test für die Verwendung in der "realen Welt" besteht darin, die Anwendung zu öffnen, die
vmstat -s
Statistik "aktiver Speicher" auszuführen und zu überprüfen. Schließen Sie die Anwendung, warten Sie einige Sekunden und führen Sie sievmstat -s
erneut aus. Wie viel aktiver Speicher freigegeben wurde, wurde offenbar von der App verwendet.quelle
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.
quelle
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:Dadurch wird kontinuierlich nach Änderungen gesucht und diese gedruckt.
quelle
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.quelle
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.
quelle
atop -R
. Um einen Zusammenfassungs-Push pro Benutzer anzuzeigenp
, um nach Speichernutzung zu sortieren, drücken Sie 'M' von oben. Dies ergibt ähnliche Zahlen wie smem.Überprüfen Sie das Shell-Skript, um die Speichernutzung nach Anwendung unter Linux zu überprüfen . Auch auf Github und in einer Version ohne Paste und bc erhältlich .
quelle
Eine weitere Abstimmung für Valgrindhier, 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;)
quelle
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 .
quelle
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:
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:
** **.
quelle
/ 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.
quelle
Verwenden Sie das in Ubuntu verfügbare integrierte GUI-Tool " Systemmonitor "
quelle