Mam standardowy laptop z systemem Linux (testy Debiana) z partycją wymiany.
Robię z nim wiele eksperymentów. Niektóre z nich są naprawdę wymagające pamięci, a sposób, w jaki Linux domyślnie się zachowuje, jest dla mnie problemem ... Dajmy głupi przykład:
- Usiądź przed laptopem
- Otwórz terminal
- Wpisz
python
więca = [0]*100000000
Teraz są duże szanse, że nie będziesz mieć wystarczającej ilości pamięci RAM, aby obsłużyć tę dużą listę. Linux zapełni pamięć RAM, następnie zamieni się, a kilka minut później zabójca OOM zostanie uruchomiony i zabije (prawie) losowe usługi i miejmy nadzieję, że jeśli naciśniesz Ctrl + C we właściwym czasie python
i jeśli terminal nadal był skupiony, komputer ponownie zareaguje.
Chciałbym egzekwować pewne limity pamięci, aby uniknąć niechcianej zamiany i odmówić procesowi prawa do przydzielenia większej ilości pamięci niż mam (w pamięci RAM). Jeśli zapotrzebowanie na pamięć jest poniżej określonego limitu lub jest wymagane przez roota, po prostu zabij proces najbardziej wymagający pamięci dowolnego użytkownika z wyjątkiem roota.
ulimit -Sv [mem]
Słyszę z tyłu!
Ho Ho! „Użyj cgroups
przez cgexec
!” ktoś mówi w pierwszym rzędzie!
Tak, masz rację: są to naprawdę bardzo dobre rozwiązania. Ale:
- Nie dotyczą całego systemu
- Limity są ustalane dla poszczególnych procesów
- Limity są stałe, bez względu na rzeczywistą ilość wolnej pamięci RAM (AFAIK)
- Tu i tam mówią, że to nie jest naprawdę dobre rozwiązanie do egzekwowania twardych limitów.
Chciałbym, aby jądro powiedział: „Należysz do użytkownika foo (nie root), używasz dużo pamięci, a zabraknie nam pamięci. Przepraszam stary ... umrzyj teraz!”
Lub: „Co do diabła robisz? Potrzebujesz x MB, a jest tylko y MB MB. Tak, SWAP jest pusty, ale nie zamierzasz używać SWAP do wykonywania swojej brudnej roboty, prawda? Nie, ja powiedział nie! Brak pamięci dla ciebie! Jeśli nalegasz, umrzesz!
overcommit_memory
plik specjalny używa pamięci RAM + SWAP jako użytecznej pamięci. Nadal zamierzam zamienić :)
ulimits
to zły pomysł, jak pokazano prawie wszędzie, ponieważ jest to ograniczenie na proces ... Rozumiem, wiesz :) O cgroups
, to zdecydowanie lepsze, ale brakuje czegoś bardziej ogólnego: mówię o moim laptopie, ale także posiadać serwer „obliczeniowy”, którym dzielimy się trzema. Jeśli egzekwuję takie limity na użytkownika, będę ograniczany przez najgorszy scenariusz, prawda?
/proc/sys/vm/overcommit_memory
wpływa na zachowanie jądra przy małej ilości pamięci.