LFCS: Nadgledanje upotrebe resursa Linux procesa i postavljanje ograničenja procesa na osnovu korisnika - 14. dio


Zbog nedavnih izmjena u ciljevima LFCS sertifikacionog ispita koji su stupili na snagu od 2. februara 2016., dodajemo potrebne članke u LFCS seriju objavljenu ovdje. Da biste se pripremili za ovaj ispit, preporučujemo vam da prođete i LFCE seriju.

Svaki administrator sistema Linux mora znati kako provjeriti integritet i dostupnost hardvera, resursa i ključnih procesa. Osim toga, postavljanje ograničenja resursa po korisniku također mora biti dio njegovog/njenog skupa vještina.

U ovom članku ćemo istražiti nekoliko načina da osiguramo da se sistem i hardver i softver ponašaju ispravno kako bi se izbjegli potencijalni problemi koji mogu uzrokovati neočekivane zastoje u proizvodnji i gubitak novca.

Statistika procesora za izvještavanje o Linuxu

Sa mpstat možete vidjeti aktivnosti za svaki procesor pojedinačno ili sistem u cjelini, i kao jednokratni snimak ili dinamički.

Da biste koristili ovaj alat, morat ćete instalirati sysstat:

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

Pročitajte više o sysstat i njegovim uslužnim programima na Learn Sysstat and Its Utilities mpstat, pidstat, iostat i sar u Linuxu

Nakon što instalirate mpstat, koristite ga za generiranje izvještaja o statistici procesora.

Za prikaz 3 globalnih izvještaja o korištenju CPU-a (-u) za sve CPU (kao što je naznačeno -P ALL) u intervalu od 2 sekunde , uradi:

mpstat -P ALL -u 2 3
Sample Output
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Da vidite istu statistiku za određeni CPU (CPU 0 u sljedećem primjeru), koristite:

mpstat -P 0 -u 2 3
Sample Output
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

Izlaz gornjih naredbi prikazuje ove stupce:

  1. CPU: Broj procesora kao cijeli broj, ili riječ all kao prosjek za sve procesore.
  2. %usr: Postotak iskorištenosti CPU-a dok se izvršavaju aplikacije na korisničkom nivou.
  3. %nice: Isto kao %usr, ali sa lijepim prioritetom.
  4. %sys: Postotak iskorištenosti CPU-a koji se dogodio tokom izvršavanja aplikacija kernela. Ovo ne uključuje vrijeme provedeno u radu s prekidima ili rukovanje hardverom.
  5. %iowait: Procenat vremena kada je dati CPU (ili svi) bio u stanju mirovanja, tokom kojeg je na tom CPU-u bila zakazana I/O operacija koja je zahtijevala velike resurse. Detaljnije objašnjenje (sa primjerima) možete pronaći ovdje.
  6. %irq: Procenat vremena provedenog na servisiranju hardverskih prekida.
  7. %soft: Isto kao %irq, ali sa softverskim prekidima.
  8. %steal: Procenat vremena provedenog u nenamjernom čekanju (ukradeno ili ukradeno vrijeme) kada virtuelna mašina, kao gost, „osvaja“ pažnju hipervizora dok se takmiči za CPU(e). Ova vrijednost treba biti što manja. Visoka vrijednost u ovom polju znači da virtuelna mašina staje – ili će uskoro biti.
  9. %guest: Procenat vremena provedenog u radu virtuelnog procesora.
  10. %idle: postotak vremena kada CPU(ovi) nisu izvršavali nijedan zadatak. Ako primijetite nisku vrijednost u ovoj koloni, to je pokazatelj da je sistem pod velikim opterećenjem. U tom slučaju, moraćete detaljnije da pogledate listu procesa, o čemu ćemo razgovarati za minut, da biste utvrdili šta ga uzrokuje.

