Amministrare i server Unix può essere una sfida, specialmente quando i sistemi che si gestiscono sono molto usati e i problemi di prestazioni riducono la disponibilità. Fortunatamente, è possibile porre dei limiti a certe risorse per aiutare a garantire che i processi più importanti sui vostri server possano continuare a funzionare e che i processi concorrenti non consumino molte più risorse di quanto sia buono per l’intero sistema. Il comando ulimit può tenere a bada il disastro, ma è necessario anticipare dove i limiti avranno senso e dove causeranno problemi.
Può non succedere spesso, ma un singolo utente che avvia troppi processi può rendere un sistema inutilizzabile per tutti gli altri. Una bomba a forcella — un attacco di negazione del servizio in cui un processo replica continuamente se stesso fino a quando le risorse disponibili sono esaurite — è il caso peggiore di questo. Tuttavia, anche utenti amichevoli possono usare più risorse di quanto sia buono per un sistema — spesso senza volerlo. Allo stesso tempo, i processi legittimi possono a volte fallire quando vengono eseguiti contro i limiti che sono progettati per gli utenti medi. In questo caso, dovete assicurarvi che questi processi ricevano allocazioni di risorse di sistema potenziate che permettano loro di funzionare correttamente senza rendere le stesse risorse disponibili per tutti.
Per vedere i limiti associati al vostro login, usate il comando ulimit -a. Se stai usando un normale account utente, probabilmente vedrai qualcosa di simile a questo:
$ 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
Una cosa che potresti notare subito è che non puoi creare core dump — perché la dimensione massima del tuo file core è 0. Sì, questo significa niente, nessun dato, nessun core dump. Se un processo che stai eseguendo si interrompe, nessun file di core verrà lasciato nella tua home directory. Finché la dimensione del file di core è impostata a zero, i core dump non sono consentiti. Questo ha senso per la maggior parte degli utenti, dato che probabilmente non farebbero altro con un core dump se non cancellarlo, ma se hai bisogno di un core dump per il debug dei problemi che stai incontrando con un’applicazione, potresti voler impostare la dimensione del tuo core file su un valore illimitato — e forse puoi.
$ ulimit -c ulimited$ ulimit -cunlimited
Se state gestendo un server e volete attivare la possibilità di generare core dump per tutti i vostri utenti — forse sono sviluppatori che hanno davvero bisogno di poter analizzare questi core dump, dovete cambiare utente in root e modificare il vostro /etc/security/limits.conf (Linux) o apportare modifiche al file /etc/system (Solaris).
Se, d’altra parte, state gestendo un server e non volete che nessuno dei vostri utenti sia in grado di generare core dump indipendentemente da quanto vorrebbero affondare i loro denti in uno, è possibile impostare un limite di 0 nel vostro limits.conf.
Un altro limite che viene spesso applicato è quello che limita il numero di processi che un individuo può eseguire. L’opzione ulimit usata per questo è -u. Puoi guardare il tuo limite come abbiamo fatto sopra con il comando ulimit -a o mostrare solo il limite “nproc” con il comando ulimit -u.
$ ulimit -u50
Ancora una volta, i tuoi utenti possono cambiare i loro limiti con un altro comando ulimit — ulimit -u 100 — a meno che, ovviamente, non possano. Se li avete limitati a 50 processi nel file limits.conf o nel file di sistema, otterranno un errore come questo quando cercheranno di aumentare i loro limiti:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
I limiti possono anche essere impostati per gruppo in modo da poter, ad esempio, dare agli sviluppatori la possibilità di eseguire più processi dei manager. Linee come queste nel tuo file limits.conf lo farebbero:
@managers hard nproc 50@developers hard nproc 200
Se vuoi limitare il numero di file aperti, devi solo usare un’impostazione diversa.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Qui abbiamo dato a due gruppi e a un individuo un aumento dei loro limiti di file aperti. Tutti questi impostano limiti rigidi. Se imposti anche dei limiti morbidi, gli utenti riceveranno degli avvisi quando raggiungeranno il limite inferiore.
@developers soft nofile 2048@developers hard nofile 8192
Per vedere una lista delle opzioni di ulimit, guarda la pagina man (man ulimit). Noterete che ulimit è un built-in di bash — almeno su Linux — e che le seguenti opzioni sono disponibili:
-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
Se il file limits.conf lo permette, potreste vedere limiti come questi impostati per particolari applicazioni che hanno davvero bisogno di capacità extra. In questo esempio, all’utente oracle viene data la possibilità di eseguire fino a 16.384 processi e aprire 65.536 file. Queste linee verrebbero impostate nel .bash_profile dell’utente oracle.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi