Abrufen von Informationen zur Speichernutzung eines Prozesses aus / proc / pid / smaps

46

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

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

Ist Shared_Clean+ Shared_Dirtydie Menge an Speicher, die mit anderen Prozessen geteilt wird? So ist es wie Shared RSS?

In ähnlicher Weise ist Private_Clean+ Private_Dirtydie 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 gemeinsam nutzen)?

Noch ein paar Fragen nach dem Lesen dieses Links: LWN

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

Ich habe bemerkt , dass , wenn ich Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtyfür jeden smaps Eintrag für den Prozess , den ich die RSS des Verfahrens erhalten , wie von ps, was ziemlich cool ist. Zum Beispiel

ps -p $$ -o pid,rss

Gibt mir die (ungefähr) gleichen Wert für rss als die Summe jeder Shared_Clean, Shared_Dirty, Private_Clean, Private_DirtyEintrag in / proc / $$ / smaps.

Aber was ist mit PSS für den gesamten Prozess? 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 zu PSS for $$ gelangen?

Und was ist mit USS für den gesamten Prozess? Im obigen Beispiel schätze ich, dass ich für $$ zur USS gelangen kann, indem ich nur die Private_ * -Einträge für jeden Smaps-Eintrag für $$ zusammenfasse. Richtig?

Hinweise:
PSS = Proportionale eingestellte Größe.
USS = Unique Set Size.

Ankur Agarwal
quelle

Antworten:

50

Bereinigte Seiten sind Seiten, die seit der Zuordnung nicht geändert wurden (normalerweise werden Textabschnitte aus freigegebenen Bibliotheken nur von der Festplatte gelesen (falls erforderlich) und nie geändert, sodass sie auf freigegebenen, bereinigten Seiten gespeichert werden).
Schmutzige Seiten sind Seiten, die nicht sauber sind (dh geändert wurden).

Private Seiten sind nur für diesen Prozess verfügbar, freigegebene Seiten werden von anderen Prozessen zugeordnet * .

RSS ist die Gesamtzahl der freigegebenen oder nicht freigegebenen Seiten, die derzeit dem Prozess zugeordnet sind. So Shared_Clean+ Shared_Dirtywäre der gemeinsame Teil der RSS (dh der Teil von RSS , die auch in andere Prozesse abgebildet wird), und Private_Clean+ Private_Dirtyder private Teil von RSS (dh nur in diesem Prozess abgebildet).

PSS (Proportional Share Size) entspricht Ihrer Beschreibung. Private Seiten werden so wie sie sind zusammengefasst und die Größe jeder freigegebenen Zuordnung wird durch die Anzahl der Prozesse geteilt, die sie gemeinsam nutzen.
Wenn ein Prozess also 100.000 private Seiten, 500.000 gemeinsam genutzte Seiten mit einem anderen Prozess und 500.000 gemeinsam genutzte Seiten mit vier anderen Prozessen hätte, wäre die PSS:

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

Weitere Lesungen:

In Bezug auf prozessweite Summen:

  • RSSkann (ungefähr + ) durch Summieren der Rss:Einträge in smaps(Sie müssen die geteilten / privaten geteilten / schmutzigen Einträge nicht addieren) erhalten werden.

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Sie können Pss:Werte auf die gleiche Weise zusammenfassen, um prozessglobal zu werden PSS.
  • USSwird nicht in berichtet smaps, aber es ist in der Tat die Summe der privaten Zuordnungen, so dass Sie es auf die gleiche Weise auch erhalten können

* Beachten Sie, dass eine "gemeinsam nutzbare" Seite als private Zuordnung gezählt wird, bis sie tatsächlich gemeinsam genutzt wird. Wenn derzeit nur ein Prozess verwendet libfoowird, wird der Textabschnitt dieser Bibliothek in den privaten Zuordnungen des Prozesses angezeigt. Es wird nur dann in den freigegebenen Zuordnungen berücksichtigt (und aus den privaten entfernt), wenn ein anderer Prozess diese Bibliothek verwendet.
+ Die Werte summieren sich nicht bei allen Prozessen genau. Ich weiß nicht genau warum ... Entschuldigung.

Matte
quelle
Danke für die tolle Antwort. Bin dankbar. Ich habe den LWM-Artikel gelesen, und das hat mich dazu inspiriert, ein paar weitere Fragen zu stellen. Deshalb habe ich sie zu meiner obigen Frage hinzugefügt.
Ankur Agarwal
Toll! es ist sehr sehr hilfreich !!
camino
Ich bin immer noch verwirrt über shared_dirty - verhindert die schmutzige Natur, dass es immer noch geteilt wird?
Kevin
@ Kevin: Wenn sie nicht geteilt würden, würden sie nicht berücksichtigt Shared_Dirty- könnten Sie Ihre Frage klären?
Mat
verschmutzt bedeutet modifiziert von der orig. Prozess, richtig? was ist das nicht, wie es geht, geteilt zu werden, um lokal zu sein?
Kevin