LFCS: Pratite korištenje resursa Linux procesa i postavite ograničenja procesa za svakog korisnika - 14. dio


Zbog nedavnih izmjena u ciljevima LFCS certifikacijskog ispita koje stupaju na snagu od 2. veljače 2016., dodajemo potrebne članke u LFCS seriju objavljenu ovdje. Kako biste se pripremili za ovaj ispit, preporučujemo vam da prođete i seriju LFCE.

Svaki administrator Linux sustava mora znati kako provjeriti integritet i dostupnost hardvera, resursa i ključnih procesa. Osim toga, postavljanje ograničenja resursa za svakog korisnika također mora biti dio njegovih/njezinih vještina.

U ovom ćemo članku istražiti nekoliko načina kako osigurati da se i hardver i softver sustava ispravno ponašaju kako bismo izbjegli potencijalne probleme koji mogu uzrokovati neočekivane zastoje u proizvodnji i gubitak novca.

Statistika procesora za izvještavanje Linuxa

Pomoću mpstat možete vidjeti aktivnosti za svaki procesor pojedinačno ili sustav u cjelini, kao jednokratnu snimku 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 stranici Naučite Sysstat i njegove uslužne programe mpstat, pidstat, iostat i sar u Linuxu

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

Za prikaz 3 globalnih izvješća o korištenju CPU-a (-u) za sve CPU-e (kako je označeno s -P ALL) u intervalu od 2 sekunde , čini:

mpstat -P ALL -u 2 3
Uzorak izlaza
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

Za prikaz iste statistike za određeni CPU (CPU 0 u sljedećem primjeru), upotrijebite:

mpstat -P 0 -u 2 3
Uzorak izlaza
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 procesora tijekom izvođenja aplikacija na korisničkoj razini.
  3. %nice: Isto kao %usr, ali s dobrim prioritetom.
  4. %sys: Postotak iskorištenosti CPU-a koji se dogodio tijekom izvođenja kernel aplikacija. Ovo ne uključuje vrijeme provedeno u radu s prekidima ili rukovanju hardverom.
  5. %iowait: Postotak vremena kada je dani CPU (ili sav) bio u stanju mirovanja, tijekom kojeg je na tom CPU-u zakazana I/O operacija koja zahtijeva velike resurse. Detaljnije objašnjenje (s primjerima) možete pronaći ovdje.
  6. %irq: Postotak vremena utrošenog na servisiranje hardverskih prekida.
  7. %soft: Isto kao %irq, ali sa softverskim prekidima.
  8. %steal: Postotak vremena provedenog u nenamjernom čekanju (ukradeno ili ukradeno vrijeme) kada virtualni stroj, kao gost, "osvaja" pozornost hipervizora dok se natječe za CPU(ove). Ova vrijednost bi trebala biti što manja. Visoka vrijednost u ovom polju znači da se virtualni stroj zaustavlja - ili će uskoro biti.
  9. %guest: Postotak vremena provedenog u radu virtualnog procesora.
  10. %idle: postotak vremena kada procesor(i) nisu izvršavali nijedan zadatak. Ako primijetite nisku vrijednost u ovom stupcu, to je pokazatelj da je sustav pod velikim opterećenjem. U tom slučaju, morat ćete pobliže pogledati popis procesa, o čemu ćemo raspravljati za minutu, kako biste utvrdili što ga uzrokuje.

Da biste stavili procesor pod nešto veće opterećenje, pokrenite sljedeće naredbe, a 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

Na kraju, usporedite s izlazom mpstat pod “normalnim” okolnostima:

Kao što možete vidjeti na gornjoj slici, CPU 0 bio je pod velikim opterećenjem tijekom prva dva primjera, kao što je naznačeno stupcem %idle.

U sljedećem odjeljku raspravljat ćemo o tome kako prepoznati te 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 razvrstavajući ih prema upotrebi CPU-a, koristit ćemo dobro poznatu naredbu ps s -eo (za odabir svih procesa s korisnički definiranim formatom) i --sort (za navođenje prilagođenog redoslijeda sortiranja) opcije, na primjer:

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

