Co to jest VM.min_free_kbytes i jak to dostroić?

Co to jest VM.min_free_kbytes i jak to dostroić?
Co to jest VM.min_free_kbytes sysctl dostrajany dla jądra Linux i jaką wartość powinna być ustawiona? Będziemy przestudiować ten parametr i sposób, w jaki wpływa on na działający system Linuksa w tym artykule. Przetestujemy jego wpływ na pamięć podręczną strony systemu operacyjnego i na Mallocs oraz to, co pokazuje komenda bezpłatna systemu, gdy ten parametr jest ustawiony. Zgadamy w wykształconych domysłach na temat idealnych wartości dla tego dostrajania i pokażemy, jak ustawić VM.min_free_kbytes na stałe, aby przetrwać ponowne uruchomienie. Więc chodźmy.

Jak VM.Min_free_kbytes działa

System może potrzebować przydziałów pamięci, aby zapewnić prawidłowe funkcjonowanie samego systemu. Jeśli jądro pozwala na przydzielenie całej pamięci, może walczyć, gdy potrzebuje pamięci regularnych operacji, aby system operacyjny działał płynnie. Właśnie dlatego jądro zapewnia dostrajalną maszynę wirtualną.min_free_kbytes. Dostrojenia zmusi menedżera pamięci jądra do zachowania co najmniej x ilość wolnej pamięci. Oto oficjalna definicja z dokumentacji jądra Linux: „Służy to do wymuszenia VM Linux do utrzymania minimalnej liczby kilobajtów za darmo. VM używa tej liczby do obliczenia wartości znaku wodnego [WMARM_MIN] dla każdej strefy LowMem w systemie. Każda strefa Lowmem otrzymuje proporcjonalnie wiele zarezerwowanych wolnych stron. Potrzebna jest pewna minimalna ilość pamięci, aby spełnić alokacje PF_MEMALLOC; Jeśli ustawisz to na niższe niż 1024 kB, Twój system stanie się subtelnie zepsuty i podatny na impas przy wysokim obciążeniu. Ustawienie tego zbyt wysoko będzie natychmiast."

Walidacja maszyny wirtualnej.Min_free_kbytes działa

Aby przetestować, że ustawienie min_free_kbytes działa zgodnie z projektem, utworzyłem instancję wirtualną Linux z zaledwie 3.75 GB pamięci RAM. Użyj poniższej komendy, aby przeanalizować system:

# darmowe -m

Patrząc na narzędzie bezpłatnego pamięci powyżej za pomocą flagi -m, aby wartości wydrukowały w MB. Całkowita pamięć to 3.5 do 3.75 GB pamięci. Używane jest 121 MB pamięci, 3.3 GB pamięci jest bezpłatne, 251 MB jest używane przez pamięć podręczną bufora. I 3.Dostępne jest 3 GB pamięci.

Teraz zmienimy wartość VM.min_free_kbytes i zobacz, jaki jest wpływ na pamięć systemu. Powtarzamy nową wartość do wirtualnego systemu plików Proc, aby zmienić wartość parametru jądra według poniżej:

# echo 1500000>/proc/sys/vm/min_free_kbytes
# Sysctl Vm.min_free_kbytes

Widać, że parametr został zmieniony na 1.5 GB w przybliżeniu i weszło w życie. Teraz użyjmy bezpłatny Poleć ponownie, aby zobaczyć wszelkie zmiany rozpoznane przez system.

# darmowe -m

Wolna pamięć i pamięć podręczna bufora pozostają niezmienione przez polecenie, ale ilość pamięci wyświetlonej jako dostępny został zmniejszony z 3327 do 1222 MB. Co jest przybliżonym zmniejszeniem zmiany parametru na 1.5 GB min Bezpłatna pamięć.

Teraz utwórzmy plik danych 2 GB, a następnie zobaczmy, co odczytuje ten plik w pamięci podręcznej bufora do wartości. Oto jak utworzyć plik danych 2 GB w 2 wierszach skryptu BASH. Skrypt wygeneruje losowy plik 35 MB za pomocą polecenia DD, a następnie skopiuj go 70 razy na nowy plik danych wyjście:

# dd if =/dev/land of =/root/d1.liczba txt = 1000000
# dla i w „seq 1 70”; echo $ i; Cat /root /D1.txt >> /root /data_file; zrobione

Przeczytajmy plik i zignoruj ​​zawartość, odczytując i przekierowując plik do /dev /null zgodnie z poniżej:

# cat data_file> /dev /null

Ok, co stało się z naszą pamięcią systemową z tym zestawem manewrów, sprawdźmy to teraz:

# darmowe -m

Analiza wyników powyżej. Nadal mamy 1.8 GB wolnej pamięci, aby jądro chroniło duży kawałek pamięci zarezerwowanej z powodu naszego ustawienia min_free_kbytes. Pamięć podręczna bufora wykorzystywała 1691 MB, czyli mniej niż całkowity rozmiar naszego pliku danych, który wynosi 2.3 GB. Najwyraźniej całość plik danych nie można było przechowywać w pamięci podręcznej z powodu braku dostępnej pamięci do użycia w pamięci podręcznej bufora. Możemy potwierdzić, że cały plik nie jest przechowywany w pamięci podręcznej, ale czasowe powtarzane próby odczytania pliku. Gdyby został buforowany, odczytanie pliku zajęłoby ułamek sekundy. Spróbujmy.