Da biste stavili procesor pod donekle veliko opterećenje, pokrenite sljedeće naredbe i zatim izvršite mpstat (kao što je naznačeno) u zasebnom terminalu:

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

Konačno, uporedite sa izlazom mpstat pod “normalnim” okolnostima:

Kao što možete vidjeti na gornjoj slici, CPU 0 je bio pod velikim opterećenjem tokom prva dva primjera, što pokazuje kolona %idle.

U sljedećem odjeljku ćemo razgovarati o tome kako identificirati ove procese koji zahtijevaju resurse, kako dobiti više informacija o njima i kako poduzeti odgovarajuće mjere.

Izvještavanje o Linux procesima

Za popis procesa koji ih sortiraju prema korištenju CPU-a, koristit ćemo dobro poznatu naredbu ps sa -eo (za odabir svih procesa sa korisnički definiranim formatom) i --sort (da navedete prilagođeni redoslijed sortiranja) opcije, na primjer:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

Gornja naredba će prikazati samo PID, PPID, naredbu povezanu s procesom i postotak korištenja CPU-a i RAM-a sortiran prema postotku korištenja CPU-a u opadajućem redoslijedu . Kada se izvrši tokom kreiranja datoteke .iso, evo prvih nekoliko redova izlaza:

Nakon što smo identificirali proces od interesa (kao što je onaj sa PID=2822), možemo navigirati do /proc/PID (/proc/2822 u ovom slučaju) i napravite popis direktorija.

Ovaj direktorij je mjesto gdje se čuva nekoliko datoteka i poddirektorija s detaljnim informacijama o ovom konkretnom procesu dok je pokrenut.

Na primjer:
  1. /proc/2822/io sadrži IO statistiku za proces (broj znakova i bajtova koji se čitaju i upisuju, između ostalog, tokom IO operacija).
  2. /proc/2822/attr/current prikazuje trenutne SELinux sigurnosne atribute procesa.
  3. /proc/2822/cgroup opisuje kontrolne grupe (skraćeno cgroups) kojima proces pripada ako je omogućena opcija konfiguracije kernela CONFIG_CGROUPS, što možete provjeriti pomoću:
cat /boot/config-$(uname -r) | grep -i cgroups

Ako je opcija omogućena, trebali biste vidjeti:

CONFIG_CGROUPS=y

Koristeći cgroups možete upravljati količinom dozvoljene upotrebe resursa na bazi procesa kao što je objašnjeno u poglavljima 1 do 4 Red Hat Enterprise Linux 7 vodiča za upravljanje resursima, u poglavlju 9 OpenSUSE System Analysis i vodič za podešavanje, iu odeljku Kontrolne grupe u dokumentaciji Ubuntu 14.04 servera.

/proc/2822/fd je direktorij koji sadrži jednu simboličku vezu za svaki deskriptor datoteke koji je proces otvorio. Sljedeća slika prikazuje ove informacije za proces koji je pokrenut u tty1 (prvi terminal) za kreiranje .iso slike:

Gornja slika pokazuje da stdin (deskriptor datoteke 0), stdout (deskriptor datoteke 1) i stderr (deskriptor datoteke 2) se mapiraju na /dev/zero, /root/test.iso i /dev/tty1, respektivno.

Više informacija o /proc možete pronaći u dokumentu “/proc filesystem” koji čuva i održava Kernel.org, te u priručniku za Linux programera.

Postavljanje ograničenja resursa po korisniku u Linuxu

Ako ne budete pažljivi i dopustite bilo kojem korisniku da pokrene neograničen broj procesa, na kraju možete doživjeti neočekivano gašenje sistema ili ćete biti zaključani kada sistem uđe u neupotrebljivo stanje. Kako biste spriječili da se to dogodi, trebali biste postaviti ograničenje na broj procesa koje korisnici mogu pokrenuti.

Da biste to učinili, uredite /etc/security/limits.conf i dodajte sljedeći red na dno datoteke da postavite ograničenje:

