GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Informationen über die Speichernutzung eines Prozesses von /proc/pid/smaps abrufen?

Für einen bestimmten Prozess in /proc/<pid>/smaps , was für einen gegebenen Mapping-Eintrag:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

Ist Shared_Clean + Shared_Dirty die Menge an Speicher, die mit anderen Prozessen geteilt wird? Es ist also wie Shared RSS?

Ähnlich verhält es sich mit Private_Clean + Private_Dirty die Menge an Speicher, die nur für einen Prozess verfügbar ist ? Es ist also wie privates RSS?

Ist der PSS-Wert =PrivateRSS + (SharedRSS / Anzahl der Prozesse, die es teilen)?

Einige weitere Fragen nach dem Lesen dieses Links:LWN

Lassen Sie uns nun über den gesamten Prozess sprechen, dessen Smaps-Eintrag wir uns ansehen.

Mir ist aufgefallen, dass wenn ich Shared_Clean mache + Shared_Dirty + Private_Clean + Private_Dirty für jeden smaps-Eintrag für den Prozess erhalte ich den RSS des Prozesses, wie
von ps gemeldet , was ziemlich cool ist. Zum Beispiel

ps -p $$ -o pid,rss

Gibt mir den (ungefähr) gleichen Wert für rss wie die Summe von jedem Shared_Clean , Shared_Dirty , Private_Clean , Private_Dirty Eintrag in /proc/$$/smaps.

Aber was ist mit PSS für den gesamten Prozess? Also, wie erhalte ich aus dem obigen Beispiel die PSS für $$ ? Kann ich einfach den PSS-Eintrag für jede Smaps-Zuordnung hinzufügen und bei PSS für $$ ankommen?

Und was ist mit USS für den gesamten Prozess? Wenn ich wieder das obige Beispiel nehme, schätze ich, dass ich bei der USS für $$ ankommen kann, indem ich nur die Private_*-Einträge für jeden smaps-Eintrag für $$ zusammenfasse..richtig?

Hinweise:
PSS=proportionale Satzgröße.
USS=eindeutige Satzgröße.

Akzeptierte Antwort:

Saubere Seiten sind Seiten, die seit ihrer Zuordnung nicht geändert wurden (normalerweise werden Textabschnitte aus gemeinsam genutzten Bibliotheken nur von der Festplatte gelesen (falls erforderlich), nie geändert, sodass sie sich in gemeinsam genutzten, sauberen Seiten befinden).
Schmutzige Seiten sind Seiten, die nicht sauber sind (d. h. modifiziert wurden).

Private Seiten stehen nur diesem Prozess zur Verfügung, freigegebene Seiten werden von anderen Prozessen abgebildet.

RSS ist die Gesamtzahl der Seiten, geteilt oder nicht, die derzeit dem Prozess zugeordnet sind. Also Shared_Clean + Shared_Dirty wäre der gemeinsam genutzte Teil des RSS (d. h. der Teil des RSS, der auch in andere Prozesse abgebildet wird) und Private_Clean + Private_Dirty der private Teil von RSS (d.h. nur in diesem Prozess abgebildet).

PSS (Proportional Share Size) ist so, wie Sie es beschreiben. Private Seiten werden unverändert summiert, und die Größe jeder gemeinsam genutzten Zuordnung wird durch die Anzahl der Prozesse geteilt, die sie gemeinsam nutzen.
Wenn also ein Prozess 100.000 private Seiten hat, werden 500.000 Seiten mit einem anderen Prozess geteilt und 500.000 mit vier geteilt anderen Prozessen wäre das PSS:

100k + (500k / 2) + (500k / 5) = 450k

Weiterführende Literatur:

  • ELC:Wie viel Speicher verwenden Anwendungen wirklich?
  • Documentation/filesystems/proc.txt in den Kernelquellen
  • man proc(5)
  • Übersicht über die Linux-Speicherverwaltung
  • Speicherverwaltung auf TLDP.org
  • LinuxMM
Verwandte:Linux – das Noauto-Mount-Flag für?

Zu prozessweiten Summen:

  • RSS kann (ungefähr) durch Summieren von Rss: erhalten werden Einträge in smaps (Sie müssen die freigegebenen/privaten freigegebenen/dirty Einträge nicht addieren).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Sie können Pss: zusammenfassen Werte auf die gleiche Weise, um prozessglobales PSS zu erhalten .
  • USS wird nicht in smaps gemeldet , aber es ist tatsächlich die Summe privater Mappings, also können Sie es auch auf die gleiche Weise erhalten

Beachten Sie, dass eine "teilbare" Seite als private Zuordnung gezählt wird, bis sie tatsächlich ist geteilt. d.h. wenn es nur einen Prozess gibt, der derzeit libfoo verwendet , erscheint der Textabschnitt dieser Bibliothek im private des Prozesses Zuordnungen. Es wird nur dann in den gemeinsam genutzten Zuordnungen berücksichtigt (und aus den privaten entfernt), wenn/wenn ein anderer Prozess beginnt, diese Bibliothek zu verwenden.
Die Werte stimmen nicht bei allen Prozessen genau überein. Ich bin mir nicht ganz sicher, warum… Entschuldigung.


Linux
  1. Wie erhalte ich den Pfad eines Prozesses in Unix / Linux

  2. /proc/[pid]/pagemaps und /proc/[pid]/maps | Linux

  3. Prozessname von seiner PID in Linux

  4. Wie finde ich heraus, aus welchem ​​Ordner ein Prozess läuft?

  5. Grafische Darstellung der Prozessspeichernutzung unter Linux

Eine Anleitung zum Dateisystem „/proc“ unter Linux

/proc/cpuinfo- und /proc/meminfo-Dateien unter Linux

Wie erhalte ich die gesamte CPU-Auslastung einer Anwendung aus /proc/pid/stat?

Wie lese ich unter Linux aus /proc/$pid/mem?

Begrenzen Sie die Speichernutzung für einen einzelnen Linux-Prozess

Wie wird die Speichernutzung in Linux gemeldet?