# Time cat data_file> /dev /null
# Time cat data_file> /dev /null

Odczyt pliku trwał prawie 20 sekund, co oznacza, że ​​prawie na pewno nie wszystkie buforowane.

Jako jedna ostateczna walidacja zmniejszmy maszynę wirtualną.min_free_kbytes, aby umożliwić pamięci podręcznej strony na działanie więcej miejsca na działanie i możemy spodziewać się, że pamięć podręczna i plik odczytujący się znacznie szybciej.

# echo 67584>/proc/sys/vm/min_free_kbytes
# Time cat data_file> /dev /null
# Time cat data_file> /dev /null

Z dodatkową pamięcią dostępną do buforowania czasu odczytu pliku spadł z 20 sekund przed .364 sekundy z tym wszystkim w pamięci podręcznej.

Jestem ciekawy kolejnego eksperymentu. Co dzieje się z wezwaniami Malloc, aby przydzielić pamięć z programu C w obliczu tej naprawdę wysokiej maszyny wirtualnej.Ustawienie min_free_kbytes. Czy zawiedzie Malloc? Czy system umrze? Najpierw zresetuj VM.Min_free_kbytes Ustawienie na naprawdę wysoką wartość, aby wznowić nasze eksperymenty:

# echo 1500000>/proc/sys/vm/min_free_kbytes

Spójrzmy ponownie na naszą bezpłatną pamięć:

Teoretycznie mamy 1.9 GB za darmo i dostępne 515 MB. Użyjmy programu testu warunków skrajnych o nazwie Stress-NG, aby użyć pamięci i zobaczmy, gdzie zawodzimy. Użyjemy testera VM i spróbujemy przydzielić 1 GB pamięci. Ponieważ zarezerwowaliśmy tylko 1.5 GB na 3.System 75 GB, myślę, że to powinno działać.

# stres-ng --vm 1 --vm-bajtes 1G-Timeout 60s
Stress-NG: Informacje: [17537] Wysyłanie wieprzy: 1 VM
stres-NG: Informacje: [17537] Pamięć podręczna: Domyślna pamięć podręczna Rozmiar: 46080k
Stress-NG: Informacje: [17537] Udany bieg zakończony w 60.09s (1 min, 0.09 sekund)
# stres-ng --vm 2 --vm-bytes 1G-Timeout 60s
# stres-ng --vm 3 --vm-bites 1G-Timeout 60s

Spróbujmy ponownie z większą liczbą pracowników, możemy spróbować pracowników 1, 2, 3, 4. W moim teście minęło to z 1 i 2 pracowników, ale nie udało się z 3 pracownikami.

Zresetujmy VM.min_free_kbytes do niskiej liczby i sprawdź, czy to pomaga nam uruchomić 3 stresory pamięci z 1 GB na 3.System 75 GB.

# echo 67584>/proc/sys/vm/min_free_kbytes
# stres-ng --vm 3 --vm-bites 1G-Timeout 60s

Tym razem działało pomyślnie bez błędu, próbowałem go dwa razy bez problemów. Mogę więc stwierdzić, że istnieje różnica behawioralna posiadania większej pamięci dla Malloc, gdy VM.Min_free_kbytes Wartość jest ustawiona na niższą wartość.

Domyślne ustawienie dla VM.min_free_kbytes

Domyślna wartość ustawienia w moim systemie to 67584, czyli około 1.8% pamięci RAM w systemie lub 64 MB. Ze względów bezpieczeństwa w mocno uniesionym systemie miałbym tendencję do zwiększenia go, być może do 128 MB, aby umożliwić bardziej zarezerwowaną wolną pamięć, jednak dla średniego użytkowania wartość domyślna wydaje się wystarczająco rozsądna. Oficjalna dokumentacja ostrzega o tym, że wartość jest zbyt wysoka. Ustawienie go na 5 lub 10% systemu RAM prawdopodobnie nie jest zamierzonym użyciem ustawienia i jest zbyt wysokie.

Ustawienie maszyny wirtualnej.min_free_kbytes, aby przetrwać ponowne uruchomienie

Aby upewnić się, że ustawienie może przetrwać ponowne uruchomienie i nie jest przywrócone do wartości domyślnych podczas ponownego uruchomienia, upewnij się, że ustawienie SYSCTL trwałe, umieszczając żądaną nową wartość w /etc /sysctl.plik CONF.

Wniosek

Widzieliśmy, że VM.Min_free_kbytes Linux jądro Troundable można modyfikować i może zarezerwować pamięć w systemie, aby zapewnić, że system jest bardziej stabilny, szczególnie podczas ciężkiego użytkowania i przydziałów pamięci ciężkiej. Ustawienia domyślne mogą być nieco zbyt niskie, szczególnie w systemach o wysokiej pamięci i należy je uznać za ostrożnie zwiększone. Widzieliśmy, że pamięć zarezerwowana przez ten dostrajalny zapobiega korzystaniu z pamięci systemu operacyjnego, a także zapobiega użyciu również operacji MALLOC.