An welcher Skala oder an welchem ​​Maß hält sich Mavericks und Yosemites „Gedächtnisdruck“?

57

Der Aktivitätsmonitor von Mavericks (und auch von Yosemite) zeigt ein neues Diagramm, den Speicherdruck . Leider erklärt der Hilfetext nur vage, was genau gemessen wird. Wie berechnet sich der Speicherdruck?

Mavericks Activity Monitor - Speicher

Picture Creds gehen auf diese Antwort aus einer Umfrage zu Mavericks bestem neuen Feature.

Jens Erat
quelle

Antworten:

51

Der Speicherdruck ist kein einfaches Maß für den Prozentsatz des freien Speichers und scheint ein Diagramm von 0 bis 100% zu sein. Der sysctlWert von vm.memory_pressurewird in Bezug auf ein berechnetes Ziel berechnet, das das Verhältnis zwischen freien und inaktiven Speicherseiten zu den verdrahteten und aktiven Seiten verfolgt. Die absoluten Zähler werden mit dem vm_statBefehlszeilentool angezeigt , um die detaillierte Zuordnung des virtuellen Speichers zu überprüfen. Jonathan Levin hat eine ausgezeichnete Dokumentation unter http://newosxbook.com/articles/MemoryPressure.html, die sowohl den virtuellen Speicher von macOS als auch von iOS und die Berechnung des Speicherdrucks sowie die bei hohem Druckindex ergriffenen Maßnahmen abdeckt.

Der relevante virtuelle Speicher (VM), aus dem die Berechnung vm.memory_pressureerfolgt, ist:

  • vm.page_free_count - eine absolute Anzahl von freien Seiten
  • vm.vm_page_free_target - ein berechnetes Ziel für eine "druckfreie" Situation
  • vm.page_free_wanted - was das vm-system zur linderung des aktuell berechneten druckindexes freigeben möchte

Wenn Sie also Ihren Speicherdruck mit dem Aktivitätsmonitor verfolgen (oder die sysctl-Werte programmgesteuert oder in der Befehlszeilen-Shell überprüfen), sollten Sie sich diese vier Werte ansehen:

sysctl -a vm | egrep "page_free|pressure"

Es gibt einen neuen Befehl memory_pressure, der mit Mavericks eingeführt wurde. Wenn ich ihn ausführe, um das Speichersubsystem in einen Warnzustand zu versetzen, wird der Speicherdruck in einem gelben Bereich angezeigt.

Aktivitätsüberwachung der Ergebnisse von <code> sudo memory_pressure -l warn </ code>

Das Werkzeug über 4 GB Speicher an das Werkzeug zugeordnet , wie die Druckkurve stetig zu diesem Zustand erhöht , wo offenbar die „Warnung“ -Niveau grafisch dargestellt: sudo memory_pressure -l warn. Wie Sie sehen, war das System vor dem Druck mit 5,9 GB belegt und nach dem Druck mit bis zu 7,99 GB belegt, was sich aufgrund von Swapping und Komprimierung nicht einmal summieren muss.

Nachdem ich beobachtet hatte, wie vm_stat 15das Warnungsergebnis in keinem messbaren Seitenwechsel angezeigt wurde, beendete ich das Tool (Control-C) und führte das Tool erneut aus, um den Speicherdruck kritisch zu machen:sudo memory_pressure -l critical

Ich ließ dies nicht länger als ein paar Minuten laufen, als das Paging gestartet wurde und als das Tool sagte, ich hätte 5 GB RAM auf die Festplatte ausgelagert, wollte ich mein Laufwerk nicht füllen und das Tool nicht beenden.

Aktivitätsüberwachung der Ergebnisse von <code> sudo memory_pressure -l critical </ code>

