Wie wird der Y-Wert für das Speicherdruckdiagramm im Aktivitätsmonitor berechnet?

Wie wird vm.memory_pressureder Wert von auf OS X 10.10.2 - Yosemite begrenzt/berechnet?

Ich habe mehrere Antworten auf diese Frage recherchiert und versuche ein paar Dinge in der Befehlszeile, um genaue Werte zu erhalten, anstatt auf die Diagramme im Aktivitätsmonitor zu schauen.

Bei leicht belastetem System:

~ ❯❯❯ sysctl -a vm | grep page_free && sysctl vm.memory_pressure && sysctl kern.memorystatus_vm_pressure_level
vm.vm_page_free_target: 4000
vm.page_free_wanted: 0
vm.page_free_count: 2683717
vm.memory_pressure: 0
kern.memorystatus_vm_pressure_level: 1

Das kern.memorystatus_vm_pressure_level sieht richtig aus und scheint das zu sein, was es verwendet, um das Diagramm einzufärben (grün für 1-NORMAL, gelb für 2-WARN, rot für 4-CRITICAL). vm.memory_pressure ist jedoch 0 und der Graph hat eine gewisse Menge an Grün und ist gezackt, was bedeutet, dass sich der Wert im Laufe der Zeit deutlich ändert und nicht nur bei 0 sitzt.

Unter starker Belastung sieht es so aus:

❯❯❯ sysctl -a vm | grep page_free && sysctl vm.memory_pressure && sysctl kern.memorystatus_vm_pressure_level
vm.vm_page_free_target: 4000
vm.page_free_wanted: 0
vm.page_free_count: 32572
vm.memory_pressure: 1693
kern.memorystatus_vm_pressure_level: 4

Oder dieses...

~ ❯❯❯ sysctl -a vm | grep page_free && sysctl vm.memory_pressure && sysctl kern.memorystatus_vm_pressure_level
vm.vm_page_free_target: 4000
vm.page_free_wanted: 0
vm.page_free_count: 5431
vm.memory_pressure: 277
kern.memorystatus_vm_pressure_level: 4

Oder dieses...

~ ❯❯❯ sysctl -a vm | grep page_free && sysctl vm.memory_pressure && sysctl kern.memorystatus_vm_pressure_level
vm.vm_page_free_target: 4000
vm.page_free_wanted: 3220
vm.page_free_count: 805
vm.memory_pressure: 1
kern.memorystatus_vm_pressure_level: 4

Hier bin ich verwirrt. Aus mehreren Gründen kann keiner dieser Werte allein der Y-Wert des Diagramms sein.

Erstens liegt vm.memory_pressure unter normaler Last fast immer bei 0, und der Graph liegt nicht bei 0.

Zweitens stimmen sie nicht überein. Betrachtet man den Wert von memory_pressure, so ist er niedriger, wenn er tatsächlich gewünschte Seiten hatte (3220 gewollt und Druck von nur 1), als wenn er 5431 freie und keine gewollten Seiten hatte (Druck war 277). Und irgendwie ist das noch weniger Druck als wenn es 32572 frei hatte (und 1693 Druck hatte).

Wenn es also dieses Diagramm zeichnet, wie lautet die Berechnung für den Y-Wert, und wie kann ich die Daten abrufen, die ich zur Berechnung über die Befehlszeile benötige? Ich möchte ein Befehlszeilentool erstellen, das einen Prozentsatz der Höhe der aktuellen Linie in diesem Diagramm ausspuckt. Daher muss ich wissen, wie der Wert zu einem bestimmten Zeitpunkt berechnet wird und wie groß der Bereich ist mögliche Werte sind.

Tolle Frage. Der Aktivitätsmonitor zeigt den Druck auf einer Skala von 0 % bis 100 % an, aber ich habe keine Referenz zu den Befehlszeilenkommentaren dazu gefunden. Ich werde sehen, ob ich diese Woche genug für eine Antwort ausgraben kann. Können wir davon ausgehen, dass Sie nur an 10.10.x interessiert sind?
Danke schön. Und ja, ich bin am 10.10.2, also ist das der einzige, mit dem ich mich diesbezüglich befasse.
Faszinierende Datenpunkte. Mir ist immer noch nicht klar, wie der Algorithmus entworfen oder codiert ist - oder ob er von Version zu Version gleich bleibt. Siehe apple.stackexchange.com/questions/107126/… für einige nette Kommentare und weitere Daten dazu.

Antworten (1)

Dies ist derzeit nur eine Teilantwort. Diese Antwort ist nicht vollständig, bis dieser Satz entfernt wurde.

Die Sache mit dieser Frage ist, dass das Memory Pressure-Diagramm auf den ersten Blick keinen Sinn ergibt, wenn man es mit dem vergleicht, was in Terminal gemeldet wird, wenn man den vom OP beschriebenen Befehl verwendet:

sysctl -a vm | grep page_free && sysctl vm.memory_pressure && sysctl kern.memorystatus_vm_pressure_level

Das Problem hierbei ist jedoch, dass dieser Befehl die VM-Werte, die er zurückmeldet, einschränkt. Tatsächlich gibt es insgesamt 105 Werte, aber dieser Befehl meldet nur die folgenden fünf Werte:

vm.vm_page_free_target:
vm.page_free_wanted:
vm.page_free_count:
vm.memory_pressure:
kern.memorystatus_vm_pressure_level:

HINWEIS: Numerische Werte würden normalerweise nach dem Doppelpunkt (:) erscheinen, ich habe diese jedoch nicht eingefügt.

Offensichtlich ist die überwiegende Mehrheit der 105 vm-Werte nicht Teil der eigentlichen Berechnung, die den Speicherdruck bestimmt, aber das Problem hier ist, dass die fünf obigen Werte nicht die einzigen sind, die zur Berechnung des Speicherdrucks verwendet werden .

Während die obige Ausgabe beispielsweise einige der verschiedenen freien Werte liefert, liefert sie keine der inaktiven Werte usw.

Diese Werte sind wichtig, da der Speicherdruckalgorithmus ein Verhältnis zwischen diesen Werten berechnet und die Beziehung zwischen diesen Werten nicht aus der Ausgabe hervorgeht, die vom Befehl in der OP-Frage erzeugt wird.

Ich glaube, ich habe vielleicht einige technische Informationen, die mehr Licht ins Dunkel bringen können. Ich werde diese Antwort so oder so innerhalb der Woche aktualisieren.

[STATUS-UPDATE]

Ich konnte die technischen Informationen, nach denen ich gesucht habe, nicht finden. Ich bin mir jedoch ziemlich sicher, dass ich es noch habe - wahrscheinlich auf einigen alten CDR/DVDR-Backups. Ich werde diese Antwort aktualisieren, sobald ich sie gefunden habe oder wenn ich sicher bin, dass ich sie nicht finden werde.