Administrarea serverelor Unix poate fi o provocare, în special atunci când sistemele pe care le gestionați sunt foarte utilizate și problemele de performanță reduc disponibilitatea. Din fericire, puteți pune limite la anumite resurse pentru a vă ajuta să vă asigurați că cele mai importante procese de pe serverele dumneavoastră pot continua să funcționeze și că procesele concurente nu consumă mult mai multe resurse decât este bine pentru întregul sistem. Comanda ulimit poate ține dezastrul la distanță, dar trebuie să anticipați unde limitele vor avea sens și unde vor cauza probleme.
Se poate să nu se întâmple atât de des, dar un singur utilizator care pornește prea multe procese poate face un sistem inutilizabil pentru toți ceilalți. O bombă cu furculiță – un atac de negare a serviciului în care un proces se replică continuu până când resursele disponibile sunt epuizate – este cel mai rău caz în acest sens. Cu toate acestea, chiar și utilizatorii prietenoși pot utiliza mai multe resurse decât este bine pentru un sistem – adesea fără să aibă intenția de a face acest lucru. În același timp, procesele legitime pot eșua uneori atunci când sunt rulate împotriva limitelor care sunt concepute pentru utilizatorii medii. În acest caz, trebuie să vă asigurați că aceste procese primesc alocări întărite de resurse de sistem care să le permită să ruleze corect fără a face aceleași resurse disponibile pentru toată lumea.
Pentru a vedea limitele asociate cu autentificarea dumneavoastră, utilizați comanda ulimit -a. Dacă folosiți un cont de utilizator obișnuit, veți vedea probabil ceva de genul acesta:
$ 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
Un lucru pe care l-ați putea observa din prima este că nu puteți crea descărcări de nucleu – pentru că dimensiunea maximă a fișierului de nucleu este 0. Da, asta înseamnă nimic, fără date, fără descărcare de nucleu. Dacă un proces pe care îl executați se întrerupe, niciun fișier de bază nu va fi lăsat în directorul dvs. personal. Atâta timp cât dimensiunea fișierului de bază este setată la zero, nu sunt permise descărcările de bază. Acest lucru are sens pentru majoritatea utilizatorilor, deoarece, probabil, nu ar face nimic altceva cu un core dump în afară de a-l șterge, dar dacă aveți nevoie de un core dump pentru a depana problemele pe care le întâmpinați cu o aplicație, ați putea dori să setați dimensiunea fișierului core la nelimitat – și poate că puteți.
$ ulimit -c ulimited$ ulimit -cunlimited
Dacă gestionați un server și doriți să activați posibilitatea de a genera gropi de descărcare de nucleu pentru toți utilizatorii dumneavoastră — poate că sunt dezvoltatori sunt într-adevăr nevoie să poată analiza aceste gropi de descărcare de nucleu, trebuie să schimbați utilizatorul în root și să editați fișierul /etc/security/limits.conf (Linux) sau să faceți modificări în fișierul /etc/system (Solaris).
Dacă, pe de altă parte, administrați un server și nu doriți ca niciunul dintre utilizatorii dumneavoastră să poată genera core dumps, indiferent cât de mult ar dori să își înfunde dinții într-unul, puteți seta o limită de 0 în fișierul dvs. limits.conf.
O altă limită care este adesea aplicată este cea care limitează numărul de procese pe care o persoană le poate rula. Opțiunea ulimit folosită pentru aceasta este -u. Puteți să vă uitați la limita dvs. așa cum am făcut mai sus cu comanda ulimit -a sau să arătați doar limita „nproc” cu comanda ulimit -u.
$ ulimit -u50
Încă o dată, utilizatorii dvs. își pot schimba limitele cu o altă comandă ulimit — ulimit -u 100 — cu excepția cazului în care, bineînțeles, nu pot. Dacă i-ați limitat la 50 de procese în fișierul limits.conf sau în fișierul de sistem, ei vor primi o eroare de genul acesta atunci când vor încerca să-și mărească limitele:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Limitele pot fi, de asemenea, configurate în funcție de grup, astfel încât să puteți, să zicem, să le oferiți dezvoltatorilor posibilitatea de a rula mai multe procese decât managerii. Linii ca acestea din fișierul dvs. limits.conf ar face acest lucru:
@managers hard nproc 50@developers hard nproc 200
Dacă doriți să limitați numărul de fișiere deschise, trebuie doar să folosiți o altă setare.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Aici am acordat două grupuri și un individ creșteri ale limitelor lor de fișiere deschise. Toate acestea stabilesc limite stricte. Dacă setați și limite soft, utilizatorii vor primi avertismente atunci când ating limita inferioară.
@developers soft nofile 2048@developers hard nofile 8192
Pentru a vedea o listă a opțiunilor ulimit, consultați pagina de manual (man ulimit). Veți observa că ulimit este încorporat în bash – cel puțin pe Linux – și că sunt disponibile următoarele opțiuni:
-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
Dacă fișierul limits.conf permite, s-ar putea să vedeți limite ca acestea configurate pentru anumite aplicații care chiar au nevoie de capacitate suplimentară. În acest exemplu, utilizatorului oracle i se oferă posibilitatea de a rula până la 16.384 de procese și de a deschide 65.536 de fișiere. Aceste linii ar fi configurate în profilul .bash_profile al utilizatorului oracle.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi
.