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?
Odpowiedzi:
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.swappiness
Opcja wchodzi w grę wget_scan_count()
zdefiniowane wmm/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.swappiness
To modyfikator, który zmienia równowagę między wymieniając stron cache plik na rzecz anonimowych stron.vm.swappiness
to wartość priorytetu nadawana anonimowym stronom, domyślnie ustawiona na 60 . Pamięć podręczna plików ma wartość priorytetu 200, od którejvm.swappiness
odejmuje 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 żevm.swappiness
zostanie ustawione na zero.Gdy
vm.swappiness
jest ustawiony na 100, priorytety będą równe (anon_prio=100
,file_prio=200-100=100
). Ustawienievm.swappiness
na zero zapobiegnie eksmitowaniu przez jądro stron anonimowych na rzecz stron z pamięci podręcznej plików.źródło
Istnieje formuła służąca do obliczenia, która strona zostanie zamieniona. W
vmscan.c
tym algorytmie można zobaczyć: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.
źródło
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
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.
źródło