Mam więc 4 GB pamięci RAM + 4 GB wymiany. Chcę utworzyć użytkownika z ograniczoną pamięcią RAM i zamianą: 3 GB RAM i 1 GB zamiany. Czy coś takiego jest możliwe? Czy możliwe jest uruchamianie aplikacji z ograniczoną pamięcią RAM i zamiana dostępnych do nich bez tworzenia osobnego użytkownika (i bez instalowania żadnych specjalnych aplikacji - mając tylko domyślną konfigurację serwera Debian / CentOS i nie używając sudo)?
Aktualizacja:
Więc otworzyłem terminall i wpisałem w nim polecenie ulimit : ulimit -v 1000000
które będzie jak 976,6Mb
ograniczenie. Następnie zadzwoniłem ulimit -a
i zobaczyłem, że ograniczenie jest włączone. Potem uruchomiłem skrypt bash, który się kompiluje i uruchamia moją aplikację nohup
, długi nohup ./cloud-updater-linux.sh >& /dev/null &
... ale po pewnym czasie zobaczyłem:
(co byłoby w porządku, gdyby nie zastosowano żadnych ograniczeń - pobrał dużą bibliotekę i zaczął ją kompilować).
Ale myślałem, że zastosowałem ograniczenia do powłoki i wszystkie procesy uruchomione z / z nią za pomocą ulimit -v 1000000
? Co się pomyliłem? Jak zrobić terminal, a wszystkie uruchamiane przez niego podprocesy będą ograniczone do użycia pamięci RAM?
źródło
Odpowiedzi:
ulimit
jest do tego stworzony. Możesz ustawić wartości domyślne dlaulimit
poszczególnych użytkowników lub grupulimit -v KBYTES
ustawia maksymalny rozmiar pamięci wirtualnej. Nie sądzę, że możesz dać maksymalną ilość zamiany. To tylko ograniczenie ilości pamięci wirtualnej, z której użytkownik może korzystać.Więc miałbyś
limits.conf
linię (do maksimum4G
pamięci)AKTUALIZACJA - CGroups
Limity nałożone przez
ulimit
ilimits.conf
dotyczą poszczególnych procesów. Zdecydowanie nie byłem w tej kwestii jasny.Jeśli chcesz ograniczyć całkowitą ilość pamięci używanej przez użytkowników (właśnie o to prosiłeś). Chcesz użyć cgroups .
W
/etc/cgconfig.conf
:Tworzy to
cgroup
limit maksymalny pamięci 4GiB.W
/etc/cgrules.conf
:Spowoduje to, że wszystkie uruchomione procesy
luser
zostaną uruchomione wewnątrzmemlimit
utworzonych grup cgroupscgconfig.conf
.źródło
useradd
?Nie można ograniczyć użycia pamięci na poziomie użytkownika, ulimit może to zrobić, ale dla pojedynczego procesu.
Nawet przy użyciu limitów
/etc/security/limits.conf
na użytkownika użytkownik może wykorzystać całą pamięć, uruchamiając wiele procesów.Jeśli naprawdę chcesz ograniczyć zasoby, musisz użyć narzędzia do zarządzania zasobami, takiego jak rcapd używane przez projekty i strefy w systemie Solaris.
Jest coś, co wydaje się zapewniać podobne funkcje w Linuksie, które możesz zbadać: cgroups .
źródło
cgroups
są właściwym sposobem, aby to zrobić, jak wskazały inne odpowiedzi. Niestety nie ma idealnego rozwiązania tego problemu, ponieważ przejdziemy poniżej. Istnieje wiele różnych sposobów ustawiania limitów użycia pamięci grupy cgroup. To, jak ktoś robi, aby sesja logowania użytkownika była automatycznie częścią grupy, różni się w zależności od systemu. Red Hat ma pewne narzędzia, podobnie jak systemd .memory.memsw.limit_in_bytes
imemory.limit_in_bytes
ustawić limity, w tym odpowiednio swap i bez. Minusemmemory.limit_in_bytes
jest to, że zlicza pliki buforowane przez jądro w imieniu procesów w grupie w porównaniu z przydziałem grupy. Mniejsze buforowanie oznacza większy dostęp do dysku, więc potencjalnie tracisz trochę wydajności, jeśli system miałby dostępną pamięć.Z drugiej strony
memory.soft_limit_in_bytes
pozwala cgroup przekroczyć limit, ale jeśli wywoływany jest zabójca jądra OOM, logicznie zabijane są te grupy, które przekroczyły swoje limity. Wadą tego jest jednak to, że niektóre sytuacje wymagają natychmiastowej pamięci i zabójca OOM nie ma czasu rozejrzeć się za procesami do zabicia, w takim przypadku coś może się nie powieść, zanim procesy użytkownika z nadmierną kwotą zostaną zabity.ulimit
jest jednak absolutnie niewłaściwym narzędziem do tego. ulimit ogranicza wykorzystanie pamięci wirtualnej, co prawie na pewno nie jest tym, czego chcesz. Wiele rzeczywistych aplikacji wykorzystuje znacznie więcej pamięci wirtualnej niż pamięci fizycznej. Większość środowisk uruchomieniowych zbieranych przez śmieci (Java, Go) działa w ten sposób, aby uniknąć fragmentacji. Trywialny program „witaj świecie” w C, jeśli skompilowany z dezynfekatorem adresu, może wykorzystywać 20 TB pamięci wirtualnej. Alokatory, na których nie można polegaćsbrk
, takie jak jemalloc (który jest domyślnym alokatorem dla Rust) lub tcmalloc, wykorzystanie pamięci wirtualnej znacznie przewyższy zużycie fizyczne. W celu zwiększenia wydajności wiele narzędzi mapuje pliki, co zwiększa wykorzystanie wirtualne, ale niekoniecznie fizyczne. Wszystkie procesy Chrome używają 2 TB pamięci wirtualnej. Jestem na laptopie z 8 GB pamięci fizycznej. Jakikolwiek sposób, w jaki ktoś próbowałby tutaj ustawić przydziały pamięci wirtualnej, albo złamałby Chrome, zmusiłby Chrome do wyłączenia niektórych funkcji bezpieczeństwa, które polegają na przydzielaniu (ale nieużywaniu) dużej ilości pamięci wirtualnej, albo byłby całkowicie nieskuteczny w zapobieganiu nadużyciom systemu przez użytkownika .źródło