proc_sys_vm(5)

NAZWA
/proc/sys/vm/ - podsystem pamięci wirtualnej

OPIS

/proc/sys/vm/
    Ten katalog zawiera pliki sterujące zarządzaniem pamięcią, buforami i zarządzaniem cachem.

/proc/sys/vm/admin_reserve_kbytes (od Linuksa 3.10)
    Plik definiuje wielkość wolnej pamięci (w KiB) w systemie, jaka ma być zarezerwowana dla użytkowników z przywilejem CAP_SYS_ADMIN.

    Wartość domyślna w tym pliku jest mniejszą z [3% wolnych stron, 8MiB], wyrażoną w KiB. Wartość ta ma być wystarczająca do zalogowania się superużytkownika i zabicia procesu, jeśli to konieczne, przy użyciu domyślnego trybu 'guess' overcommit (tj. 0 w /proc/sys/vm/overcommit_memory).

    Systemy działające w trybie „overcommit never” (tj. 2 w /proc/sys/vm/overcommit_memory) powinny zwiększyć wartość w tym pliku, biorąc pod uwagę pełny rozmiar pamięci wirtualnej, jaką użyją programy służące do odzyskania kontroli (np. login(1), ssh(1) i top(1)). W innym przypadku, superużytkownik może nie być w stanie zalogować się, w celu odzyskania systemu. Przykładowo, na architekturze x86-64 odpowiednią wartością jest 131072 (zarezerwowane 128MiB).

    Zmiana wartości w tym pliku zaczyna być stosowana, gdy tylko aplikacja zażąda pamięci.

/proc/sys/vm/compact_memory (od Linuksa 2.6.35)
    Po zapisie 1 do tego pliku wszystkie strefy są przemieszczane w ten sposób, że — jeśli to możliwe — pamięć jest dostępna w ciągłych blokach. Efekt tej akcji można sprawdzić za pomocą /proc/buddyinfo.

    Obecne tylko, jeśli jądro zostało skonfigurowane z CONFIG_COMPACTION.

/proc/sys/vm/drop_caches (od Linuksa 2.6.16)
    Zapis do tego pliku powoduje zwolnienie przez jądro czystych buforów, dentries i i-węzłów z pamięci, powodując zwolnienie pamięci. Może być to przydatne to testowania zarządzania pamięcią i wykonywania powtarzalnych testów systemu plików. Zapis do tego pliku powoduje utratę zalet buforowania, przez co może spowodować pogorszenie ogólnej wydajności systemu.

    Aby zwolnić bufor strony, proszę użyć:

        echo 1 > /proc/sys/vm/drop_caches

    Aby zwolnić dentries i i-węzły, proszę użyć:

        echo 2 > /proc/sys/vm/drop_caches

    Aby zwolnić bufor strony, dentries i i-węzły, proszę użyć:

        echo 3 > /proc/sys/vm/drop_caches

    Ponieważ zapis do tego pliku nie jest destrukcyjny i brudne obiekty nie są zwalniane, użytkownik powinien wcześniej uruchomić sync(1).

/proc/sys/vm/sysctl_hugetlb_shm_group (od Linuksa 2.6.7)
    Ten zapisywalny plik zawiera identyfikator grupy, która może alokować pamięć, za pomocą dużych (huge) stron. Jeśli proces ma identyfikator grupy systemu plików lub jakiś z uzupełniających identyfikatorów grup który jest zgodny z tym ID grupy, to może alokować duże 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)
    Wartość niezerowa oznacza wyłączenie nowego, 32-bitowego rozmieszczenia mapowania pamięci; jądro będzie używać starego (2.4) rozmieszczenia dla wszystkich procesów.

/proc/sys/vm/memory_failure_early_kill (od Linuksa 2.6.32)
    Kontroluje jak zabijać procesy z nienaprawialnym błędem pamięci (z reguły 2-bitowy błąd w module pamięci), które nie mogą być obsłużone przez jądro, wykryte w tle przez sprzęt. W niektórych przypadkach (np. jeśli strona ma wciąż poprawną kopię na dysku), jądro obsłuży taki błąd w sposób przezroczysty, bez wpływu na pracę aplikacji. Jednak jeśli nie istnieje inna, zaktualizowana kopia danych, jądro zabija procesy, aby zapobiec uszkodzeniu danych wynikłego z propagacji błędu.

    Plik posiada jedną z następujących wartości:

    1   Wszystkie procesy, które posiadają zmapowaną uszkodzoną i nieprzeładowaną stronę, są zabijane zaraz po wykryciu uszkodzenia. Proszę zauważyć, że nie jest to obsługiwane dla nielicznych typów stron, takich jak wewnętrzne przypisanie danych przez jądro lub pamięć podręczna na dysku (swap), ale działa w przypadku większości stron użytkownika.

    0   Usuwana (unmap) jest uszkodzona strona i zabijane procesy tylko, gdy chcą uzyskać dostęp do strony.

    Zabicie jest wykonywane za pomocą sygnału SIGBUS z si_code ustawionym na BUS_MCEERR_AO. Procesy mogą obsłużyć tę sytuację, jeśli chcą; proszę zapoznać się z sigaction(2), aby dowiedzieć się więcej.

    Funkcja jest aktywna wyłącznie na architekturach/platformach z zaawansowaną, maszynową obsługą sprawdzania i zależy od możliwości sprzętowych.

    Aplikacje mogą indywidualnie przesłonić ustawienie memory_failure_early_kill za pomocą operacji PR_MCE_KILL prctl(2).

    Obecne tylko, jeśli jądro zostało skonfigurowane z CONFIG_MEMORY_FAILURE.

