Írta: Sandra Henry-Stocker
Egy Unix szerver adminisztrálása kihívás lehet, különösen akkor, ha az általad menedzselt rendszert erősen igénybe veszik és a teljesítménybeli problémák csökkentik a használhatóságot. Szerencsére korlátozhatod az egyes erőforrás igénybevételeket, hogy a szerver legfontosabb folyamatai dolgozhassanak és a versenyhelyzetű folyamatok ne fogyasszanak több erőforrást, mint amennyi megfelel a teljes rendszernek. Az ulimit parancs megelőzheti a katasztrófát, de előre látni kell, hol van értelme korlátozni és hol okozhat ez problémát.
Lehet, hogy nem gyakran fordul elő, de egy felhasználó, aki túl sok folyamatot indít el, használhatatlanná teszi a rendszert mások számára. Egy fork bomba – egy szolgáltatás megtagadási támadás, amelyben egy folyamat ismétlődően sokszorozza saját magát, amíg a rendelkezésre álló erőforrások ki nem merültek – a legrosszabb ilyen eset. De még a gondos felhasználó is használhat több erőforrást, mint ami megfelel a rendszernek – anélkül, hogy észrevenné. Ugyanakkor a legális folyamatok is megszakadhatnak, ha elérik az átlagos felhasználó számára megállapított limitet. Ebben az esetben meg kell győződni arról, hogy ezek a folyamatok a megnövelt erőforrásokkal úgy dolgoznak, hogy nem használnak mindenki számára igényelhető erőforrásokat
Ha szeretnéd látni a belépésedhez tartozó limiteket, használd az ulimit -a parancsot. Ha Te egy átlagos felhasználói belépést használsz, akkor valószínűleg valami hasonlót látsz:
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 32767 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 50 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
A legelső szembetűnő dolog az, hogy nem hozhatsz létre memória pillanatfelvételt (core dump) – mert a core fájlméret 0. Igen, ez nem jelent semmit, nincs adat, nincs memória térkép. Ha az általad futtatott folyamat megszakad, nem keletkezik memória pillanatfelvétel fájl a belépési mappádban. Mindaddig, amíg a core fájlméret nullára van állítva, memória pillanatfelvétel nincs engedélyezve. A legtöbb felhasználó számára ez így természetes, mert nem csinálna mást egy memória pillanatfelvétellel, mint törölné, de ha szükséged lenne a memória pillanatfelvételre egy futó alkalmazás problémájának kiderítésére, be szeretnéd állítani a core fájl méretet korlátlannak – és valószínűleg meg is teheted.
$ ulimit -c unlimited $ ulimit -c unlimited
Ha egy szervert menedzselsz és a memória pillanatfelvétel készítés lehetőségét be akarod kapcsolni minden felhasználó számára – feltehetően ők fejlesztők, akiknek tényleg szükségük lehet ezeknek a memória pillanatfelvételeknek az elemzésére – válts root felhasználóra és szerkeszd a /etc/security/limits.conf
(Linux), vagy változtasd meg a /etc/system
fájlt (Solaris).
Másrészt viszont, ha szervert menedzselsz és nem akarod engedélyezni egyik felhasználónak sem a memória pillanatfelvétel generálását, függetlenül attól, hogy milyen mélyre bonyolódnak a dolgaikba, 0-ra állíthatod ezt a limitet a limits.conf
-ban. Az erre szolgáló ulimit opció a -u
. Megnézheted a limitedet a fentebb említett ulimit -a
paranccsal, vagy csak a „nproc” limitedet az ulimit -u
paranccsal.
$ ulimit -u 50
Mégegyszer, a felhasználóid megváltoztathatják a limitjeiket egy másik ulimit paranccsal – ulimit -u 100
– hacsak, természetesen, képesek rá. Ha korlátoztad a limits.conf
-ban vagy a rendszer fájlban a folyamataik számát 50-ben, akkor egy ehhez hasonló hibaüzenetet kapnak, amikor megemelni próbálják limitjüket:
$ ulimit -u 100 -bash: ulimit: max user processes: cannot modify limit: Operation not permitted[1]
A limiteket csoportonként is be lehet állítani, így, mondjuk, adhatsz a fejlesztőknek több folyamat futtatási lehetőséget, mint a menedzsereknek. Írhatsz ilyen sorokat a limits.conf
fájlba:
@managers hard nproc 50 @developers hard nproc 200
Ha a megnyitható fájlok számát akarod korlátozni, egy másik beállítást használj:
@managers hard nofile 2048 @developers hard nofile 8192 sbob hard nofile 8192
Itt két csoportnak és egy egyéni felhasználónak növeltük meg a nyitható fájlok számát. Ezek mind kemény korlátok. Ha lágy korlátot is be akarsz állítani, a felhasználók figyelmeztetést kapnak, ha elérik az alsó limitet.
@developers soft nofile 2048 @developers hard nofile 8192
Az ulimit opcióit megnézheted a kézikönyv oldalon (man ulimit
). Felhívja a figyelmet, hogy az ulimit
a bash beépített parancsa – legalábbis Linuxon – és a következő opciók használhatók[2]:
-a Az összes aktuális korlátozás kiírása -c A core fájl maximális mérete -d A folyamatok adatszegmensének maximális mérete -e A maximális ütemezési prioritás ("nice") -f Egy shell és leszármazottai által írható maximális fájlméret -i A maximális várakozó szignálok száma -l A memóriában lefoglalható maximális méret -m A maximális rezidens méret (Linuxon nincs hatása) -n A fájl leírók maximális száma (a rendszerek nagy részében ez nem állítható érték) -p A csővezeték mérete 512 bájtos blokkokban (nem állítható) -q A POSIX üzenetsor maximális mérete bájtban -r A maximális valós idejű ütemezés prioritása -s A maximális verem méret -t The maximum amount of cpu time in seconds -u Egyéni felhasználó által használható folyamatos maximális száma -v Shell által használható virtuális memória maximális értéke
Ha a limits.conf lehetőséget ad, előfordulhat, hogy különleges alkalmazásoknak ténylegesen szükséges extra kapacitást állíthatsz be. Ebben a példában az oracle felhasználó lehetőséget kap egészen 16384 folyamat futtatására és 65536 fájl megnyitására. Ezek a sorok kerülhetnének be az oracle felhasználó .bash_profile
-jába.
if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi
A limitek beállítása védelmet nyújthat megbolondult és rosszindulatú folyamatok ellen, amelyek a rendszeredet használhatatlanná teheti. Csak meg kell győződnöd arról, hogy a korlátok Téged szolgálnak, ahogy tervezted az erőforrások legjobb felhasználását, és nem ellened vannak.
[1] -bash: -ulimit: max felhasználói folyamat: nem módosíthatja a limitet: a művelet nem engedélyezett
[2] Az eredeti angol szövegek magyar átiratát közlöm – a ford.