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. Die absoluten Zähler werden mit dem vm_stat
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 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_pressure
erfolgt, 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.
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 15
das 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.
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.
xnu
Open 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.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.
quelle
Der Speicherdruck wird durch zwei Zähler definiert, die Mach intern hält:
vm_page_free_count
: Wie viele Seiten RAM sind derzeit freivm_page_free_target
: Wie viele Seiten RAM sollten mindestens frei sein?Sie können diese leicht mit sysctl sehen:
Wenn die Anzahl der freien Seiten unter den Zielwert fällt, besteht Druck.
Von http://newosxbook.com/articles/MemoryPressure.html
quelle