Wie, um zu bestimmen, CPU-und Speicher-Verbrauch von innerhalb eines Prozesses?
Ich hatte einmal die Aufgabe bestimmen Sie die folgenden performance-Parameter aus einer Laufenden Anwendung:
- Gesamter virtueller Speicher zur Verfügung
- Virtuellen Speicher derzeit verwendet
- Virtuellen Speicher, der aktuell von meinem Prozess
- Gesamt-RAM zur Verfügung
- RAM derzeit verwendet
- RAM, der aktuell von meinem Prozess
- % CPU derzeit verwendet
- % CPU-Zeit von meinem Prozess
War der code für die Ausführung auf Windows und Linux. Obwohl dies scheint eine standard-Aufgabe, das finden der notwendigen Informationen in den Handbüchern (WIN32-API, GNU docs) sowie auf das Internet hat mich mehrere Tage, weil es so viel unvollständige/fehlerhafte/veraltete Informationen zu diesem Thema zu finden gibt.
Um andere zu retten, gehen durch das gleiche Problem, ich dachte, es wäre eine gute Idee alle zu sammeln die verstreuten Informationen plus das, was ich durch Versuch und Irrtum gefunden, die hier in einem Ort.
"Gesamter virtueller Speicher verfügbar" ist sinnlos auf moderne Betriebssysteme.
Warum ist es sinnlos? Es tut erlischt die Antwort hier? stackoverflow.com/questions/3296211/... ... bitte nicht verlassen Cliffhanger, wenn zu kommentieren, es ist nicht eine TV-show.
Die Frage ist in etwa "total physical memory", das ist ein hardware bekannte Tatsache das OS. Sie bekommen die Summe, die durch addieren der Größen der alle Speicher-Module. "Gesamter virtueller Speicher verfügbar", auf der anderen Seite, was bedeutet das überhaupt? Ist, dass die Kombination von virtueller Adressraum aller Prozesse, die theoretisch erzeugt werden könnte? Diese Zahl würde um die 2^80 Byte, so dass sicherlich bedeutungslos.
danke für den Eingriff. Ich glaube, die Frage, was der OP im Sinn hatte, ist viel schonender und gesünder als die besagt, dass etwas sinnlos ist (w/o Erklärung). Wenn Sie beachten Sie, die Antworten sind auch unter der Annahme einer bestimmten position in Bezug auf diese: Virtueller Speicher = RAM + SWAP (oder AUSLAGERUNGSDATEI) - das ist eine vernünftige Annahme. Von diesem wissen wir, dass es nicht sinnlos, denn es ist insbesondere die Auslegung dieses Begriffes (die vielleicht nicht die technisch korrekte, colloquelism), das Sinn hat.
Ignoriert, dass memory-mapped-Dateien und code, der nicht ausgelagert. Linux ist nicht verpflichtet Speicherzuordnungen (nicht unterstützt von RAM oder swap) und Windows ist nicht verpflichtet stapeln.
Warum ist es sinnlos? Es tut erlischt die Antwort hier? stackoverflow.com/questions/3296211/... ... bitte nicht verlassen Cliffhanger, wenn zu kommentieren, es ist nicht eine TV-show.
Die Frage ist in etwa "total physical memory", das ist ein hardware bekannte Tatsache das OS. Sie bekommen die Summe, die durch addieren der Größen der alle Speicher-Module. "Gesamter virtueller Speicher verfügbar", auf der anderen Seite, was bedeutet das überhaupt? Ist, dass die Kombination von virtueller Adressraum aller Prozesse, die theoretisch erzeugt werden könnte? Diese Zahl würde um die 2^80 Byte, so dass sicherlich bedeutungslos.
danke für den Eingriff. Ich glaube, die Frage, was der OP im Sinn hatte, ist viel schonender und gesünder als die besagt, dass etwas sinnlos ist (w/o Erklärung). Wenn Sie beachten Sie, die Antworten sind auch unter der Annahme einer bestimmten position in Bezug auf diese: Virtueller Speicher = RAM + SWAP (oder AUSLAGERUNGSDATEI) - das ist eine vernünftige Annahme. Von diesem wissen wir, dass es nicht sinnlos, denn es ist insbesondere die Auslegung dieses Begriffes (die vielleicht nicht die technisch korrekte, colloquelism), das Sinn hat.
Ignoriert, dass memory-mapped-Dateien und code, der nicht ausgelagert. Linux ist nicht verpflichtet Speicherzuordnungen (nicht unterstützt von RAM oder swap) und Windows ist nicht verpflichtet stapeln.
InformationsquelleAutor Lanzelot | 2008-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Windows
Einige der oben genannten Werte sind leicht aus den entsprechenden WIN32-API, ich Liste Sie hier der Vollständigkeit halber aufgeführt. Andere jedoch müssen die aus der Performance Data Helper library (PDH), die ist etwas "unintuitiv" und nimmt eine Menge von schmerzhaften Versuch und Irrtum zu arbeiten. (Zumindest ist es mir dauerte eine ganze Weile, vielleicht habe ich es nur ein bisschen blöd...)
Hinweis: für Klarheit alle Fehler überprüft wurde, entfällt ab dem folgenden code. Sie überprüfen die return-codes...!
Gesamter Virtueller Speicher:
Hinweis: Der name "TotalPageFile" ist ein bisschen irreführend hier. In Wirklichkeit ist dieser parameter gibt die "Virtual Memory Size", was die Größe der swap-Datei plus RAM installiert.
Virtuellen Speicher derzeit verwendet:
Gleichen code wie in "gesamter Virtueller Speicher" und dann
Virtuellen Speicher, die derzeit bei den aktuellen Prozess:
Gesamten Physischen Speicher (RAM):
Gleichen code wie in "gesamter Virtueller Speicher" und dann
Physischen Speicher derzeit verwendet:
Physikalischen Speicher, die derzeit bei den aktuellen Prozess:
Gleichen code wie in der "Virtuellen Speicher, die derzeit bei den aktuellen Prozess" und dann
CPU derzeit verwendet:
CPU, die derzeit bei den aktuellen Prozess:
Linux
Unter Linux der Wahl, das schien offensichtlich auf den ersten, war der Einsatz der POSIX-APIs wie getrusage (), etc. Ich verbrachte einige Zeit versucht, diese zu arbeiten, aber nie sinnvolle Werte. Wenn ich abschließend überprüft der kernel-Quellen selbst, fand ich heraus, dass scheinbar diese APIs sind noch nicht vollständig umgesetzt werden, da der Linux-kernel 2.6!?
Letztendlich habe ich alle Werte über eine Kombination der Lektüre der pseudo-Dateisystem /proc-und kernel-Aufrufe.
Gesamter Virtueller Speicher:
Virtuellen Speicher derzeit verwendet:
Gleichen code wie in "gesamter Virtueller Speicher" und dann
Virtuellen Speicher, die derzeit bei den aktuellen Prozess:
Gesamten Physischen Speicher (RAM):
Gleichen code wie in "gesamter Virtueller Speicher" und dann
Physischen Speicher derzeit verwendet:
Gleichen code wie in "gesamter Virtueller Speicher" und dann
Physikalischen Speicher, die derzeit bei den aktuellen Prozess:
Ändern getValue() im "Virtuellen Speicher, die derzeit bei den aktuellen Prozess" wie folgt:
CPU derzeit verwendet:
CPU, die derzeit bei den aktuellen Prozess:
TODO: Anderen Plattformen
Ich würde davon ausgehen, dass einige der Linux-code funktioniert auch für die UNIX-Varianten, außer für die Teile, die Lesen das /proc-pseudo-Dateisystem. Vielleicht auf Unix diese Teile können ersetzt werden durch getrusage() und ähnlichen Funktionen?
Wenn sich jemand mit Unix-know-how Bearbeiten könnten diese Antwort und füllen Sie die details?!
Bei der Verwendung von
PROCESS_MEMORY_COUNTERS
, wie Sie das abrufen der "Virtuelle Speicher, die derzeit bei den aktuellen Prozess"?PrivateUsage
ist nicht Mitglied derPROCESS_MEMORY_COUNTERS
ist die compiler-Fehlermeldung, die ich erhalten!Warum verwenden Sie
"quotes like these"
für einschließlich system-Header?Sie müssen ein casting.. ersetzen GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); mit GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Da sind wir weit über dem Linux-Kernel 3.0. Können Sie aktualisieren Sie Ihre Linux-Antwort auf die POSIX-API? Wenn möglich, korrigieren Sie die Windows-Antwort als auch durch Auswechseln
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
mitGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
InformationsquelleAutor Lanzelot
Mac OS X
Ich hatte gehofft, dass ähnliche Informationen für Mac OS X als auch. Da war es nicht hier, ich ging hin und grub es mir. Hier sind einige der Dinge, die ich gefunden habe. Wenn jemand noch andere Vorschläge, ich würde lieben, Sie zu hören.
Gesamter Virtueller Speicher
Dies ist schwierig auf Mac OS X, weil es keine preset-swap-partition oder-Datei wie Linux. Hier ist ein Eintrag aus der Apple-Dokumentation:
Also, wenn Sie wissen möchten, wie viel virtuellen Speicher noch verfügbar ist, müssen Sie die Größe der root-partition. Sie können tun, wie diese:
Gesamter Virtueller Derzeit Verwendet
Aufrufen systcl mit dem "vm.swapusage" - Taste bietet interessante Informationen über die Auslastung des swap-Speichers:
Nicht, dass die gesamte Auslastung des swap-Speichers angezeigt, hier kann sich ändern, wenn mehr swap erforderlich ist, wie in dem Abschnitt oben. Also die Summe ist tatsächlich die aktuellen swap insgesamt. In C++ können diese Daten abgefragt werden, auf diese Weise:
Beachten Sie, dass die "xsw_usage", erklärt sysctl.h, scheint nicht dokumentiert und ich vermute, es ist eine mehr tragbare Weise auf diese Werte zugreifen.
Virtuellen Speicher, der Aktuell von meinem Prozess
Können Sie Statistiken über Ihre aktuelle Prozess mit der
task_info
Funktion. Das beinhaltet die aktuellen Bewohner der Größe des Prozesses und die aktuelle virtuelle Größe.Gesamt-RAM zur Verfügung
Die Menge des physischen RAM in Ihrem system verfügbar ist, mit der
sysctl
system-Funktion wie folgt:RAM Derzeit Verwendet
Erhalten Sie Allgemeine Speicher-Statistik der
host_statistics
system-Funktion.Eine Sache, die hier zu beachten sind, dass es fünf Typen von Speicher-Seiten in Mac OS X. Sie lauten wie folgt:
Es ist gut zu beachten, dass, nur weil Mac OS X kann von sehr wenig freier Speicher bei Zeiten, dass es nicht ein gutes Indiz dafür, wie viel bereit ist kurzfristig.
RAM, der Aktuell von meinem Prozess
Finden Sie unter "Virtueller Arbeitsspeicher, der Aktuell von meinem Prozess" vor. Der gleiche code gilt.
Keine Ahnung von erste CPU-Auslastung ?
Taylor, Das ist großartig, danke, aber die Frage über die RAM derzeit für OS X, es scheint, dass Sie immer die VM-stats, nicht der physische Speicher. Ist das wirklich hier der Fall?
Das vm-system verwaltet den Speicher, so dass ist, warum Sie die Abfrage. Die Speicher sind Statistiken für die tatsächliche Speicher. Ich habe einen test auf meinem Rechner, und einige der physischen Speicher fehlt in der Statistik (die Sie nicht hinzufügen bis zu meinem physischen Speicher). Sie scheinen nicht auf meine swap-obwohl. Leider können Sie nur Lesen Sie die überschriften für die docs.
Wie können wir berechnen APP-Speicher und cache-Speicher wie activity monitor? Ich verwendet vm_stats.inactive_page_count *page_size t berechnen, Datei-Cache, aber es wird nicht synchronisiert mit dem Activity monitor. Vielen Dank im Voraus
InformationsquelleAutor Michael Taylor
Linux
In Linux, diese Informationen werden in das /proc-Dateisystem. Ich bin kein großer fan der text-Datei-format verwendet, wie jede Linux-distribution scheint zu passen mindestens eine wichtige Datei. Ein kurzer Blick als Quelle für die 'ps' zeigt die bescherung.
Aber hier ist, wo zu finden die Informationen, die Sie suchen:
/proc/meminfo enthält die Mehrheit der system-weiten Informationen die Sie suchen. Hier sieht es aus wie auf meinem system, ich denke, Sie sind daran interessiert, MemTotal, MemFree, SwapTotal, und SwapFree:
Für die CPU-Auslastung, müssen Sie ein wenig Arbeit. Linux zur Verfügung stellt, die gesamte CPU-Auslastung seit dem start des Systems; dies ist wahrscheinlich nicht das, was Sie interessiert. Wenn Sie wissen wollen, was die CPU-Auslastung war für die letzten Sekunden, oder 10 Sekunden, dann müssen Sie für die Abfrage der Informationen und selbst berechnen.
Den Informationen, die verfügbar ist in /proc/stat, die dokumentiert ist ziemlich gut in der http://www.linuxhowtos.org/System/procstat.htm; hier ist, was es sieht aus wie auf meinem 4-core box:
Zuerst müssen Sie bestimmen, wie viele CPUs (oder Prozessoren oder Prozessorkerne) im system verfügbar sind. Dazu zählen der Anzahl von 'cpuN' - Einträge, wobei N der bei 0 beginnt und inkrementiert. Zählen Sie nicht die 'cpu' Linie, die eine Kombination aus dem cpuN-Linien. In meinem Beispiel können Sie sehen, cpu0 durch cpu3, für insgesamt 4 Prozessoren. Von nun an können Sie ignorieren cpu0..cpu3, und konzentrieren Sie sich nur auf die 'cpu' - Zeile.
Als Nächstes müssen Sie wissen, dass die vierte Zahl in diesen Zeilen ist ein Maß der Zeit im Leerlauf, und so ist die vierte Nummer auf die 'cpu' - Linie ist die Gesamt-idle-time für alle Prozessoren, da die boot-Zeit. Diese Zeit wird gemessen in Linux "jiffies", die sind 1/100 einer Sekunde.
Aber Sie kümmern sich nicht um die Gesamt-idle-time; Sie kümmern sich um die idle-Zeit, die in einem bestimmten Zeitraum, z.B. der letzten Sekunde. Tun ausrechnen, müssen Sie diese Datei zu Lesen, zweimal, 1 Sekunde auseinander.Dann kann man ein "diff" der vierte Wert der Zeile. Zum Beispiel, wenn Sie nehmen Sie eine Probe und erhalten:
Dann eine Sekunde später erhalten Sie dieses Beispiel:
Subtrahieren Sie die beiden zahlen und Sie erhalten eine diff 396, was bedeutet, dass Ihre CPU im Leerlauf war 3.96 Sekunden aus der letzten 1.00 Sekunden. Der trick, natürlich, ist, dass Sie brauchen, um zu dividieren durch die Anzahl der Prozessoren. 3.96 /4 = 0.99, und es ist Ihre idle-Anteil; 99% Leerlauf, und 1% beschäftigt.
In meinem code, ich habe einen ring-Puffer 360 Einträge, und ich lese diese Datei in jeder Sekunde. Dass lässt mich schnell zu berechnen, die CPU-Auslastung für 1 Sekunde, 10 Sekunden, etc., den ganzen Weg bis zu 1 Stunde.
Für die Prozess-spezifische Informationen, Sie haben sich in /proc/pid; wenn Sie don ' T care über die pid, suchen Sie in /proc/self.
CPU-Ihr Prozess ist in /proc/self/stat. Dies ist eine seltsam aussehende Datei, die aus einer einzelnen Zeile ein; zum Beispiel:
Wichtige Daten sind hier die 13 und 14 Spielfiguren (0 und 770 hier). Der 13-token ist die Anzahl der jiffies, dass der Prozess ausgeführt wurde, die im user-Modus, und die 14 ist die Anzahl der jiffies, dass der Prozess ausgeführt wurde, der im kernel-Modus. Fügen Sie die beiden zusammen, und Sie haben Ihre gesamte CPU-Auslastung.
Wieder, Sie haben zum Beispiel diese Datei in regelmäßigen Abständen, und berechnen Sie die diff, um festzustellen, ob die Prozess-CPU-Auslastung über die Zeit.
Edit: denken Sie daran, dass, wenn Sie berechnen Sie Ihre Prozess die CPU-Auslastung, die Sie haben zu berücksichtigen 1) die Anzahl der threads im Prozess und 2) die Anzahl der Prozessoren im system. Zum Beispiel, wenn Ihre single-threaded-Prozess mit nur 25% der CPU, das könnte gut sein oder schlecht. Gut, auf einer single-Prozessor-system, aber schlecht auf einem 4-Prozessor-system; dies bedeutet, dass der Prozess ständig läuft, und die Verwendung von 100% der CPU-Zyklen zur Verfügung stehen.
Für die Prozess-spezifische Speicher von Informationen, die Sie haben zu schauen, /proc/self/status, die wie folgt aussieht:
Die Einträge, die beginnen mit 'Vm' sind die interessanten:
Der einzige Artikel, den ich bin mir nicht sicher Swapspace derzeit von meinem Prozess. Ich weiß nicht, ob diese verfügbar ist.
InformationsquelleAutor Martin Del Vecchio
in windows erhalten Sie die cpu-Auslastung durch code unten:
ja es ist möglich
Die Formatierung der
usage =
ist das kreativste was ich gesehen haben in eine Weile, nicht lesbar, aber kreativWarnung: der Ausdruck in dem obigen code, berechnet 'Gebrauch' ist Weg. Wenn das system im Leerlauf war, es würde eine Division durch null. Im Falle der Leerlauf war gleich der user-und kernel-Zeit, es würde die Produktion von 0 anstatt 50%, wie man erwarten würde.
Beachten Sie auch, dass nach der aktuellen MSDN, kernel-Zeit beinhaltet auch die idle-Zeit!
InformationsquelleAutor sayyed mohsen zahraee
Linux
Einen tragbaren Weg des Lesen-Speicher und load-zahlen ist die
sysinfo
- AufrufNutzung
BESCHREIBUNG
InformationsquelleAutor Mark Lakata
QNX
Da dies wie eine "wikipage of code" möchte ich hinzufügen, dass einige code, der aus den QNX-Knowledge base (Hinweis: dies ist nicht mein Werk, aber ich überprüft und es funktioniert gut auf meinem system):
Wie man die CPU-Auslastung in %: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
Wie man die Kostenlose (!) Speicher: http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
InformationsquelleAutor Boernii
Mac-OS-X - CPU -
Gesamt-CPU-Auslastung:
Vom Abrufen von system-Informationen auf MacOS X? :
InformationsquelleAutor souch
Habe ich diese folgenden code in mein C++ Projekt, und es funktionierte Prima:
Ist das für Mac OS ?
InformationsquelleAutor Salman Ghaffar
Für Linux
Sie können auch verwenden /proc/self/statm um eine einzelne Zeile von zahlen, mit wesentlichen Prozess-Speicher-Informationen, die eine schnellere Sache zu verarbeiten, als sich durch eine lange Liste der gemeldeten Informationen erhalten Sie von proc/self/status
Sehen http://man7.org/linux/man-pages/man5/proc.5.html
InformationsquelleAutor Steven Warner