/proc/sys/vm/memory_failure_recovery (od Linuksa 2.6.32)
    Włącza odzyskiwanie po błędzie pamięci (jeśli jest obsługiwane przez daną platformę).

    1   Próbuje odzyskiwać.

    0   Zawsze panikuje przy błędzie pamięci.

    Obecne tylko, jeśli jądro zostało skonfigurowane z CONFIG_MEMORY_FAILURE.

/proc/sys/vm/oom_dump_tasks (od Linuksa 2.6.25)
    Włącza tworzenie ogólnosystemowego zrzutu zadania (bez wątków jądra), gdy jądro wykonuje OOM-killing. Zrzut zawiera następujące informacje o każdym zadaniu (wątku, procesie): identyfikator wątku, realny identyfikator użytkownika, identyfikator grupy wątku (identyfikator procesu), rozmiar pamięci wirtualnej, rozmiar zestawu rezydentnego, procesor któremu przydzielono zadanie, wynik oom_adj (patrz opis /proc/pid/oom_adj) i nazwę polecenia. Jest to przydatne do określenia dlaczego OOM-killer został przywołany i zidentyfikowania zadania, które to spowodowało.

    Jeśli zawiera wartość zero, ta informacja nie jest zrzucana. Zrobienie zrzutu stanu pamięci każdego zadania może nie być wykonalne w bardzo dużych systemach, z tysiącami zadań. Takie systemy nie powinny być zmuszane do narażania się na dodatkowy spadek wydajności w sytuacjach braku pamięci, gdy taka informacja nie może być przydatna.

    Jeśli wartość jest niezerowa, ta informacja jest pokazywana kiedy tylko OOM-killer rzeczywiście zabija zadanie zajmujące dużo pamięci.

    Domyślną wartością jest 0.

/proc/sys/vm/oom_kill_allocating_task (od Linuksa 2.6.24)
    Włącza lub wyłącza zabijanie zadania kolejkującego OOM w sytuacjach braku pamięci (Out-Of-Memory).

    Jeśli jest ustawione na zero OOM-killer przeskanuje całą listę zadań i do zabicia wybierze zadania na podstawie heurystyki. Z reguły wybierane są zadania zajmujące wiele pamięci, które zwalniają dużą ilość pamięci po zabiciu.

    Jeśli jest ustawione na wartość niezerową, OOM-killer po prostu zabija zadanie, które wyzwoliło stan braku pamięci. W ten sposób unika się potencjalnie kosztownego skanowania listy zadań.

    Jeśli /proc/sys/vm/panic_on_oom jest niezerowe, to ma ono pierwszeństwo, niezależnie od wartości użytej w /proc/sys/vm/oom_kill_allocating_task.

    Domyślną wartością jest 0.

/proc/sys/vm/overcommit_kbytes (od Linuksa 3.14)
    Ten zapisywalny plik zapewnia alternatywę do /proc/sys/vm/overcommit_ratio do kontrolowania CommitLimit gdy /proc/sys/vm/overcommit_memory ma wartość 2. Pozwala na wykonanie overcommittu ilości pamięci w jednostkach absolutnych (w kB), zamiast w wartościach procentowych, jak to ma miejsce przy overcommit_ratio. W ten sposób można osiągnąć lepszą kontrolę CommitLimit na systemach z ekstremalnie dużą ilością pamięci.

    Tylko jeden z overcommit_kbytes lub overcommit_ratio może działać: jeśli overcommit_kbytes ma wartość niezerową, to jest używane do obliczenia CommitLimit, w przeciwnym razie używane jest overcommit_ratio. Zapisanie wartości do któregokolwiek z plików powoduje, że wartość w drugim jest ustawiana na zero.

/proc/sys/vm/overcommit_memory
    Plik zawiera tryb rozliczeń pamięci wirtualnej jądra. Dopuszczalne wartości:

        0: heurystyczny overcommit (domyślnie)
        1: zawsze robi overcommit, nigdy nie sprawdza
        2: zawsze sprawdza, nigdy nie robi overcommitu

    W trybie 0 nie są sprawdzane wywołania mmap(2) z MAP_NORESERVE, a domyślne sprawdzenia są bardzo słabe, prowadząc do ryzyka zabicia procesu przez „OOM-killera”.

    W trybie 1 jądro udaje, że jest zawsze wystarczająca ilość pamięci, dopóki pamięć faktycznie się nie wyczerpie. Jednym z zastosowań tego trybu są naukowe aplikacje obliczeniowe, które korzystają z dużych, rozsianych macierzy. Przed Linuksem 2.6.0, każda niezerowa wartość implikowała 1.

    W trybie 2 (dostępnym od Linuksa 2.6), całkowity adres przestrzeni wirtualnej w systemie, którą można przypisać (CommitLimit w /proc/meminfo) jest obliczany jako

        CommitLimit = (total_RAM - total_huge_TLB) *
        	      overcommit_ratio / 100 + total_swap

    gdzie:

    •   total_RAM jest sumą pamięci RAM w systemie;

    •   total_huge_TLB jest sumą pamięci przeznaczoną dla dużych stron;

    •   overcommit_ratio jest wartością w /proc/sys/vm/overcommit_ratio i

    •   total_swap jest wielkością przestrzeni wymiany.

    Na przykład w systemie z 16 GB fizycznej pamięci RAM i 16 GB pamięci wymiany, brakiem przestrzeni przeznaczonej na duże strony i z overcommit_ratio równym 50, ta formuła daje CommitLimit na poziomie 24 GB.

    Od Linuksa 3.14, gdy wartość w /proc/sys/vm/overcommit_kbytes jest niezerowa, to CommitLimit jest obliczana w następujący sposób:

        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 definiujący wartość procentową pamięci, na której można wykonać overcommit. Domyślną wartością jest 50. Zob. opis /proc/sys/vm/overcommit_memory.

/proc/sys/vm/panic_on_oom (od Linuksa 2.6.18)
    Włącza lub wyłącza panikę jądra w sytuacjach braku pamięci.

    Jeśli plik ma ustawioną wartość 0, OOM-killer jądra zabija któryś z nieposłusznych procesów. Z reguły OOM-killer jest w stanie to wykonać i system może pracować dalej.

    Jeśli plik ma ustawioną wartość 1, to jądro zwykle panikuje przy sytuacji braku pamięci. Jednak jeśli proces limituje przydzielanie do konkretnych węzłów używając zasad pamięci (mbind(2) MPOL_BIND) lub cpuset (cpuset(7)) i te węzły dotknie problem braku pamięci, to taki proces może być zabity przez OOM-killer. Nie występuje wówczas panika, ponieważ pamięć innych węzłów może być wolna, co oznacza że system jako całość mógł nie osiągnąć jeszcze sytuacji braku pamięci.

    Jeśli ustawiono wartość 2, to jądro zawsze panikuje w sytuacji braku pamięci.

    Domyślną wartość jest 0. 1 i 2 są przeznaczone do poprawnej pracy klastrów mimo wystąpienia problemów. Proszę wybrać właściwą z nich, zgodnie z używanymi zasadami w takich sytuacjach.

/proc/sys/vm/swappiness
    Wartość w tym pliku kontroluje jak agresywnie jądro przenosi strony pamięci do pamięci wymiany (swapu). Wyższe wartości zwiększają agresywność, mniejsze zmniejszają ją. Domyślną wartością jest 60.

/proc/sys/vm/user_reserve_kbytes (od Linuksa 3.10)
    Określa pamięć (w KiB) jaka ma być zarezerowana dla procesów użytkownika. Ma to pomóc zapobiegać sytuacji, gdy użytkownik uruchomi pojedynczy zaborczy proces zajmujący pamięć i nie będzie w stanie wyjść z tej sytuacji (zabić zaborcy). Wartość w tym pliku działa tylko wówczas, gdy /proc/sys/vm/overcommit_memory ustawiono na 2 (nigdy nie robi overcommitu). W takim przypadku, system rezerwuje wielkość pamięci, która jest mniejszą wartością z [3% rozmiaru bieżącego procesu, user_reserve_kbytes].

    Domyślną wartością w tym pliku jest mniejsza wartość z [3% wolnych stron, 128MiB], wyrażoną w KiB.

    Jeśli wartość w tym pliku wynosi zero, to użytkownik będzie mógł zaalokować całą wolną pamięć za pomocą pojedynczego procesu (minus rozmiar zarezerwowany przez /proc/sys/vm/admin_reserve_kbytes). Każda kolejna próba wykonania polecenia spowoduje błąd „fork: Cannot allocate memory” (nie można zaalokować pamięci).

    Zmiana wartości w tym pliku zaczyna być stosowana, gdy tylko aplikacja zażąda pamięci.

/proc/sys/vm/unprivileged_userfaultfd (od Linuksa 5.2)
    Ten (zapisywalny) plik ujawnia znacznik kontrolujący, czy procesy nieuprzywilejowane mogą korzystać z userfaultfd(2). Jeśli plik ma wartość 1, to procesy nieuprzywilejowane mogą używać userfaultfd(2). Jeśli plik ma wartość 0, to tylko procesy z przywilejem CAP_SYS_PTRACE mogą używać userfaultfd(2). Wartością domyślną w tym pliku jest 1.

ZOBACZ TAKŻE
proc(5), proc_sys(5)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.