Sie können beobachten, wie schnell das System RAM nach dem Ende der Warnung freigegeben hat und wie es in "rotes" Gebiet gerutscht ist, um anzuzeigen, dass das virtuelle Speichersystem nicht genügend Seiten komprimieren konnte, um ein Auslagern auf die Festplatte zu vermeiden. Meine Vermutung, dass der Druck rot ist, deutet auf Auslagerungen und eine dramatische Überbelegung hin und / oder auf eine Zeit, in der die freien Seiten unter dem vom System bevorzugten Wert liegen und inaktive Seiten und / oder Auslagerungsseiten, die voraussichtlich zum Auslagern verwendet werden, aktiv gelöscht werden. In ähnlicher Weise stellt sich das System schnell wieder her, sobald die Zuordnungen freigegeben sind und das virtuelle Speichersystem entlastet wird.

bmike
quelle
Danke für die Abklärung. Ich würde gerne wissen, ob es einen Befehl (oder eine Reihe von Befehlen) gibt, der den virtuellen Speicher, den Dateicache und die App-Speicherparameter in der obigen Abbildung berechnet.
Muhammad Hassan Nasr
@ MuhammadHassan Die Antwort unten enthält eine schöne Zusammenfassung des Algorithmus zum Reverse Engineering und zeigt, wo in xnuOpen Source nach Interna gesucht werden kann . Ich habe die 4 Werte herausgezogen, die für die Anzeige des Drucks in der grafischen Benutzeroberfläche am relevantesten sind.
bmike
30

Um dies etwas zu verdeutlichen und zu präzisieren: Der Speicherdruck ist eine Metrik, die vom Kernel (xnu) mit einem dedizierten Thread namens memory_status (früher als Jetsam bekannt) verwendet wird. Dieser Thread ist dafür verantwortlich, zu erkennen, wann der verfügbare Arbeitsspeicher niedrig ist - was unter OS X das Auslagern erzwingen kann und unter iOS die App mit dem höchsten Speicherverbrauch beendet (da kein Auslagerungsspeicher vorhanden ist). In Mavericks sind die beiden Betriebssysteme näher beieinander. Memorystatus gibt eine Kernel-Notiz aus, die die Obj-C-Laufzeit schließlich in eine appDidReceiveLowMemoryWarning übersetzt. Apps sollen nicht genutzten oder fremden Speicher (z. B. Caches) bereinigen. Darwins libC löscht auch automatisch den Speicher.

Es gibt einen speziellen (wenn auch nicht dokumentierten) Systemaufruf, vm_pressure_monitor (# 296, wenn ich mich richtig erinnere), mit dem ein Client Druckereignisse abhören und sehen kann, wie viele physische Seiten zurückgefordert werden können.

Sie können Druckereignisse auf Mavericks mit Process Explorer für OS X anzeigen, das Sie von http://newosxbook.com/index.php?page=downloads herunterladen können . Das zeigt Ihnen sowohl das Manometer als auch die Druckereignisse.

Ich helfe nur
quelle
Diese Website enthält auch einen detaillierten Artikel - newosxbook.com/articles/MemoryPressure.html -, der den Speicherdruck und die Handhabung unter OS X und iOS
detailliert
Geniales Detail über die Ähnlichkeiten und Unterschiede zwischen Mavericks und iOS-Kernel. Vielen Dank für den Link zum Process Explorer.
bmike
14

Der Speicherdruck wird durch zwei Zähler definiert, die Mach intern hält:

  • vm_page_free_count: Wie viele Seiten RAM sind derzeit frei
  • vm_page_free_target: Wie viele Seiten RAM sollten mindestens frei sein?

Sie können diese leicht mit sysctl sehen:

morpheus@Zephyr (~/Documents) % sysctl -a vm | grep page_free
vm.vm_page_free_target: 2000
vm.page_free_wanted: 0
vm.page_free_count: 73243

Wenn die Anzahl der freien Seiten unter den Zielwert fällt, besteht Druck.


Von http://newosxbook.com/articles/MemoryPressure.html

Nein
quelle