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!
/proc/sys/vm/overcommit_memory
wpływa na zachowanie jądra przy małej ilości pamięci.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 :) Ocgroups
, 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?Odpowiedzi:
Ktoś zasugerował ci w twoim głosie
cgroups
. Staraj się szukać tego kierunku, ponieważ może on zapewnić:Coś takiego może przybliżyć cię do twoich celów :
Mówi to, że zadania w tej grupie mogą używać maksymalnie 50 MB pamięci i 50 MB pamięci + zamiana, więc gdy pamięć jest pełna, nie zamienia się, ale jeśli pamięć nie jest pełna i niektóre dane mogą zostać zmapowane w zamiana, to może być dozwolone.
Oto fragment dokumentacji pamięci grupy cgroup :
źródło
overcommit_memory
zmienna jądra. Dziękuję wam wszystkim.Często napotykam ten sam problem. Mój ogólny przepływ pracy obejmuje ciężkie obliczenia w MATLAB. Czasami nieumyślnie spróbuję przydzielić nową zmienną, która przekracza ilość dostępnej pamięci. System zawiesza się i zazwyczaj muszę ponownie uruchomić komputer, aby wrócić do pracy. : P
W moim przypadku i brzmi to tak samo jak w twoim, nie byłem tak bardzo zainteresowany ograniczeniem ilości pamięci, jaką MATLAB używa do statycznej ilości - byłem zainteresowany brakiem zamrożonej maszyny i byłem gotów poświęcić mój proces MATLAB w celu zachowania reaktywności systemu.
Zainspirowany odpowiedzią na ten post napisałem następujący skrypt (nazwałem go watch_memory.sh):
Ten skrypt sprawdza co sekundę procentową ilość wolnej pamięci. Kiedy system się wyczerpie, twój kozioł ofiarny (przekazany jako argument do skryptu) zostaje zabity.
Bez zmiany priorytetu (bezwzględności) skryptu zabicie kozła ofiarnego zajęło około 10-20 sekund, ale nadal działało. Uruchomienie skryptu z priorytetem ujemnym spowodowało natychmiastowe zabicie po naruszeniu (11916 w tym przykładzie to pid, który chcę zabić, jeśli zabraknie mi pamięci):
źródło