Limitek beállítása ulimit-tel

Írta: Sandra Henry-Stocker

Szerkesztette

Hazai, Géza

Az eredeti cikk: Setting limits with ulimit


2012. november 18.

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.

 

Share
A bejegyzés kategóriája: Egyéb írások
Kiemelt szavak: , .
Közvetlen link.

Vélemény, hozzászólás?

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .