Co tak naprawdę kontroluje parametr vm.swappiness?

37

Według dokumentacji jądra:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

Jest to jednak niejasne. Próbuję dowiedzieć się dokładnie, co ostatecznie kontroluje parametr. Wiem, że dostosowuje to, jak agresywnie jądro próbuje wymieniać strony, ale na jaki proces decyzyjny w kodzie jądra to wpływa?

Czy dostosowuje to, jak dawno trzeba było otworzyć stronę, zanim jądro ją zmieni? Jeśli tak, jaka jest domyślna wartość 60? A ile zmienia się o przyrost / spadek o 1 (formuła byłaby miła)?
Czy też zamienia strony na podstawie ich częstotliwości dostępu?
Albo coś innego?

Patrick
źródło
2
Tak, zamiana jest niejasna ;-)
ℝaphink

Odpowiedzi:

27

Od wersji jądra 2.6.28, Linux używa podziału najdawniej używany (LRU) Strona strategię zastępczą. Strony ze źródłem systemu plików, takim jak tekst programu lub biblioteki współdzielone, należą do pamięci podręcznej plików. Strony bez kopii zapasowej systemu plików są nazywane stronami anonimowymi i składają się z danych wykonawczych, takich jak przestrzeń stosu zarezerwowana dla aplikacji itp. Zazwyczaj strony należące do pamięci podręcznej plików są tańsze do eksmisji z pamięci (ponieważ można je w razie potrzeby łatwo odczytać z dysku) . Ponieważ anonimowe strony nie mają kopii zapasowej systemu plików, muszą pozostać w pamięci tak długo, jak są potrzebne programowi, chyba że jest tam miejsce do ich wymiany.

vm.swappinessOpcja wchodzi w grę w get_scan_count()zdefiniowane w mm/vmscan.c. get_scan_count()określa, jak agresywnie anonimowe i plikowe listy LRU powinny być skanowane podczas szukania stron do eksmisji. Wartość każdego przypadku jest określona przez zmienną średnią ostatnio obróconych i ostatnio zeskanowanych wskaźników, przy czym nowsze referencje mają większą wagę niż starsze, aby uwzględnić zmieniające się obciążenie systemu.

vm.swappinessTo modyfikator, który zmienia równowagę między wymieniając stron cache plik na rzecz anonimowych stron. vm.swappinessto wartość priorytetu nadawana anonimowym stronom, domyślnie ustawiona na 60 . Pamięć podręczna plików ma wartość priorytetu 200, od której vm.swappinessodejmuje się modyfikator ( file_prio=200-anon_prio). Oznacza to, że domyślnie wagi priorytetowe są umiarkowanie korzystne dla anonimowych stron ( anon_prio=60, file_prio=200-60=140). Jednak gdy system jest bliski stanu braku pamięci , zarówno anonimowe, jak i plikowe listy LRU są skanowane jednakowo, chyba że vm.swappinesszostanie ustawione na zero.

Gdy vm.swappinessjest ustawiony na 100, priorytety będą równe ( anon_prio=100, file_prio=200-100=100). Ustawienie vm.swappinessna zero zapobiegnie eksmitowaniu przez jądro stron anonimowych na rzecz stron z pamięci podręcznej plików.

Thomas Nyman
źródło
Czy istnieje sposób na zmianę zamiany file_prio? Lub ograniczyć go do konkretnego katalogu?
CMCDragonkai
13

Istnieje formuła służąca do obliczenia, która strona zostanie zamieniona. W vmscan.ctym algorytmie można zobaczyć:

tendencja zamiany = mapowane_ratio / 2 + distress + vm_swappiness

Tutaj widać, że zamiana jest skalą, która jest dodawana w pewnym algorytmie i za pomocą tego parametru można kontrolować, jak jądro będzie się zachowywać, gdy będzie wymagało wymiany. Można to określić jako procent prawdopodobieństwa, że ​​niektóre nieaktywne strony pamięci zostaną zamienione. Jeśli ustawisz swappiness na 100, nie ma prawdopodobieństwa, ale jest to gwarancja, że ​​zamieni się, a jeśli ustawisz na 0, jądro spróbuje w ogóle nie zamieniać tak długo, jak będzie miało trochę pustej pamięci.

Jan Marek
źródło
6

Mówi się (myślę, że Norman 1986), że często przycisk „ZAMKNIJ DRZWI” w windzie albo jest zepsuty, albo nigdy nie był podłączony do niczego. To sprawia, że ​​kontrola ersatz nie jest sposobem na manipulowanie windą, ale na uspokojeniu zbyt spieszonego jeźdźca.

W podobny sposób swappiness ma wpływ niezwiązany z dobrze zdefiniowaną, deterministyczną kontrolą predykatu jądra. Jak zauważył @neon_overlord na askubuntu.com

Ponieważ większość uważa, że ​​zamiana = zła i że jeśli nie zmniejszysz swapingu, system podmieni się, gdy tak naprawdę nie będzie musiał. Żadna z tych rzeczy nie jest prawdziwa. Ludzie kojarzą zamianę z czasami, w których ich system grzęźnie - jednak najczęściej jest to zamiana, ponieważ system grzęźnie, a nie na odwrót. To prawda, że ​​w pewnych momentach zamiana może mieć zauważalną karę, ale zmniejszenie zamiany w tym przypadku może zmniejszyć ogólną wydajność lub stabilność systemu na inne sposoby, które później mogą stać się zauważalne…

Co więc tak naprawdę kontroluje? Jedną ważną odpowiedzią - oprócz już podanych dobrych odpowiedzi - jest to, że modyfikuje twoje oczekiwania, że ​​masz większą kontrolę nad swoim systemem, a kręcenie gałką pozwoli ci sprawować tę kontrolę w znaczący sposób.

msw
źródło