Występ

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 strojony dla jądra linux i jaką wartość należy ustawić?  W tym artykule przestudiujemy ten parametr i jego wpływ na działający system linux.  Przetestujemy jego wpływ na pamięć podręczną stron systemu operacyjnego i na mallocs oraz na to, co pokazuje polecenie system free, gdy ten parametr jest ustawiony.  Zrobimy kilka świadomych domysłów 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.działa min_free_kbytes

System może potrzebować alokacji pamięci w celu zapewnienia prawidłowego funkcjonowania samego systemu system.  Jeśli jądro zezwala na alokację całej pamięci, może mieć problemy, gdy potrzebuje pamięci do regularnych operacji, aby zapewnić płynne działanie systemu operacyjnego.  Dlatego jądro udostępnia przestrajalny vm.min_free_kbytes.  Dostrajanie zmusi menedżera pamięci jądra do utrzymywania co najmniej X wolnej pamięci.   Oto oficjalna definicja z dokumentacja jądra linuksa: „Służy do wymuszenia na maszynie wirtualnej systemu Linux zachowania minimalnej liczby wolnych kilobajtów.  Maszyna wirtualna używa tej liczby do obliczenia wartości znaku wodnego [WMARK_MIN] dla każdej strefy lowmem w systemie. Każda strefa lowmem otrzymuje pewną liczbę zarezerwowanych bezpłatnych stron proporcjonalnie do jej rozmiaru. Do spełnienia alokacji PF_MEMALLOC potrzebna jest pewna minimalna ilość pamięci; jeśli ustawisz to na mniej niż 1024 KB, twój system będzie delikatnie uszkodzony i podatny na zakleszczenie przy dużych obciążeniach. Ustawienie zbyt wysokiego poziomu spowoduje natychmiastowe OOM twojego urządzenia.“

Weryfikowanie maszyny wirtualnej.min_free_kbytes Działa

Aby przetestować, czy ustawienie min_free_kbytes działa zgodnie z założeniami, stworzyłem wirtualną instancję linux z tylko 3.75 GB pamięci RAM.  Użyj darmowego polecenia poniżej, aby przeanalizować system:

# wolne -m

Patrząc na narzędzie wolnej pamięci powyżej używające flagi -m, aby wyświetlić wartości w MB.  Całkowita pamięć to 3.5 do 3.75 GB pamięci.  Wykorzystano 121 MB pamięci, 3.3 GB pamięci jest wolne, 251 MB jest wykorzystywane przez bufor bufora.  I 3.Dostępne 3 GB pamięci.

Teraz zmienimy wartość vm.min_free_kbytes i zobacz, jaki wpływ ma na pamięć systemową.  Powtórzymy nową wartość w wirtualnym systemie plików proc, aby zmienić wartość parametru jądra zgodnie z poniższym:

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

Widać, że parametr został zmieniony na 1.Około 5 GB i wszedł w życie.  Teraz użyjmy wolny polecenie ponownie, aby zobaczyć wszelkie zmiany rozpoznane przez system.

# wolne -m

Wolna pamięć i bufor bufora pozostają niezmienione przez polecenie, ale ilość pamięci jest wyświetlana jako dostępny została zmniejszona z 3327 do 1222 MB.  Co jest przybliżoną redukcją zmiany parametru do 1.5 GB min wolnej pamięci.

Teraz stwórzmy plik danych o pojemności 2 GB, a następnie zobaczmy, co odczytanie tego pliku do bufora pamięci podręcznej robi z wartościami.  Oto jak utworzyć plik danych o pojemności 2 GB w 2 wierszach skryptu bash poniżej.  Skrypt wygeneruje losowy plik o wielkości 35 MB za pomocą polecenia dd, a następnie skopiuje go 70 razy do nowego plik danych wynik:

# dd if=/dev/random of=/root/d1.liczba txt = 1000000
# dla i w 'seq 1 70'; wykonaj echo $i; kot /korzeń/d1.txt >> /root/plik_danych; gotowy

Przeczytajmy plik i zignorujmy zawartość, odczytując i przekierowując plik do /dev/null jak poniżej:

# cat data_file > /dev/null

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

# wolne -m

Analizując powyższe wyniki.  Nadal mamy 1.8 GB wolnej pamięci, więc jądro chroniło dużą część pamięci jako zarezerwowaną ze względu na nasze ustawienie min_free_kbytes.  Pamięć podręczna bufora zużyła 1691 MB, czyli mniej niż całkowity rozmiar naszego pliku danych, który wynosi 2.3 GB.  Podobno cały plik danych nie można było zapisać w pamięci podręcznej z powodu braku dostępnej pamięci do wykorzystania w pamięci podręcznej bufora.  Możemy sprawdzić, czy cały plik nie jest przechowywany w pamięci podręcznej, ale mierzy czas powtarzających się prób odczytania pliku. Gdyby był buforowany, odczytanie pliku zajęłoby ułamek sekundy.  Spróbujmy.

# czas cat data_file > /dev/null
# czas cat data_file > /dev/null

Odczytanie pliku zajęło prawie 20 sekund, co oznacza, że ​​prawie na pewno nie wszystkie są zbuforowane.

