A Unix-kiszolgálók kezelése kihívást jelenthet, különösen akkor, ha a kezelt rendszereket erősen használják, és a teljesítményproblémák csökkentik a rendelkezésre állást. Szerencsére bizonyos erőforrásokra korlátozásokat állíthatsz fel, amelyek segítségével biztosíthatod, hogy a szervereken a legfontosabb folyamatok tovább tudjanak futni, és a konkurens folyamatok ne fogyasszanak sokkal több erőforrást, mint ami jót tesz a teljes rendszernek. Az ulimit parancs megakadályozhatja a katasztrófát, de előre kell látnia, hogy hol van értelme a korlátozásoknak, és hol okoznak problémákat.
Ez talán nem történik meg túl gyakran, de egyetlen felhasználó, aki túl sok folyamatot indít, használhatatlanná teheti a rendszert mindenki más számára. A fork-bomba — egy szolgáltatásmegtagadási támadás, amelyben egy folyamat folyamatosan replikálja magát, amíg a rendelkezésre álló erőforrások ki nem merülnek — ennek legrosszabb esete. Azonban még a barátságos felhasználók is több erőforrást használhatnak fel, mint ami a rendszernek jót tenne — gyakran anélkül, hogy ezt szándékosan tennék. Ugyanakkor a legitim folyamatok néha meghibásodhatnak, amikor az átlagos felhasználók számára tervezett korlátok ellenében futnak. Ebben az esetben gondoskodni kell arról, hogy ezek a folyamatok olyan erősített rendszererőforrás-kiosztást kapjanak, amely lehetővé teszi számukra a megfelelő futást anélkül, hogy ugyanazokat az erőforrásokat mindenki számára elérhetővé tenné.
A bejelentkezéshez társított korlátok megtekintéséhez használja az ulimit -a parancsot. Ha normál felhasználói fiókot használsz, akkor valószínűleg valami ilyesmit fogsz látni:
$ 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
Egy dolog, amit rögtön észrevehetsz, hogy nem tudsz core dumpsot készíteni — mert a maximális core fájlméret 0. Igen, ez azt jelenti, hogy semmi, se adat, se core dump. Ha egy általad futtatott folyamat megszakad, akkor nem fog core fájl kerülni a home könyvtáradba. Amíg a core fájl mérete nullára van állítva, addig a core dumps nem engedélyezett. Ennek a legtöbb felhasználó számára van értelme, mivel valószínűleg semmi mást nem csinálnának egy core dump-al a törlésen kívül, de ha szükséged van egy core dump-ra egy alkalmazással kapcsolatos problémák elhárításához, akkor lehet, hogy korlátlan méretűre akarod állítani a core fájl méretét — és talán meg is teheted.
$ ulimit -c ulimited$ ulimit -cunlimited
Ha egy szervert kezelsz, és be akarod kapcsolni a core dumps létrehozásának lehetőségét az összes felhasználód számára — talán ők a fejlesztők, akiknek valóban szükségük van arra, hogy elemezhessék ezeket a core dumpsokat, akkor a felhasználót root-ra kell váltanod, és szerkesztened kell az /etc/security/limits-et.conf (Linux) vagy az /etc/system (Solaris) fájlban végezzen módosításokat.
Ha viszont egy szervert kezel, és nem akarja, hogy bármelyik felhasználója képes legyen core dumpsokat generálni, függetlenül attól, hogy mennyire szeretné belemélyeszteni a fogát, akkor a limits.conf fájlban beállíthat egy 0-s korlátot.
A másik gyakran alkalmazott korlát az, amely az egyén által futtatható folyamatok számát korlátozza. Az erre használt ulimit opció a -u. Megnézheted a limitedet, ahogy fentebb tettük az ulimit -a paranccsal, vagy megjelenítheted csak az “nproc” limitet az ulimit -u paranccsal.
$ ulimit -u50
Még egyszer, a felhasználók egy másik ulimit paranccsal — ulimit -u 100 — módosíthatják a limitjüket, kivéve persze, ha nem tudják. Ha a limits.conf vagy a rendszerfájlban 50 folyamatra korlátoztad őket, akkor egy ehhez hasonló hibát fognak kapni, amikor megpróbálják növelni a limitjeiket:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
A limiteket csoportonként is beállíthatod, így például a fejlesztők több folyamat futtatására adhatsz lehetőséget, mint a menedzserek. Az ilyen sorok a limits.conf fájlban ezt tennék:
@managers hard nproc 50@developers hard nproc 200
Ha a megnyitott fájlok számát akarjuk korlátozni, akkor csak más beállítást használunk.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Itt két csoportnak és egy egyénnek adtuk meg a nyitott fájlok limitjének növelését. Ezek mind kemény korlátokat állítottak be. Ha puha korlátokat is beállítasz, akkor a felhasználók figyelmeztetést kapnak, ha elérik az alsó határt.
@developers soft nofile 2048@developers hard nofile 8192
Az ulimit beállítások listáját a man oldalon (man ulimit) találod. Megfigyelheted, hogy az ulimit egy bash-beépített — legalábbis Linuxon — és a következő opciók állnak rendelkezésre:
-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
Ha a limits.conf fájlod megengedi, akkor láthatsz ilyen korlátokat beállítva bizonyos alkalmazások számára, amelyeknek valóban szükségük van az extra kapacitásra. Ebben a példában az oracle felhasználónak legfeljebb 16 384 folyamat futtatására és 65 536 fájl megnyitására adunk lehetőséget. Ezeket a sorokat az oracle felhasználó .bash_profiljában kell beállítani.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi