/proc/sys/vm/ - podsystem pamięci wirtualnej
- /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.
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 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.