Ich habe diesen pidstat
gefunden wäre ein gutes Werkzeug, um Prozesse zu überwachen. Ich möchte die durchschnittliche Speichernutzung eines bestimmten Prozesses berechnen. Hier ist eine Beispielausgabe:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Dies ist Teil der Ausgabe von pidstat -r -p 7276
.)
Sollte ich die Informationen zur Resident Set Size (RSS) oder Virtual Size (VSZ) verwenden, um den durchschnittlichen Speicherverbrauch zu berechnen? Ich habe ein paar Dinge auf Wikipedia und in Foren gelesen, bin mir aber nicht sicher, ob ich die Unterschiede vollständig verstehe. Außerdem scheint keiner von ihnen zuverlässig zu sein. Wie kann ich also einen Prozess überwachen, um seine Speichernutzung zu ermitteln?
Jede Hilfe in dieser Angelegenheit wäre hilfreich.
Akzeptierte Antwort:
RSS gibt an, wie viel Speicher dieser Prozess derzeit im Hauptspeicher (RAM) hat. VSZ gibt an, wie viel virtuellen Speicher der Prozess insgesamt hat. Dies umfasst alle Arten von Speicher, sowohl im RAM als auch ausgelagert. Diese Zahlen können verzerrt werden, da sie auch gemeinsam genutzte Bibliotheken und andere Arten von Speicher enthalten. Sie können fünfhundert Instanzen von bash
haben laufen, und die Gesamtgröße ihres Speicherbedarfs ist nicht die Summe ihrer RSS- oder VSZ-Werte.
Wenn Sie eine detailliertere Vorstellung vom Speicherbedarf eines Prozesses erhalten möchten, stehen Ihnen einige Optionen zur Verfügung. Sie können durch /proc/$PID/map
gehen und sortiere die Sachen aus, die du nicht magst. Wenn es sich um gemeinsam genutzte Bibliotheken handelt, kann die Berechnung abhängig von Ihren Anforderungen komplex werden (an die ich mich zu erinnern glaube).
Wenn Sie sich nur für die Heap-Größe des Prozesses interessieren, können Sie immer nur den [heap]
parsen Eintrag in der map
Datei. Die Größe, die der Kernel für den Prozess-Heap zugewiesen hat, kann die genaue Anzahl der Bytes widerspiegeln, die der Prozess gefragt hat, muss es aber nicht zuzuordnen. Es gibt winzige Details, Kernel-Interna und Optimierungen, die dies stören können. In einer idealen Welt ist es so viel, wie Ihr Prozess benötigt, aufgerundet auf das nächste Vielfache der Systemseitengröße (getconf PAGESIZE
wird Ihnen sagen, was es ist – auf PCs sind es wahrscheinlich 4.096 Bytes).
Wenn Sie sehen möchten, wie viel Speicher ein Prozess zugewiesen hat , ist eine der besten Möglichkeiten, auf die Kernel-seitigen Metriken zu verzichten. Stattdessen instrumentieren Sie die Heap-Speicher-(De-)Allokationsfunktionen der C-Bibliothek mit LD_PRELOAD
Mechanismus. Ich persönlich missbrauche valgrind
leicht um Informationen über diese Art von Dingen zu erhalten. (Beachten Sie, dass das Anwenden der Instrumentierung einen Neustart des Prozesses erfordert.)
Bitte beachten Sie, da Sie möglicherweise auch Benchmarking-Laufzeiten durchführen, dass valgrind
wird Ihre Programme etwas langsamer machen (aber wahrscheinlich innerhalb Ihrer Toleranzen).