*   	hard	nproc   10

Prvo polje se može koristiti za označavanje korisnika, grupe ili svih njih (*), dok drugo polje nameće čvrsto ograničenje broja procesa (nproc) do 10. Za primjenu promjena dovoljno je odjaviti se i ponovo prijaviti.

Dakle, hajde da vidimo šta se dešava ako određeni korisnik koji nije root (bilo legitiman ili ne) pokuša da pokrene shell fork bombu. Da nismo implementirali ograničenja, ovo bi u početku pokrenulo dvije instance funkcije, a zatim dupliralo svaku od njih u beskrajnoj petlji. Dakle, to bi na kraju dovelo vaš sistem do puzanja.

Međutim, s gore navedenim ograničenjem na snazi, viljuška bomba neće uspjeti, ali će korisnik i dalje biti zaključan dok administrator sistema ne ubije proces povezan s njom:

SAVJET: Ostala moguća ograničenja omogućena ulimit su dokumentirana u datoteci limits.conf.

Linux Ostali alati za upravljanje procesima

Pored alata o kojima smo prethodno razgovarali, administrator sistema će možda trebati i:

a) Izmijenite prioritet izvršenja (upotreba sistemskih resursa) procesa koristeći renice. To znači da će kernel dodijeliti više ili manje sistemskih resursa procesu na osnovu dodijeljenog prioriteta (broja poznatog kao “prijatnost” u rasponu od -20 do 19).

Što je niža vrijednost, veći je prioritet izvršenja. Redovni korisnici (osim root) mogu samo modifikovati lepotu procesa koje poseduju na višu vrednost (što znači niži prioritet izvršenja), dok root može da menja ovu vrednost za bilo koji proces i može da je poveća ili smanji.

Osnovna sintaksa renice je sljedeća:

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Ako argument nakon nove vrijednosti prioriteta nije prisutan (prazan), po defaultu je postavljen na PID. U tom slučaju, lepota procesa sa PID=identifier je postavljena na .

b) Prekinite normalno izvršavanje procesa kada je to potrebno. Ovo je opšte poznato kao „ubijanje“ procesa. Ispod haube, to znači slanje signala procesu da pravilno završi svoje izvršenje i da na uredan način oslobodi sve korištene resurse.

Da biste prekinuli proces, koristite naredbu kill na sljedeći način:

kill PID

Alternativno, možete koristiti pkill da prekinete sve procese datog vlasnika (-u), ili vlasnika grupe (-G), ili čak one procese koji imaju PPID zajedničko (-P). Ove opcije mogu biti praćene numeričkim prikazom ili stvarnim imenom kao identifikatorom:

pkill [options] identifier

Na primjer,

pkill -G 1000

će ugasiti sve procese u vlasništvu grupe sa GID=1000.

i,

pkill -P 4993 

će ubiti sve procese čiji je PPID 4993.

Prije pokretanja pkill, dobra je ideja prvo testirati rezultate pomoću pgrep, možda koristeći opciju -l i da navedete imena procesa. Uzima iste opcije, ali samo vraća PID-ove procesa (bez poduzimanja bilo kakve daljnje radnje) koji bi bili ubijeni ako se koristi pkill.

pgrep -l -u gacanepa

Ovo je ilustrovano na sljedećoj slici:

Sažetak

U ovom članku smo istražili nekoliko načina za praćenje korištenja resursa kako bismo provjerili integritet i dostupnost kritičnih hardverskih i softverskih komponenti u Linux sistemu.

Takođe smo naučili kako da preduzmemo odgovarajuće radnje (bilo prilagođavanjem prioriteta izvršenja datog procesa ili njegovim prekidom) u neobičnim okolnostima.

Nadamo se da su koncepti objašnjeni u ovom vodiču bili od pomoći. Ako imate bilo kakvih pitanja ili komentara, slobodno nam se obratite putem kontakt forme ispod.