Warum ist der VmRSS bei Verwendung von mmap inkonsistent?

613
Matthieu M.

Eine Anwendung, die wir haben, kombiniert zwei Elemente:

  • es weist ein 707 MB-Speichersegment zu mmap(0, sizeof(T), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0).
  • Es meldet seine eigene Speichernutzung, indem es /proc/self/statusden Wert des VmRSSFeldes analysiert und extrahiert .

Leider ist der gemeldete Speicher in allen Prozessabläufen inkonsistent. Zum Beispiel über zwei aufeinanderfolgende Läufe hinweg auf demselben Rechner:

  • die ersten gemeldeten 971956224 Bytes oder 927 MB wurden über 8 Minuten gehalten.
  • Das zweite gemeldete 230174720 Byte oder 220 MB wurde über 8 Minuten gehalten.

Der Unterschied: 741527552 Bytes (~ 707 MB) entspricht der Größe unseres mmapSegments.

Das mmapSegment wird systematisch zugewiesen, und auf die Zuordnung folgt unmittelbar ein memsetvon 0xfe, um das Betriebssystem zu zwingen, den Speicher zu übergeben und spätere Seitenfehler zu vermeiden.

Inkonsistent:

  • RSS berichtet von 220 MB, wenn der Prozess immer 707 MB zuweist.
  • RSS meldete zwischen aufeinander folgenden Durchläufen zwischen 220 MB und 927 MB Flackern.

Konsistent:

  • Der gemeldete RSS ist während des gesamten Prozessablaufs relativ konstant, variiert jedoch nur um ein paar MB und enthält entweder die gesamten 707 MB oder nicht.

Warum ist der VmRSS bei Verwendung von mmap inkonsistent?


Auf der jeweiligen Maschine, als dieser Lauf ausgeführt wurde:

$ rpm -q centos-release centos-release-7-2.1511.el7.centos.2.10.x86_64 

Andere Maschinen mit etwas anderen Centos-Versionen zeigen jedoch dasselbe Verhalten.

0
Ein Kollege machte eine Bemerkung, dass dies ein Unterschied darin sein könnte, ob das "mmap" -Segment von einer Datei unterstützt wird oder nicht; konnte jedoch nicht erklären, warum es nur manchmal durch eine Datei auf einem bestimmten Computer gesichert wurde. Matthieu M. vor 6 Jahren 0

0 Antworten auf die Frage