Istnieje wiele pytań i odpowiedzi na temat ograniczania zasobów pojedynczego procesu, np. RLIMIT_AS może być wykorzystany do ograniczenia maksymalnej pamięci przydzielonej przez proces, który może być postrzegany jako VIRT top
. Więcej na ten temat, np. Tutaj Czy istnieje sposób na ograniczenie ilości pamięci, którą dany proces może wykorzystać w Uniksie?
setrlimit(2)
dokumentacja mówi:
Proces potomny utworzony za pomocą fork (2) dziedziczy limity zasobów rodzica. Limity zasobów są zachowane w execve (2).
Należy to rozumieć w następujący sposób:
Jeśli proces ma RLIMIT_AS wynoszący np. 2 GB, nie może przydzielić więcej pamięci niż 2 GB. Po odrodzeniu dziecka limit przestrzeni adresowej 2 GB zostanie przekazany dziecku, ale liczenie zaczyna się od 0. Dwa procesy łącznie mogą zająć do 4 GB pamięci.
Ale jaki byłby użyteczny sposób ograniczenia całkowitej sumy pamięci przydzielanej przez całe drzewo procesów?
Odpowiedzi:
Nie jestem pewien, czy to odpowiada na twoje pytanie, ale znalazłem ten skrypt perla, który twierdzi, że robi dokładnie to, czego szukasz. Skrypt implementuje własny system egzekwowania limitów poprzez budzenie i sprawdzanie zużycia zasobów przez proces i jego dzieci. Wydaje się, że jest dobrze udokumentowany i wyjaśniony, a ostatnio został zaktualizowany.
Jak powiedział slm w swoim komentarzu, do tego można również użyć cgroups. Być może będziesz musiał zainstalować narzędzia do zarządzania grupami, zakładając, że jesteś w systemie Linux, którego powinieneś szukać
libcgroups
.Upewnij się, że
$USER
jesteś użytkownikiem.Użytkownik powinien wtedy mieć dostęp do ustawień pamięci grupy dyskusyjnej w
/sys/fs/cgroup/memory/myGroup
.Następnie możesz ustawić limit na, powiedzmy 500 MB, wykonując następujące czynności:
Teraz uruchommy Vima:
Proces vim i wszystkie jego dzieci powinny być teraz ograniczone do użycia 500 MB pamięci RAM. Myślę jednak , że ten limit dotyczy tylko pamięci RAM, a nie wymiany. Gdy procesy osiągną limit, zaczną się zamieniać. Nie jestem pewien, czy dacie radę to obejść, nie mogę znaleźć sposobu ograniczenia użycia wymiany za pomocą cgroups.
źródło
sudo yum install libcgroup-tools
Stworzyłem skrypt, który to robi, używając cgmanager, który jest używany w Ubuntu. Jedną z zalet jest to, że nie wymaga to dostępu do konta root. Zauważ, że zarządzanie cgroup jest trochę specyficzne dla dystrybucji, więc nie wiem, czy to działa na dystrybucjach, które używają systemd zarządzania cgroup.
użycie: zapisz jak
limitmem
na swojej ścieżce i uczyń go wykonywalnym. Następnie uruchom nplimitmem 1G command...
. To ogranicza faktycznie używaną pamięć. Jeśli zostanie to osiągnięte, zabójca OOM zabije proces lub jedno z jego dzieci, ale nie jest to przypadek, który nie ma nic wspólnego z tym poleceniem.źródło
cgm
przewodnik, przydał się/unix//a/536046/4319 :
W każdej dystrybucji opartej na systemie możesz także używać grup pośrednio przez systemd-run. Np. W przypadku ograniczenia
pdftoppm
do 500 MB pamięci RAM użyj:...
źródło