Jak obliczana jest wartość Y dla wykresu ciśnienia w pamięci w monitorze aktywności?

41

W jaki sposób vm.memory_pressurewartość jest ograniczona / obliczana w systemie OS X 10.10.2 - Yosemite?

Przeszukałem kilka odpowiedzi na to pytanie i próbuję kilku rzeczy w wierszu polecenia, aby uzyskać dokładne wartości, zamiast patrzeć na wykresy w monitorze aktywności.

Przy niewielkim obciążeniu systemu:

~ ❯❯❯ 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

Poziom kern.memorystatus_vm_pressure_level wygląda dobrze i wydaje się być tym, czego używa do pokolorowania wykresu (zielony dla 1-NORMALNY, żółty dla 2-WARN, czerwony dla 4-KRYTYCZNY). Jednak vm.memory_pressure wynosi 0, a wykres ma trochę zieleni i jest postrzępiony, co oznacza, że ​​wartość zmienia się wyraźnie w czasie, a nie tylko w pozycji 0.

Pod dużym obciążeniem wygląda to tak:

❯❯❯ 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

Albo to...

~ ❯❯❯ 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

Albo to...

~ ❯❯❯ 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

Tutaj jestem zdezorientowany. Żadna z tych wartości jako taka nie mogłaby być wartością Y wykresu z kilku powodów.

Po pierwsze, vm.memory_pressure po prostu prawie zawsze ma 0 przy normalnym obciążeniu, a wykres nie ma 0.

Po drugie, nie są ze sobą zgodne. Patrząc na wartość memory_pressure, jest on niższy, gdy rzeczywiście chciał stron (3220 chciał i nacisk tylko 1), niż gdy miał 5431 wolnego i żadnego nie chciał (ciśnienie 277). I w jakiś sposób jest to nawet niższe ciśnienie niż wtedy, gdy miało 32572 wolnego (i miało 1693 ciśnienia).

Kiedy więc rysuje ten wykres, jakie jest obliczenie wartości Y i jak mogę uzyskać dane potrzebne do obliczenia jej z wiersza poleceń? Chcę utworzyć narzędzie wiersza polecenia, które wypluje procent wysokości bieżącej linii na tym wykresie, więc muszę wiedzieć, jak obliczyć wartość w danym momencie, a także jaki zakres możliwe wartości to.

Raugturi
źródło
7
Świetne pytanie. Monitor aktywności pokazuje nacisk w skali od 0% do 100%, ale nie znalazłem żadnego odniesienia w komentarzach tego wiersza poleceń. Zobaczę, czy uda mi się wykopać wystarczająco dużo na odpowiedź w tym tygodniu. Czy możemy założyć, że interesuje Cię tylko wersja 10.10.x?
bmike
3
Dziękuję Ci. I tak, mam 10.10.2, więc tylko o to się martwię.
Raugturi,
5
Fascynujące punkty danych. Nadal nie jest dla mnie jasne, w jaki sposób algorytm został zaprojektowany lub zakodowany - a nawet jeśli pozostaje taki sam w zależności od wersji. Zobacz apple.stackexchange.com/questions/107126/..., aby uzyskać miły komentarz i więcej danych na ten temat.
bmike

Odpowiedzi:

2

To jest obecnie tylko częściowa odpowiedź. Ta odpowiedź nie jest kompletna, dopóki to zdanie nie zostanie usunięte.

Rzecz w tym pytaniu polega na tym, że na pierwszy rzut oka wykres ciśnienia w pamięci nie ma sensu, gdy porównuje się go z tym, co zgłoszono w Terminalu, gdy używa się polecenia opisanego przez OP:

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

Problem polega jednak na tym, że to polecenie ogranicza zgłaszane wartości vm. W rzeczywistości jest w sumie 105 wartości, ale to polecenie zgłasza tylko następujące pięć wartości:

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

UWAGA: Wartości liczbowe zwykle pojawiają się po dwukropku (:), jednak ich nie uwzględniłem.

Oczywiście przytłaczająca większość wartości 105 vm nie jest częścią faktycznego obliczenia, które determinuje ciśnienie pamięci, ale problem polega na tym, że pięć powyższych wartości nie jest jedynymi używanymi do obliczania ciśnienia pamięci .

Na przykład powyższe dane wyjściowe zawierają niektóre z różnych wolnych wartości, ale nie zapewniają żadnych nieaktywnych wartości itp.

Wartości te są ważne, ponieważ algorytm ciśnienia pamięci oblicza stosunek między tymi wartościami, a związek między tymi wartościami nie jest oczywisty z danych wyjściowych wygenerowanych przez polecenie w pytaniu PO.

Myślę, że mogę mieć pewne informacje techniczne, które mogą rzucić na to więcej światła. Zaktualizuję tę odpowiedź tak czy inaczej w ciągu tygodnia.

[AKTUALIZACJA STATUSU]

Nie mogłem znaleźć informacji technicznych, których szukałem. Jestem jednak pewien, że nadal go mam - prawdopodobnie na niektórych starych kopiach zapasowych CDR / DVDR. Zaktualizuję tę odpowiedź, gdy ją znajdę lub gdy będę pewien, że jej nie znajdę.

Monomeeth
źródło