proc_sys_vm(5) File Formats Manual proc_sys_vm(5) NAZWA /proc/sys/vm/ - podsystem pamieci wirtualnej OPIS /proc/sys/vm/ Ten katalog zawiera pliki sterujace zarzadzaniem pamiecia, buforami i zarzadzaniem cachem. /proc/sys/vm/admin_reserve_kbytes (od Linuksa 3.10) Plik definiuje wielkosc wolnej pamieci (w KiB) w systemie, jaka ma byc zarezerwowana dla uzytkownikow z przywilejem CAP_SYS_ADMIN. Wartosc domyslna w tym pliku jest mniejsza z [3% wolnych stron, 8MiB], wyrazona w KiB. Wartosc ta ma byc wystarczajaca do zalogowania sie superuzytkownika i zabicia procesu, jesli to konieczne, przy uzyciu domyslnego trybu 'guess' overcommit (tj. 0 w /proc/sys/vm/overcommit_memory). Systemy dzialajace w trybie ,,overcommit never" (tj. 2 w /proc/sys/vm/overcommit_memory) powinny zwiekszyc wartosc w tym pliku, biorac pod uwage pelny rozmiar pamieci wirtualnej, jaka uzyja programy sluzace do odzyskania kontroli (np. login(1), ssh(1) i top(1)). W innym przypadku, superuzytkownik moze nie byc w stanie zalogowac sie, w celu odzyskania systemu. Przykladowo, na architekturze x86-64 odpowiednia wartoscia jest 131072 (zarezerwowane 128MiB). Zmiana wartosci w tym pliku zaczyna byc stosowana, gdy tylko aplikacja zazada pamieci. /proc/sys/vm/compact_memory (od Linuksa 2.6.35) Po zapisie 1 do tego pliku wszystkie strefy sa przemieszczane w ten sposob, ze -- jesli to mozliwe -- pamiec jest dostepna w ciaglych blokach. Efekt tej akcji mozna sprawdzic za pomoca /proc/buddyinfo. Obecne tylko, jesli jadro zostalo skonfigurowane z CONFIG_COMPACTION. /proc/sys/vm/drop_caches (od Linuksa 2.6.16) Zapis do tego pliku powoduje zwolnienie przez jadro czystych buforow, dentries i i-wezlow z pamieci, powodujac zwolnienie pamieci. Moze byc to przydatne to testowania zarzadzania pamiecia i wykonywania powtarzalnych testow systemu plikow. Zapis do tego pliku powoduje utrate zalet buforowania, przez co moze spowodowac pogorszenie ogolnej wydajnosci systemu. Aby zwolnic bufor strony, prosze uzyc: echo 1 > /proc/sys/vm/drop_caches Aby zwolnic dentries i i-wezly, prosze uzyc: echo 2 > /proc/sys/vm/drop_caches Aby zwolnic bufor strony, dentries i i-wezly, prosze uzyc: echo 3 > /proc/sys/vm/drop_caches Poniewaz zapis do tego pliku nie jest destrukcyjny i brudne obiekty nie sa zwalniane, uzytkownik powinien wczesniej uruchomic sync(1). /proc/sys/vm/sysctl_hugetlb_shm_group (od Linuksa 2.6.7) Ten zapisywalny plik zawiera identyfikator grupy, ktora moze alokowac pamiec, za pomoca duzych (huge) stron. Jesli proces ma identyfikator grupy systemu plikow lub jakis z uzupelniajacych identyfikatorow grup ktory jest zgodny z tym ID grupy, to moze alokowac duze strony bez posiadania przywileju CAP_IPC_LOCK; zob. memfd_create(2), mmap(2) i shmget(2). /proc/sys/vm/legacy_va_layout (od Linuksa 2.6.9) Wartosc niezerowa oznacza wylaczenie nowego, 32-bitowego rozmieszczenia mapowania pamieci; jadro bedzie uzywac starego (2.4) rozmieszczenia dla wszystkich procesow. /proc/sys/vm/memory_failure_early_kill (od Linuksa 2.6.32) Kontroluje jak zabijac procesy z nienaprawialnym bledem pamieci (z reguly 2-bitowy blad w module pamieci), ktore nie moga byc obsluzone przez jadro, wykryte w tle przez sprzet. W niektorych przypadkach (np. jesli strona ma wciaz poprawna kopie na dysku), jadro obsluzy taki blad w sposob przezroczysty, bez wplywu na prace aplikacji. Jednak jesli nie istnieje inna, zaktualizowana kopia danych, jadro zabija procesy, aby zapobiec uszkodzeniu danych wyniklego z propagacji bledu. Plik posiada jedna z nastepujacych wartosci: 1 Wszystkie procesy, ktore posiadaja zmapowana uszkodzona i nieprzeladowana strone, sa zabijane zaraz po wykryciu uszkodzenia. Prosze zauwazyc, ze nie jest to obslugiwane dla nielicznych typow stron, takich jak wewnetrzne przypisanie danych przez jadro lub pamiec podreczna na dysku (swap), ale dziala w przypadku wiekszosci stron uzytkownika. 0 Usuwana (unmap) jest uszkodzona strona i zabijane procesy tylko, gdy chca uzyskac dostep do strony. Zabicie jest wykonywane za pomoca sygnalu SIGBUS z si_code ustawionym na BUS_MCEERR_AO. Procesy moga obsluzyc te sytuacje, jesli chca; prosze zapoznac sie z sigaction(2), aby dowiedziec sie wiecej. Funkcja jest aktywna wylacznie na architekturach/platformach z zaawansowana, maszynowa obsluga sprawdzania i zalezy od mozliwosci sprzetowych. Aplikacje moga indywidualnie przeslonic ustawienie memory_failure_early_kill za pomoca operacji PR_MCE_KILL prctl(2). Obecne tylko, jesli jadro zostalo skonfigurowane z CONFIG_MEMORY_FAILURE. /proc/sys/vm/memory_failure_recovery (od Linuksa 2.6.32) Wlacza odzyskiwanie po bledzie pamieci (jesli jest obslugiwane przez dana platforme). 1 Probuje odzyskiwac. 0 Zawsze panikuje przy bledzie pamieci. Obecne tylko, jesli jadro zostalo skonfigurowane z CONFIG_MEMORY_FAILURE. /proc/sys/vm/oom_dump_tasks (od Linuksa 2.6.25) Wlacza tworzenie ogolnosystemowego zrzutu zadania (bez watkow jadra), gdy jadro wykonuje OOM-killing. Zrzut zawiera nastepujace informacje o kazdym zadaniu (watku, procesie): identyfikator watku, realny identyfikator uzytkownika, identyfikator grupy watku (identyfikator procesu), rozmiar pamieci wirtualnej, rozmiar zestawu rezydentnego, procesor ktoremu przydzielono zadanie, wynik oom_adj (patrz opis /proc/pid/oom_adj) i nazwe polecenia. Jest to przydatne do okreslenia dlaczego OOM-killer zostal przywolany i zidentyfikowania zadania, ktore to spowodowalo. Jesli zawiera wartosc zero, ta informacja nie jest zrzucana. Zrobienie zrzutu stanu pamieci kazdego zadania moze nie byc wykonalne w bardzo duzych systemach, z tysiacami zadan. Takie systemy nie powinny byc zmuszane do narazania sie na dodatkowy spadek wydajnosci w sytuacjach braku pamieci, gdy taka informacja nie moze byc przydatna. Jesli wartosc jest niezerowa, ta informacja jest pokazywana kiedy tylko OOM-killer rzeczywiscie zabija zadanie zajmujace duzo pamieci. Domyslna wartoscia jest 0. /proc/sys/vm/oom_kill_allocating_task (od Linuksa 2.6.24) Wlacza lub wylacza zabijanie zadania kolejkujacego OOM w sytuacjach braku pamieci (Out-Of-Memory). Jesli jest ustawione na zero OOM-killer przeskanuje cala liste zadan i do zabicia wybierze zadania na podstawie heurystyki. Z reguly wybierane sa zadania zajmujace wiele pamieci, ktore zwalniaja duza ilosc pamieci po zabiciu. Jesli jest ustawione na wartosc niezerowa, OOM-killer po prostu zabija zadanie, ktore wyzwolilo stan braku pamieci. W ten sposob unika sie potencjalnie kosztownego skanowania listy zadan. Jesli /proc/sys/vm/panic_on_oom jest niezerowe, to ma ono pierwszenstwo, niezaleznie od wartosci uzytej w /proc/sys/vm/oom_kill_allocating_task. Domyslna wartoscia jest 0. /proc/sys/vm/overcommit_kbytes (od Linuksa 3.14) Ten zapisywalny plik zapewnia alternatywe do /proc/sys/vm/overcommit_ratio do kontrolowania CommitLimit gdy /proc/sys/vm/overcommit_memory ma wartosc 2. Pozwala na wykonanie overcommittu ilosci pamieci w jednostkach absolutnych (w kB), zamiast w wartosciach procentowych, jak to ma miejsce przy overcommit_ratio. W ten sposob mozna osiagnac lepsza kontrole CommitLimit na systemach z ekstremalnie duza iloscia pamieci. Tylko jeden z overcommit_kbytes lub overcommit_ratio moze dzialac: jesli overcommit_kbytes ma wartosc niezerowa, to jest uzywane do obliczenia CommitLimit, w przeciwnym razie uzywane jest overcommit_ratio. Zapisanie wartosci do ktoregokolwiek z plikow powoduje, ze wartosc w drugim jest ustawiana na zero. /proc/sys/vm/overcommit_memory Plik zawiera tryb rozliczen pamieci wirtualnej jadra. Dopuszczalne wartosci: 0: heurystyczny overcommit (domyslnie) 1: zawsze robi overcommit, nigdy nie sprawdza 2: zawsze sprawdza, nigdy nie robi overcommitu W trybie 0 nie sa sprawdzane wywolania mmap(2) z MAP_NORESERVE, a domyslne sprawdzenia sa bardzo slabe, prowadzac do ryzyka zabicia procesu przez ,,OOM-killera". W trybie 1 jadro udaje, ze jest zawsze wystarczajaca ilosc pamieci, dopoki pamiec faktycznie sie nie wyczerpie. Jednym z zastosowan tego trybu sa naukowe aplikacje obliczeniowe, ktore korzystaja z duzych, rozsianych macierzy. Przed Linuksem 2.6.0, kazda niezerowa wartosc implikowala 1. W trybie 2 (dostepnym od Linuksa 2.6), calkowity adres przestrzeni wirtualnej w systemie, ktora mozna przypisac (CommitLimit w /proc/meminfo) jest obliczany jako CommitLimit = (total_RAM - total_huge_TLB) * overcommit_ratio / 100 + total_swap gdzie: o total_RAM jest suma pamieci RAM w systemie; o total_huge_TLB jest suma pamieci przeznaczona dla duzych stron; o overcommit_ratio jest wartoscia w /proc/sys/vm/overcommit_ratio i o total_swap jest wielkoscia przestrzeni wymiany. Na przyklad w systemie z 16 GB fizycznej pamieci RAM i 16 GB pamieci wymiany, brakiem przestrzeni przeznaczonej na duze strony i z overcommit_ratio rownym 50, ta formula daje CommitLimit na poziomie 24 GB. Od Linuksa 3.14, gdy wartosc w /proc/sys/vm/overcommit_kbytes jest niezerowa, to CommitLimit jest obliczana w nastepujacy sposob: CommitLimit = overcommit_kbytes + total_swap Zobacz opis /proc/sys/vm/admin_reserve_kbytes i /proc/sys/vm/user_reserve_kbytes. /proc/sys/vm/overcommit_ratio (od Linuksa 2.6.0) Plik zapisywalny definiujacy wartosc procentowa pamieci, na ktorej mozna wykonac overcommit. Domyslna wartoscia jest 50. Zob. opis /proc/sys/vm/overcommit_memory. /proc/sys/vm/panic_on_oom (od Linuksa 2.6.18) Wlacza lub wylacza panike jadra w sytuacjach braku pamieci. Jesli plik ma ustawiona wartosc 0, OOM-killer jadra zabija ktorys z nieposlusznych procesow. Z reguly OOM-killer jest w stanie to wykonac i system moze pracowac dalej. Jesli plik ma ustawiona wartosc 1, to jadro zwykle panikuje przy sytuacji braku pamieci. Jednak jesli proces limituje przydzielanie do konkretnych wezlow uzywajac zasad pamieci (mbind(2) MPOL_BIND) lub cpuset (cpuset(7)) i te wezly dotknie problem braku pamieci, to taki proces moze byc zabity przez OOM-killer. Nie wystepuje wowczas panika, poniewaz pamiec innych wezlow moze byc wolna, co oznacza ze system jako calosc mogl nie osiagnac jeszcze sytuacji braku pamieci. Jesli ustawiono wartosc 2, to jadro zawsze panikuje w sytuacji braku pamieci. Domyslna wartosc jest 0. 1 i 2 sa przeznaczone do poprawnej pracy klastrow mimo wystapienia problemow. Prosze wybrac wlasciwa z nich, zgodnie z uzywanymi zasadami w takich sytuacjach. /proc/sys/vm/swappiness Wartosc w tym pliku kontroluje jak agresywnie jadro przenosi strony pamieci do pamieci wymiany (swapu). Wyzsze wartosci zwiekszaja agresywnosc, mniejsze zmniejszaja ja. Domyslna wartoscia jest 60. /proc/sys/vm/user_reserve_kbytes (od Linuksa 3.10) Okresla pamiec (w KiB) jaka ma byc zarezerowana dla procesow uzytkownika. Ma to pomoc zapobiegac sytuacji, gdy uzytkownik uruchomi pojedynczy zaborczy proces zajmujacy pamiec i nie bedzie w stanie wyjsc z tej sytuacji (zabic zaborcy). Wartosc w tym pliku dziala tylko wowczas, gdy /proc/sys/vm/overcommit_memory ustawiono na 2 (nigdy nie robi overcommitu). W takim przypadku, system rezerwuje wielkosc pamieci, ktora jest mniejsza wartoscia z [3% rozmiaru biezacego procesu, user_reserve_kbytes]. Domyslna wartoscia w tym pliku jest mniejsza wartosc z [3% wolnych stron, 128MiB], wyrazona w KiB. Jesli wartosc w tym pliku wynosi zero, to uzytkownik bedzie mogl zaalokowac cala wolna pamiec za pomoca pojedynczego procesu (minus rozmiar zarezerwowany przez /proc/sys/vm/admin_reserve_kbytes). Kazda kolejna proba wykonania polecenia spowoduje blad ,,fork: Cannot allocate memory" (nie mozna zaalokowac pamieci). Zmiana wartosci w tym pliku zaczyna byc stosowana, gdy tylko aplikacja zazada pamieci. /proc/sys/vm/unprivileged_userfaultfd (od Linuksa 5.2) Ten (zapisywalny) plik ujawnia znacznik kontrolujacy, czy procesy nieuprzywilejowane moga korzystac z userfaultfd(2). Jesli plik ma wartosc 1, to procesy nieuprzywilejowane moga uzywac userfaultfd(2). Jesli plik ma wartosc 0, to tylko procesy z przywilejem CAP_SYS_PTRACE moga uzywac userfaultfd(2). Wartoscia domyslna w tym pliku jest 1. ZOBACZ TAKZE proc(5), proc_sys(5) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. proc_sys_vm(5)