Rozwiązania ograniczające pamięć dla chciwych aplikacji, które mogą spowodować awarię systemu operacyjnego?

32

Używam mojego komputera do programowania naukowego. Ma dużo 8GBpamięci RAM i 12GBprzestrzeni wymiany. Często, gdy moje problemy stają się większe, przekraczam całą dostępną pamięć RAM. Wydaje się, że Ubuntu zamiast zawieszać się (co byłoby preferowane), ładuje wszystko do wymiany, w tym Unity i wszelkie otwarte terminale. Jeśli nie uda mi się złapać uciekającego programu na czas, nie mogę nic zrobić, tylko czekać - przejście do wiersza polecenia, np. Zajmuje 4-5 minut. Ctrl-Alt-F2gdzie mogę zabić przestępcę.

Skoro moja własna głupota nie wchodzi w zakres tego forum, jak mogę zapobiec awarii Ubuntu przez thrashowanie, gdy wykorzystuję całą dostępną pamięć z jednego szkodliwego programu?

Eksperyment w domu *!

Otwórz terminal, uruchom, pythona jeśli masz numpyzainstalowany, spróbuj tego:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Ostrzeżenie: może mieć negatywne skutki, monitorować proces poprzez iotoplub topzabić go na czas. Jeśli nie, do zobaczenia po ponownym uruchomieniu.

Haczykowaty
źródło

Odpowiedzi:

21

Wbudowana powłoka ulimitpozwala ograniczyć zasoby. W twoim przypadku, aby ograniczyć użycie pamięci w powłoce (i jej dzieciach), użyj ulimit -v.

Demonstracja ustawiania limitu pamięci 100 MB (100000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Zaobserwowano, ps uww -C script-name-hereże użycie tego pytona wymaga co najmniej 29 MB pamięci (kolumna VSZ). Limit RSS rośnie, gdy skrypt Pythona potrzebuje więcej pamięci, więc dostosuj tę kolumnę.

Lekensteyn
źródło
1
Szkoda, że ​​nie wiemy, jak wygląda rzeczywista aplikacja. Pokazany ulimit wpływa na wszystkie procesy będące dziećmi tej powłoki. Nie wiemy nawet, czy działa jako demon, czy ma wiele dzieci, co jeszcze bardziej skomplikowałoby sprawę. Zobacz coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki
1
Czy nie ma przyjaznego dla użytkownika interfejsu dla ulimit i cgroups ? W systemie Windows, gdy system operacyjny zbliża się do wyczerpania pamięci RAM, wyskakujące okienko ostrzegawcze zawsze pozwalało mi uniknąć zawieszania się systemu. Czy w Ubuntu cały czas muszę kontrolować zużycie pamięci?
Dan Dascalescu
1
@DanDascalescu Jeśli masz skonfigurowany plik wymiany, będziesz odczuwał dłuższe opóźnienia, ale nadal będziesz mógł pracować. Gdy zauważysz, że rozpoczyna się zamiana, możesz sprawdzić, czy monitor systemu nie korzysta z pamięci RAM. Jeśli w twoim systemie naprawdę zabraknie pamięci, wywoływany jest zabójca braku pamięci (OOM), który zabija proces z najwyższym wynikiem „zła” (zwykle proces, który zużywa najwięcej pamięci).
Lekensteyn
12

Grupy C powinny umożliwiać ograniczenie użycia pamięci na podstawie poszczególnych procesów.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Informatyka naukowa notorycznie wymaga dużej ilości pamięci. Piaskownica aplikacji w grupie nie powoduje, że reszta procesów nie powinna stać się ofiarą, ponieważ zmniejszy się presja pamięci.

Alternatywnie maszynę wirtualną można zastosować jako rodzaj twardego limitu, ponieważ aplikacja może korzystać z pamięci delegowanej do maszyny wirtualnej, oczywiście kosztem wydajności. Jednak VM jest znacznie łatwiej skonfigurować dla niewtajemniczonych w porównaniu z konfigurowaniem i utrzymywaniem grupy cg.

Decyzje decyzje :) Powodzenia!

ppetraki
źródło
1
Czy nie ma przyjaznego dla użytkownika interfejsu dla ulimit i cgroups? W systemie Windows, gdy system operacyjny zbliża się do wyczerpania pamięci RAM, wyskakujące okienko ostrzegawcze zawsze pozwalało mi uniknąć zawieszania się systemu. Czy w Ubuntu cały czas muszę kontrolować zużycie pamięci?
Dan Dascalescu
Nie. Twój system operacyjny też nie powinien się zawieszać, to osobny problem. Wyskakujące okna to po prostu bandaid. Jeśli używasz ton pamięci, może powinieneś dowiedzieć się, dlaczego? Na przykład nowoczesne przeglądarki ze swoim sanboxingiem mogą z łatwością zużywać 70-150 mln na tabletkę. Wyłączenie lub dostrojenie może zwolnić znaczną pamięć regularnie wykorzystywaną przez użytkownika końcowego. Programy planujące powinny wymieniać rzadko używane programy, aby zaoszczędzić miejsce, ale jeśli budzą się one więcej niż powinny, należy je naprawić lub jeśli twoim głównym zadaniem jest intensywne korzystanie z pamięci (sieci), potrzeba więcej pamięci RAM.
ppetraki
8
Wiem, co zużywa pamięć - Chrome. Ale system operacyjny powinien chronić swoją stabilność przed aplikacjami działającymi mimo to w amoku.
Dan Dascalescu
1
Rozumiem, skąd pochodzisz jako użytkownik. To, o co prosisz, oznacza jednak przekształcenie ogólnej platformy komputerowej w urządzenie. Jako najmniej złożona (podatna na błędy) metoda, którą musi wdrożyć inżynier systemu operacyjnego, aby zapewnić te zabezpieczenia, podejmuje radykalnie uzasadnione decyzje dotyczące sposobu działania całego komputera. Zwykle dzieje się to kosztem elastyczności użytkownika końcowego. Przykłady tego można zobaczyć w komputerach typu tablet. Jednak w komputerach stacjonarnych elastyczność jest zachowana.
ppetraki