W ramach ostatecznej walidacji zmniejszmy vm.min_free_kbytes, aby pamięć podręczna strony miała więcej miejsca do działania i możemy oczekiwać, że pamięć podręczna będzie działać, a odczyt pliku będzie znacznie szybszy.

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

Dzięki dodatkowej pamięci dostępnej do buforowania czas odczytu pliku spadł z 20 sekund przed do before .364 sekundy z tym wszystkim w pamięci podręcznej.

Jestem ciekawa zrobić kolejny eksperyment.  Co dzieje się z wywołaniami malloc w celu alokacji pamięci z programu w języku C w obliczu tak naprawdę wysokiego vm?.ustawienie min_free_kbytes.  Czy zawiedzie malloc??  Czy system umrze??  Najpierw zresetuj vm.ustawienie min_free_kbytes na naprawdę wysoką wartość, aby wznowić nasze eksperymenty:

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

Spójrzmy jeszcze raz na naszą wolną pamięć:

Teoretycznie mamy 1.9 GB za darmo i 515 MB dostępne.  Użyjmy programu do testów warunków skrajnych o nazwie stress-ng, aby wykorzystać trochę pamięci i zobaczyć, gdzie nam się nie udaje.  Skorzystamy z 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ć.

# stress-ng --vm 1 --vm-bytes 1G --timeout 60s
stress-ng: info: [17537] wysyłanie świń: 1 vm
stress-ng: info:  [17537] alokacja pamięci podręcznej: domyślny rozmiar pamięci podręcznej: 46080K
stress-ng: info: [17537] udany bieg ukończony w 60.09s (1 min, 0.09 sekund)
# stress-ng --vm 2 --vm-bytes 1G --timeout 60s
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Spróbujmy jeszcze raz z większą liczbą pracowników, możemy spróbować 1, 2, 3, 4 pracowników i w pewnym momencie powinno się nie udać.  W moim teście przeszedł z 1 i 2 pracownikami, ale nie powiódł się z 3 pracownikami.

Zresetujmy vm.min_free_kbytes do niskiej liczby i zobacz, czy to pomoże nam uruchomić 3 stresory pamięci z 1 GB każdy na 3.System 75 GB.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s

Tym razem przebiegło pomyślnie bez błędów, próbowałem dwa razy bez problemów.  Mogę więc stwierdzić, że istnieje różnica behawioralna polegająca na tym, że więcej pamięci dostępnej dla malloc, gdy vm when.wartość min_free_kbytes jest ustawiona na niższą wartość.

Ustawienie domyślne dla vm v.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 zniszczonym systemie mam tendencję do zwiększania jej nieco do 128 MB, aby umożliwić więcej zarezerwowanej wolnej pamięci, jednak przy przeciętnym użytkowaniu wartość domyślna wydaje się wystarczająco rozsądna.  Oficjalna dokumentacja ostrzega przed zbyt wysoką wartością.  Ustawienie jej na 5 lub 10% systemowej pamięci RAM prawdopodobnie nie jest zamierzonym użyciem tego ustawienia i jest zbyt wysokie.

Ustawienie vm.min_free_kbytes, aby przetrwać ponowne uruchomienie

Aby mieć pewność, że ustawienie przetrwa ponowne uruchomienie i nie zostanie przywrócone do wartości domyślnych podczas ponownego uruchamiania, upewnij się, że ustawienie sysctl jest trwałe, umieszczając żądaną nową wartość w /etc/sysctl.plik konfiguracyjny.

Wniosek

Widzieliśmy, że vm.Min_free_kbytes tunable jądra linux może być modyfikowane i może rezerwować pamięć w systemie, aby zapewnić większą stabilność systemu, szczególnie podczas intensywnego użytkowania i dużej alokacji pamięci.  Domyślne ustawienia mogą być trochę za niskie, szczególnie w systemach z dużą ilością pamięci i należy je ostrożnie zwiększyć.  Widzieliśmy, że pamięć zarezerwowana przez ten strojony uniemożliwia pamięć podręczną systemu operacyjnego przed użyciem całej pamięci, a także uniemożliwia niektórym operacjom malloc użycie całej pamięci.

Gry Jak przechwytywać i przesyłać strumieniowo sesję gry w systemie Linux
Jak przechwytywać i przesyłać strumieniowo sesję gry w systemie Linux
W przeszłości granie w gry było uważane tylko za hobby, ale z czasem branża gier odnotowała ogromny wzrost pod względem technologii i liczby graczy. P...
Gry Najlepsze gry do grania ze śledzeniem rąk
Najlepsze gry do grania ze śledzeniem rąk
Oculus Quest niedawno wprowadził świetny pomysł śledzenia rąk bez kontrolerów. Przy stale rosnącej liczbie gier i działań, które wspierają zarówno for...
Gry Jak wyświetlić nakładkę OSD w pełnoekranowych aplikacjach i grach dla systemu Linux?
Jak wyświetlić nakładkę OSD w pełnoekranowych aplikacjach i grach dla systemu Linux?
Granie w gry pełnoekranowe lub korzystanie z aplikacji w trybie pełnoekranowym bez rozpraszania uwagi może odciąć Cię od istotnych informacji systemow...