Ich hatte einmal die Aufgabe, die folgenden Leistungsparameter in einer laufenden Anwendung zu ermitteln:
- Insgesamt verfügbarer virtueller Speicher
- Derzeit verwendeter virtueller Speicher
- Virtueller Speicher, der derzeit von meinem Prozess verwendet wird
- Gesamter RAM verfügbar
- Derzeit verwendeter RAM
- RAM wird derzeit von meinem Prozess verwendet
- % CPU wird derzeit verwendet
- % CPU wird derzeit von meinem Prozess verwendet
Der Code musste unter Windows und Linux ausgeführt werden. Obwohl dies eine Standardaufgabe zu sein scheint, habe ich mehrere Tage gebraucht, um die erforderlichen Informationen in den Handbüchern (WIN32-API, GNU-Dokumente) sowie im Internet zu finden, da es zu diesem Thema so viele unvollständige / falsche / veraltete Informationen gibt dort herausgefunden.
Um andere vor den gleichen Problemen zu bewahren, hielt ich es für eine gute Idee, alle verstreuten Informationen sowie das, was ich hier durch Ausprobieren gefunden habe, an einem Ort zu sammeln.
Antworten:
Windows
Einige der oben genannten Werte sind über die entsprechende WIN32-API leicht verfügbar. Der Vollständigkeit halber liste ich sie hier auf. Andere müssen jedoch aus der Performance Data Helper-Bibliothek (PDH) bezogen werden, die etwas "nicht intuitiv" ist und viele schmerzhafte Versuche und Irrtümer erfordert, um an die Arbeit zu gehen. (Zumindest habe ich eine ganze Weile gebraucht, vielleicht war ich nur ein bisschen dumm ...)
Hinweis: Aus Gründen der Übersichtlichkeit wurde die Fehlerprüfung im folgenden Code weggelassen. Überprüfen Sie die Rückkehrcodes ...!
Gesamter virtueller Speicher:
Hinweis: Der Name "TotalPageFile" ist hier etwas irreführend. In Wirklichkeit gibt dieser Parameter die "Größe des virtuellen Speichers" an, dh die Größe der Auslagerungsdatei plus des installierten Arbeitsspeichers.
Derzeit verwendeter virtueller Speicher:
Gleicher Code wie in "Total Virtual Memory" und dann
Virtueller Speicher, der derzeit vom aktuellen Prozess verwendet wird:
Gesamter physischer Speicher (RAM):
Gleicher Code wie in "Total Virtual Memory" und dann
Derzeit verwendeter physischer Speicher:
Physischer Speicher, der derzeit vom aktuellen Prozess verwendet wird:
Gleicher Code wie in "Virtueller Speicher, der derzeit vom aktuellen Prozess verwendet wird" und dann
Derzeit verwendete CPU:
CPU wird derzeit vom aktuellen Prozess verwendet:
Linux
Unter Linux war die Wahl, die auf den ersten Blick offensichtlich schien, die Verwendung von POSIX-APIs wie
getrusage()
usw. Ich habe einige Zeit damit verbracht, dies zum Laufen zu bringen, aber nie aussagekräftige Werte erhalten. Als ich schließlich die Kernelquellen selbst überprüfte, stellte ich fest, dass diese APIs anscheinend ab Linux Kernel 2.6 noch nicht vollständig implementiert sind!?Am Ende habe ich alle Werte durch eine Kombination aus Lesen des Pseudo-Dateisystems
/proc
und Kernel-Aufrufen erhalten.Gesamter virtueller Speicher:
Derzeit verwendeter virtueller Speicher:
Gleicher Code wie in "Total Virtual Memory" und dann
Virtueller Speicher, der derzeit vom aktuellen Prozess verwendet wird:
Gesamter physischer Speicher (RAM):
Gleicher Code wie in "Total Virtual Memory" und dann
Derzeit verwendeter physischer Speicher:
Gleicher Code wie in "Total Virtual Memory" und dann
Physischer Speicher, der derzeit vom aktuellen Prozess verwendet wird:
Ändern Sie getValue () in "Virtueller Speicher, der derzeit vom aktuellen Prozess verwendet wird" wie folgt:
Derzeit verwendete CPU:
CPU wird derzeit vom aktuellen Prozess verwendet:
TODO: Andere Plattformen
Ich würde annehmen, dass ein Teil des Linux-Codes auch für die Unixe funktioniert, mit Ausnahme der Teile, die das Pseudo-Dateisystem / proc lesen. Vielleicht können diese Teile unter Unix durch
getrusage()
ähnliche Funktionen ersetzt werden? Wenn jemand mit Unix-Know-how diese Antwort bearbeiten und die Details eingeben könnte?!quelle
PROCESS_MEMORY_COUNTERS
Wie rufen Sie bei Verwendung den "Virtuellen Speicher ab, der derzeit vom aktuellen Prozess verwendet wird"?PrivateUsage
ist kein Mitglied vonPROCESS_MEMORY_COUNTERS
ist der Compilerfehler, den ich erhalte!"quotes like these"
zum Einfügen von Systemheadern?GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
durchGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Mac OS X
Ich hatte gehofft, ähnliche Informationen auch für Mac OS X zu finden. Da es nicht hier war, ging ich raus und grub es selbst aus. Hier sind einige der Dinge, die ich gefunden habe. Wenn jemand andere Vorschläge hat, würde ich sie gerne hören.
Gesamter virtueller Speicher
Dies ist unter Mac OS X schwierig, da keine voreingestellte Swap-Partition oder -Datei wie Linux verwendet wird. Hier ist ein Eintrag aus der Apple-Dokumentation:
Wenn Sie also wissen möchten, wie viel virtueller Speicher noch verfügbar ist, müssen Sie die Größe der Root-Partition ermitteln. Sie können das so machen:
Insgesamt virtuell derzeit verwendet
Das Aufrufen von systcl mit der Taste "vm.swapusage" bietet interessante Informationen zur Swap-Verwendung:
Nicht dass sich die hier angezeigte Gesamt-Swap-Nutzung ändern könnte, wenn mehr Swap benötigt wird, wie im obigen Abschnitt erläutert. Die Summe ist also tatsächlich die aktuelle Swap-Summe. In C ++ können diese Daten folgendermaßen abgefragt werden:
Beachten Sie, dass die in sysctl.h deklarierte "xsw_usage" nicht dokumentiert zu sein scheint und ich vermute, dass es eine portablere Möglichkeit gibt, auf diese Werte zuzugreifen.
Virtueller Speicher, der derzeit von meinem Prozess verwendet wird
Mit der
task_info
Funktion können Sie Statistiken über Ihren aktuellen Prozess abrufen . Dies umfasst die aktuelle residente Größe Ihres Prozesses und die aktuelle virtuelle Größe.Gesamter RAM verfügbar
Die in Ihrem System verfügbare Menge an physischem RAM ist mit der folgenden
sysctl
Systemfunktion verfügbar :Derzeit verwendeter RAM
Sie können allgemeine Speicherstatistiken von der
host_statistics
Systemfunktion abrufen.Hierbei ist zu beachten, dass es unter Mac OS X fünf Arten von Speicherseiten gibt: Diese lauten wie folgt:
Es ist gut zu beachten, dass Mac OS X manchmal nur sehr wenig freien Speicherplatz anzeigt und daher möglicherweise kein guter Hinweis darauf ist, wie viel kurzfristig verwendet werden kann.
RAM wird derzeit von meinem Prozess verwendet
Siehe oben "Virtueller Speicher, der derzeit von meinem Prozess verwendet wird". Es gilt der gleiche Code.
quelle
Linux
Unter Linux sind diese Informationen im Dateisystem / proc verfügbar. Ich bin kein großer Fan des verwendeten Textdateiformats, da jede Linux-Distribution mindestens eine wichtige Datei anzupassen scheint. Ein kurzer Blick als Quelle für 'ps' zeigt das Durcheinander.
Aber hier finden Sie die Informationen, die Sie suchen:
/ proc / meminfo enthält den Großteil der von Ihnen gesuchten systemweiten Informationen. Hier sieht es aus wie auf meinem System; Ich denke, Sie interessieren sich für MemTotal , MemFree , SwapTotal und SwapFree :
Für die CPU-Auslastung müssen Sie ein wenig arbeiten. Linux stellt die gesamte CPU-Auslastung seit dem Systemstart zur Verfügung. Dies ist wahrscheinlich nicht das, woran Sie interessiert sind. Wenn Sie wissen möchten, wie hoch die CPU-Auslastung in der letzten Sekunde oder in 10 Sekunden war, müssen Sie die Informationen abfragen und selbst berechnen.
Die Informationen sind in / proc / stat verfügbar , das unter http://www.linuxhowtos.org/System/procstat.htm ziemlich gut dokumentiert ist . So sieht es auf meiner 4-Core-Box aus:
Zunächst müssen Sie ermitteln, wie viele CPUs (oder Prozessoren oder Prozessorkerne) im System verfügbar sind. Zählen Sie dazu die Anzahl der 'cpuN'-Einträge, wobei N bei 0 beginnt und sich erhöht. Zählen Sie nicht die 'CPU'-Zeile, die eine Kombination der CPU-Zeilen ist. In meinem Beispiel sehen Sie cpu0 bis cpu3 für insgesamt 4 Prozessoren. Von nun an können Sie cpu0..cpu3 ignorieren und sich nur noch auf die Zeile 'cpu' konzentrieren.
Als nächstes müssen Sie wissen, dass die vierte Zahl in diesen Zeilen ein Maß für die Leerlaufzeit ist und daher die vierte Zahl in der Zeile "CPU" die gesamte Leerlaufzeit für alle Prozessoren seit dem Start ist. Diese Zeit wird in Linux "jiffies" gemessen, die jeweils 1/100 Sekunde betragen.
Die gesamte Leerlaufzeit ist Ihnen jedoch egal. Sie kümmern sich um die Leerlaufzeit in einem bestimmten Zeitraum, z. B. die letzte Sekunde. Berechnen Sie das, Sie müssen diese Datei zweimal im Abstand von 1 Sekunde lesen. Dann können Sie einen Diff des vierten Werts der Zeile machen. Zum Beispiel, wenn Sie eine Probe nehmen und erhalten:
Dann eine Sekunde später erhalten Sie dieses Beispiel:
Wenn Sie die beiden Zahlen subtrahieren, erhalten Sie einen Unterschied von 396, was bedeutet, dass Ihre CPU in den letzten 1,00 Sekunden 3,96 Sekunden lang im Leerlauf war. Der Trick ist natürlich, dass Sie durch die Anzahl der Prozessoren dividieren müssen. 3,96 / 4 = 0,99, und es gibt Ihren Leerlaufprozentsatz; 99% im Leerlauf und 1% beschäftigt.
In meinem Code habe ich einen Ringpuffer von 360 Einträgen und lese diese Datei jede Sekunde. Auf diese Weise kann ich schnell die CPU-Auslastung für 1 Sekunde, 10 Sekunden usw. bis zu 1 Stunde berechnen.
Für die prozessspezifischen Informationen müssen Sie in / proc / pid suchen . Wenn es dir egal ist, ob du an deine PID stößt, kannst du in / proc / self schauen.
Die von Ihrem Prozess verwendete CPU ist in / proc / self / stat verfügbar . Dies ist eine seltsam aussehende Datei, die aus einer einzelnen Zeile besteht. zum Beispiel:
Die wichtigen Daten hier sind die 13. und 14. Token (0 und 770 hier). Das 13. Token ist die Anzahl der Jiffs, die der Prozess im Benutzermodus ausgeführt hat, und das 14. ist die Anzahl der Jiffs, die der Prozess im Kernelmodus ausgeführt hat. Addieren Sie die beiden und Sie haben die gesamte CPU-Auslastung.
Auch hier müssen Sie diese Datei regelmäßig abtasten und den Unterschied berechnen, um die CPU-Auslastung des Prozesses im Laufe der Zeit zu bestimmen.
Bearbeiten: Denken Sie daran, dass Sie bei der Berechnung der CPU-Auslastung Ihres Prozesses 1) die Anzahl der Threads in Ihrem Prozess und 2) die Anzahl der Prozessoren im System berücksichtigen müssen. Wenn Ihr Single-Thread-Prozess beispielsweise nur 25% der CPU belegt, kann dies gut oder schlecht sein. Gut auf einem Einzelprozessorsystem, aber schlecht auf einem 4-Prozessorsystem; Dies bedeutet, dass Ihr Prozess ständig ausgeführt wird und 100% der ihm zur Verfügung stehenden CPU-Zyklen verwendet.
Für die prozessspezifischen Speicherinformationen müssen Sie sich / proc / self / status ansehen, der folgendermaßen aussieht:
Die Einträge, die mit 'Vm' beginnen, sind interessant:
Das einzige Element, bei dem ich mir nicht sicher bin, ist Swapspace, das derzeit von meinem Prozess verwendet wird . Ich weiß nicht, ob dies verfügbar ist.
quelle
In Windows können Sie die CPU-Nutzung über den folgenden Code abrufen:
quelle
usage =
ist die kreativste Sache, die ich seitULONGLONG
für VS anstelle vonULARGE_INTEGER
. 2) Sie verkomplizieren die Dinge, indem Sie anrufenCopyMemory()
. Tun Sie diesULONGLONG ul_sys_idle = *(ULONGLONG*)&ft_sys_idle;
stattdessen. Es wird in eine einzelne CPUmov
(oderlea
) Anweisung übersetzt.Linux
Eine tragbare Methode zum Lesen von Speicher und zum Laden von Nummern ist der
sysinfo
AnrufVerwendungszweck
BESCHREIBUNG
quelle
QNX
Da dies wie eine "Wikipage of Code" ist, möchte ich Code aus der QNX Knowledge Base hinzufügen (Hinweis: Dies ist nicht meine Arbeit, aber ich habe ihn überprüft und er funktioniert auf meinem System einwandfrei):
So ermitteln Sie die CPU-Auslastung in%: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
So erhalten Sie den freien (!) Speicher: http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
quelle
Mac OS X - CPU
Gesamt-CPU-Auslastung:
Von Systeminformationen unter MacOS X abrufen? ::
quelle
Für Linux Sie können auch / proc / self / statm verwenden, um eine einzelne Zahlenreihe mit wichtigen Prozessspeicherinformationen abzurufen. Dies ist schneller zu verarbeiten als das Durchlaufen einer langen Liste gemeldeter Informationen, wie Sie sie von proc / self / status erhalten
Siehe http://man7.org/linux/man-pages/man5/proc.5.html
quelle
Ich habe den folgenden Code in meinem C ++ - Projekt verwendet und es hat gut funktioniert:
quelle