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 wird der Gedächtnisdruck berechnet?
Bildnachweise gehen auf diese Antwort aus einer Umfragefrage zum besten neuen Feature von Mavericks zurück.
Der Speicherdruck ist kein einfaches Maß für den Prozentsatz des freien Speichers und scheint ein Diagramm von 0 bis 100 % zu sein. Der sysctl
Wert von vm.memory_pressure
wird in Bezug auf ein berechnetes Ziel berechnet, das das Verhältnis zwischen freien und inaktiven Speicherseiten zu den verdrahteten und aktiven Seiten verfolgt. vm_stat
Die absoluten Zähler werden mit dem Befehlszeilentool 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 abdeckt und wie sie den Speicherdruck berechnen, sowie die Maßnahmen, die ergriffen werden, wenn der Druckindex hoch ist.
Die relevanten virtuellen Speicher (VM), die die Berechnung von speisen, vm.memory_pressure
sind:
vm.page_free_count
- eine absolute Anzahl freier Seitenvm.vm_page_free_target
- ein berechnetes Ziel oder Ziel für eine "druckfreie" Situationvm.page_free_wanted
- was das vm-System freigeben möchte, um den aktuell berechneten Druckindex zu mildernWenn Sie also Ihren Speicherdruck mit dem Aktivitätsmonitor verfolgen (oder meine Überprüfung der sysctl-Werte programmgesteuert oder in der Befehlszeilen-Shell), tun Sie gut daran, sich diese vier Werte anzusehen:
sysctl -a vm | egrep "page_free|pressure"
Mit Mavericks wurde ein neuer Befehl memory_pressure
eingeführt, und wenn ich ihn ausführe, um das Speichersubsystem in einen Warnzustand zu versetzen, können Sie sehen, wie der Speicherdruck in einen gelben Bereich ansteigt.
Das Tool wies dem Tool etwa 4 GB Speicher zu, als das Druckdiagramm stetig auf diesen Zustand zunahm, in dem anscheinend das "Warn" -Niveau angezeigt wird: sudo memory_pressure -l warn
. Wie Sie sehen können, hatte das System vor dem Druck 5,9 GB und danach bis zu 7,99 GB verwendet, was sich aufgrund von Auslagerung und Komprimierung nicht einmal addieren muss.
Nachdem ich beobachtet hatte, wie vm_stat 15
das Warnergebnis kein messbares Paging zeigte, 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 habe dies nicht länger als ein paar Minuten laufen lassen, als das Paging begann, 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 beenden.
Sie können beobachten, wie schnell das System RAM freigab, nachdem die Warnung beendet wurde, und auch, wie es in den „roten“ Bereich überging, um zu zeigen, dass das virtuelle Speichersystem nicht genügend Seiten komprimieren konnte, um ein Auslagern auf die Festplatte zu vermeiden. Meine begründete Vermutung ist rot, dass der Druck auf Austausch und dramatische Überzuweisung und/oder eine Zeit hindeutet, in der die freien Seiten unter der vom System bevorzugten Menge liegen und inaktive Seiten aktiv gelöscht und/oder Seiten ausgetauscht werden, von denen erwartet wird, dass sie zum Austausch verwendet werden. In ähnlicher Weise erholt sich das System schnell, sobald die Zuweisungen freigegeben sind und das virtuelle Speichersystem entlastet ist.
Um diese Vermutung etwas zu verdeutlichen und genauer zu machen: Speicherdruck ist eine Metrik, die vom Kernel (xnu) mit einem dedizierten Thread namens memory_status (früher bekannt als Jetsam) verwendet wird. Dieser Thread ist dafür verantwortlich, zu erkennen, wann der verfügbare Arbeitsspeicher niedrig ist – was in OS X das Austauschen erzwingen kann und in iOS die App mit dem höchsten Speicherverbrauch beendet (da es keinen Austausch gibt). In Mavericks liegen die beiden Betriebssysteme näher beieinander. Memorystatus gibt einen Kernelhinweis aus, den die Obj-C-Laufzeit schließlich in eine appDidReceiveLowMemoryWarning übersetzt. Apps sollen ungenutzten oder fremden Speicher (z. B. Caches) löschen. Darwins libC löscht den Speicher auch automatisch.
Es gibt einen speziellen (wenn auch nicht dokumentierten) Systemaufruf, vm_pressure_monitor (#296, wenn ich mich richtig erinnere), der es einem Client ermöglicht, Druckereignisse abzuhören und zu sehen, wie viele physische Seiten zurückgefordert werden können.
Sie können Druckereignisse auf Mavericks mit Process Explorer für OS X anzeigen – herunterladbar von http://newosxbook.com/index.php?page=downloads . Das zeigt Ihnen sowohl das Manometer als auch Druckereignisse an.
Der Speicherdruck wird durch zwei Zähler definiert, die Mach intern führt:
vm_page_free_count
: Wie viele RAM-Seiten sind derzeit freivm_page_free_target
: Wie viele RAM-Seiten sollten mindestens optimalerweise frei sein.Sie können diese leicht mit sysctl anzeigen:
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 Menge an freien Seiten unter die Zielmenge fällt, haben wir eine Drucksituation.
Muhammad Hassan Nasr
Fahrrad
xnu
Open Source nach den Interna suchen müssen. Ich habe die 4 abgedeckten Werte herausgezogen, die für die GUI-Anzeige des Drucks am relevantesten sind.Maciek Rek