Gornja naredba prikazat će samo PID, PPID, naredbu povezanu s procesom i postotak upotrebe CPU-a i RAM-a poredan prema postotku upotrebe CPU-a silaznim redoslijedom . Kada se izvrši tijekom stvaranja .iso datoteke, evo prvih nekoliko redaka izlaza:

Nakon što identificiramo proces od interesa (kao što je onaj s PID=2822), možemo ići na /proc/PID (/proc/2822 u ovom slučaju) i napravite popis direktorija.

U ovom direktoriju nalazi se nekoliko datoteka i poddirektorija s detaljnim informacijama o ovom određenom procesu dok se izvodi.

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

Ako je opcija uključena, trebali biste vidjeti:

CONFIG_CGROUPS=y

Korištenjem cgroups možete upravljati količinom dopuštene 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 analize openSUSE sustava i Vodič za podešavanje te u odjeljku Kontrolne grupe u dokumentaciji poslužitelja Ubuntu 14.04.

/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 stvaranje .iso slike:

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

Više informacija o /proc može se pronaći u dokumentu “Datotečni sustav /proc” koji čuva i održava Kernel.org, te u Priručniku za programiranje Linuxa.

Postavljanje ograničenja resursa po korisniku u Linuxu

Ako niste pažljivi i dopustite bilo kojem korisniku pokretanje neograničenog broja procesa, na kraju možete doživjeti neočekivano gašenje sustava ili biti zaključani jer sustav uđe u neupotrebljivo stanje. Kako biste spriječili da se to dogodi, trebali biste ograničiti broj procesa koje korisnici mogu pokrenuti.

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

*   	hard	nproc   10

Prvo polje može se koristiti za označavanje korisnika, grupe ili svih njih (*), dok drugo polje nameće strogo ograničenje broja procesa (nproc) na 10. Za primjenu promjena dovoljna je odjava i ponovno prijavljivanje.

Dakle, da vidimo što se događa ako određeni korisnik koji nije root (bilo da je legitiman ili ne) pokuša pokrenuti shell fork bombu. Da nismo implementirali ograničenja, ovo bi inicijalno pokrenulo dvije instance funkcije, a zatim dupliciralo svaku od njih u beskonačnoj petlji. Dakle, to bi na kraju dovelo vaš sustav do puzanja.

Međutim, s gornjim ograničenjem na mjestu, fork bomba ne uspijeva, ali korisnik će i dalje biti zaključan sve dok administrator sustava ne prekine proces povezan s njom:

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

Linux Ostali alati za upravljanje procesima

Uz prethodno razmotrene alate, administrator sustava može također trebati:

a) Izmijenite prioritet izvršenja (korištenje resursa sustava) procesa pomoću renice. To znači da će kernel dodijeliti više ili manje sistemskih resursa procesu na temelju dodijeljenog prioriteta (broj obično poznat kao “ljepota” u rasponu od -20 do 19).

Što je niža vrijednost, veći je prioritet izvršenja. Redovni korisnici (osim roota) mogu modificirati samo procese koje posjeduju na višu vrijednost (što znači niži prioritet izvršenja), dok root može modificirati ovu vrijednost za bilo koji proces, te je može povećati ili smanjiti.

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), prema zadanim je postavkama postavljen na PID. U tom slučaju, preciznost procesa s PID=identifier postavljena je na .

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

Za prekid procesa upotrijebite naredbu kill na sljedeći način:

kill PID

Alternativno, možete koristiti pkill za prekid svih procesa određenog vlasnika (-u), ili vlasnika grupe (-G), ili čak onih procesa koji imaju PPID uobičajeno (-P). Ove opcije mogu biti praćene numeričkim prikazom ili stvarnim imenom kao identifikatorom:

pkill [options] identifier

Na primjer,

pkill -G 1000

će ubiti sve procese u vlasništvu grupe s 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 i pomoću opcije -l za popis imena procesa. Uzima iste opcije, ali samo vraća PID-ove procesa (bez poduzimanja daljnjih radnji) koji bi bili prekinuti ako se koristi pkill.

pgrep -l -u gacanepa

Ovo je ilustrirano na sljedećoj slici:

Sažetak

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

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

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