Administrowanie serwerami uniksowymi może być wyzwaniem, zwłaszcza gdy systemy, którymi zarządzasz, są intensywnie używane, a problemy z wydajnością zmniejszają ich dostępność. Na szczęście można nałożyć limity na pewne zasoby, aby zapewnić, że najważniejsze procesy na serwerach będą mogły działać, a konkurencyjne procesy nie będą zużywać więcej zasobów, niż jest to korzystne dla całego systemu. Polecenie ulimit może utrzymać katastrofę na dystans, ale musisz przewidzieć, gdzie limity będą miały sens, a gdzie spowodują problemy.
Nie zdarza się to często, ale jeden użytkownik, który uruchamia zbyt wiele procesów, może sprawić, że system stanie się bezużyteczny dla wszystkich innych. Bomba fork — atak typu denial of service, w którym proces nieustannie replikuje się aż do wyczerpania dostępnych zasobów — jest najgorszym tego przykładem. Jednak nawet przyjaźni użytkownicy mogą wykorzystywać więcej zasobów niż jest to korzystne dla systemu – często nie mając takiego zamiaru. W tym samym czasie, legalne procesy mogą czasami zawieść, gdy są uruchamiane wbrew limitom, które zostały zaprojektowane dla przeciętnych użytkowników. W takim przypadku należy się upewnić, że te procesy otrzymają zwiększone przydziały zasobów systemowych, które pozwolą im działać prawidłowo bez udostępniania tych samych zasobów dla wszystkich.
Aby zobaczyć limity związane z twoim loginem, użyj polecenia ulimit -a. Jeśli używasz zwykłego konta użytkownika, prawdopodobnie zobaczysz coś takiego:
$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 32767max locked memory (kbytes, -l) 32max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 50virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
Jedną z rzeczy, którą możesz zauważyć od razu, jest to, że nie możesz tworzyć zrzutów rdzeni — ponieważ twój maksymalny rozmiar pliku rdzenia wynosi 0. Tak, to oznacza nic, żadnych danych, żadnych zrzutów rdzeni. Jeśli proces, który uruchamiasz zakończy się, żaden plik core nie zostanie zrzucony do Twojego katalogu domowego. Dopóki rozmiar pliku rdzenia jest ustawiony na zero, zrzucanie plików rdzenia nie jest dozwolone. Ma to sens dla większości użytkowników, ponieważ prawdopodobnie nie zrobią nic więcej z zrzutem rdzenia poza jego skasowaniem, ale jeśli potrzebujesz zrzutu rdzenia do debugowania problemów, które napotykasz w aplikacji, możesz chcieć ustawić rozmiar pliku rdzenia na nieograniczony — i być może możesz.
$ ulimit -c ulimited$ ulimit -cunlimited
Jeśli zarządzasz serwerem i chcesz włączyć możliwość generowania zrzutów rdzeni dla wszystkich swoich użytkowników — być może są oni programistami i naprawdę potrzebują możliwości analizowania tych zrzutów, musisz zmienić użytkownika na root i edytować swój /etc/security/limits.conf (Linux) lub dokonać zmian w pliku /etc/system (Solaris).
Jeśli, z drugiej strony, zarządzasz serwerem i nie chcesz, aby którykolwiek z Twoich użytkowników był w stanie wygenerować zrzuty rdzeni, niezależnie od tego, jak bardzo chcieliby zatopić zęby w jednym z nich, możesz ustawić limit 0 w swoim limits.conf.
Innym limitem, który jest często egzekwowany, jest ten, który ogranicza liczbę procesów, które dana osoba może uruchomić. Opcją ulimit używaną do tego jest -u. Możesz spojrzeć na swój limit tak jak zrobiliśmy to powyżej za pomocą polecenia ulimit -a lub pokazać tylko limit „nproc” za pomocą polecenia ulimit -u.
$ ulimit -u50
Ponownie, twoi użytkownicy mogą zmienić swoje limity za pomocą innego polecenia ulimit — ulimit -u 100 — chyba że, oczywiście, nie mogą. Jeśli ograniczyłeś ich do 50 procesów w pliku limits.conf lub systemowym, dostaną błąd taki jak ten, gdy spróbują zwiększyć swoje limity:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Limity mogą być również ustawione przez grupę tak, że możesz, powiedzmy, dać programistom możliwość uruchomienia więcej procesów niż menedżerom. Linie takie jak te w twoim pliku limits.conf zrobią to:
@managers hard nproc 50@developers hard nproc 200
Jeśli chcesz ograniczyć liczbę otwartych plików, po prostu użyj innego ustawienia.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Tutaj daliśmy dwóm grupom i jednej osobie fizycznej zwiększenie ich limitów otwartych plików. Wszystkie one ustawiają twarde limity. Jeśli ustawisz również limity miękkie, użytkownicy otrzymają ostrzeżenia, gdy osiągną niższy limit.
@developers soft nofile 2048@developers hard nofile 8192
Aby zobaczyć listę opcji ulimit, spójrz na stronę man (man ulimit). Zauważysz, że ulimit jest wbudowany w bash – przynajmniej w Linuksie – i że dostępne są następujące opcje:
-a All current limits are reported-c The maximum size of core files created-d The maximum size of a process's data segment-e The maximum scheduling priority ("nice")-f The maximum size of files written by the shell and its children-i The maximum number of pending signals-l The maximum size that may be locked into memory-m The maximum resident set size (has no effect on Linux)-n The maximum number of open file descriptors (most systems do not allow this value to be set)-p The pipe size in 512-byte blocks (this may not be set)-q The maximum number of bytes in POSIX message queues-r The maximum real-time scheduling priority-s The maximum stack size-t The maximum amount of cpu time in seconds-u The maximum number of processes available to a single user-v The maximum amount of virtual memory available to the shell
Jeśli zezwolisz na to w pliku limits.conf, możesz zobaczyć limity takie jak te, ustawione dla konkretnych aplikacji, które naprawdę potrzebują dodatkowej przepustowości. W tym przykładzie, użytkownik oracle otrzymuje możliwość uruchomienia do 16,384 procesów i otwarcia 65,536 plików. Te linie byłyby ustawione w pliku .bash_profile użytkownika oracle.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi