Správa unixových serverů může být náročná, zejména pokud jsou spravované systémy intenzivně využívány a problémy s výkonem snižují dostupnost. Naštěstí můžete nastavit limity na určité prostředky, které pomohou zajistit, aby nejdůležitější procesy na serverech mohly běžet a konkurenční procesy nespotřebovávaly mnohem více prostředků, než je pro celý systém dobré. Příkaz ulimit může zabránit katastrofě, ale je třeba předvídat, kde budou mít limity smysl a kde způsobí problémy.
Nemusí se to stávat tak často, ale jediný uživatel, který spustí příliš mnoho procesů, může způsobit, že systém nebude použitelný pro všechny ostatní. Nejhorším případem je fork bomba – útok na odepření služby, při kterém se proces neustále replikuje, dokud nejsou vyčerpány dostupné zdroje. I přátelští uživatelé však mohou využívat více prostředků, než je pro systém vhodné – často aniž by to měli v úmyslu. Zároveň mohou legitimní procesy někdy selhat, když jsou spuštěny proti limitům, které jsou určeny pro průměrné uživatele. V takovém případě je třeba zajistit, aby tyto procesy dostaly posílené přidělení systémových prostředků, které jim umožní správný běh, aniž by byly stejné prostředky k dispozici všem.
Chcete-li zobrazit limity spojené s vaším přihlášením, použijte příkaz ulimit -a. Pokud používáte běžný uživatelský účet, uvidíte pravděpodobně něco takového:
$ 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
Jednou z věcí, které si možná všimnete hned na začátku, je, že nemůžete vytvářet výpisy jádra – protože vaše maximální velikost souboru jádra je 0. Ano, to znamená nic, žádná data, žádný výpis jádra. Pokud se proces, který spouštíte, přeruší, žádný soubor jádra se do vašeho domovského adresáře nevysype. Dokud je velikost souboru jádra nastavena na nulu, výpisy jádra nejsou povoleny. Pro většinu uživatelů to dává smysl, protože by s výpisem jádra pravděpodobně nedělali nic jiného než jeho smazání, ale pokud potřebujete výpis jádra k ladění problémů, na které narážíte s nějakou aplikací, možná budete chtít nastavit velikost souboru jádra na neomezenou – a možná to půjde.
$ ulimit -c ulimited$ ulimit -cunlimited
Pokud spravujete server a chcete zapnout možnost generování výpisů jádra pro všechny uživatele — třeba jsou to vývojáři, kteří opravdu potřebují mít možnost tyto výpisy jádra analyzovat, musíte přepnout uživatele na roota a upravit soubor /etc/security/limits.conf (Linux) nebo provést změny v souboru /etc/system (Solaris).
Pokud naopak spravujete server a nechcete, aby některý z vašich uživatelů mohl generovat výpisy jádra bez ohledu na to, jak moc by se do nich chtěl pustit, můžete v souboru limits.conf nastavit limit 0.
Dalším často vynucovaným limitem je limit, který omezuje počet procesů, které může jednotlivec spustit. K tomu se používá volba ulimit s koncovkou -u. Můžete se podívat na svůj limit, jako jsme to udělali výše pomocí příkazu ulimit -a, nebo zobrazit pouze limit „nproc“ pomocí příkazu ulimit -u.
$ ulimit -u50
Znovu platí, že vaši uživatelé mohou změnit své limity pomocí dalšího příkazu ulimit — ulimit -u 100 — pokud to samozřejmě neumí. Pokud jste je v souboru limits.conf nebo v systémovém souboru omezili na 50 procesů, zobrazí se jim při pokusu o zvýšení limitu tato chyba:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Limity lze také nastavit podle skupin, takže můžete například vývojářům dát možnost spouštět více procesů než manažerům. Řádky jako tyto v souboru limits.conf by to udělaly:
@managers hard nproc 50@developers hard nproc 200
Pokud chcete omezit počet otevřených souborů, stačí použít jiné nastavení.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Tady jsme dvěma skupinám a jednomu jednotlivci zvýšili jejich limity otevřených souborů. Všichni tito nastavují tvrdé limity. Pokud nastavíte i měkké limity, dostanou uživatelé varování, když dosáhnou dolní hranice.
@developers soft nofile 2048@developers hard nofile 8192
Chcete-li zobrazit seznam možností ulimit, podívejte se na stránku man (man ulimit). Všimněte si, že ulimit je vestavěný soubor jazyka bash — alespoň v Linuxu — a že jsou k dispozici následující možnosti:
-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
Pokud vám to soubor limits.conf dovolí, můžete vidět limity, jako jsou tyto, nastavené pro konkrétní aplikace, které opravdu potřebují dodatečnou kapacitu. V tomto příkladu je uživateli oracle dána možnost spustit až 16 384 procesů a otevřít 65 536 souborů. Tyto řádky by byly nastaveny v profilu .bash_profile uživatele oracle.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi