LFCS: Overvåk Linux-prosesser ressursbruk og angi prosessgrenser på en per-bruker-basis - Del 14


På grunn av nylige endringer i målene for LFCS-sertifiseringseksamen som gjelder fra 2. februar 2016, legger vi til de nødvendige artiklene til LFCS-serien publisert her. For å forberede deg til denne eksamen, oppfordres du sterkt til å gå gjennom LFCE-serien også.

Enhver Linux-systemadministrator trenger å vite hvordan man verifiserer integriteten og tilgjengeligheten til maskinvare, ressurser og nøkkelprosesser. I tillegg må det å sette ressursgrenser på per-bruker-basis også være en del av hans/hennes ferdighetssett.

I denne artikkelen vil vi utforske noen måter å sikre at systemet både maskinvaren og programvaren oppfører seg riktig for å unngå potensielle problemer som kan forårsake uventet produksjonsstans og tap av penger.

Linux-rapporteringsprosessorstatistikk

Med mpstat kan du se aktivitetene for hver prosessor individuelt eller systemet som helhet, både som et engangsbilde eller dynamisk.

For å bruke dette verktøyet, må du installere 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]

Les mer om sysstat og dets verktøy på Lær Sysstat og dets verktøy mpstat, pidstat, iostat og sar i Linux

Når du har installert mpstat, bruk den til å generere rapporter om prosessorstatistikk.

For å vise 3 globale rapporter om CPU-bruk (-u) for alle CPUer (som indikert med -P ALL) med et 2-sekunders intervall , gjør:

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

For å se den samme statistikken for en spesifikk CPU (CPU 0 i følgende eksempel), bruk:

mpstat -P 0 -u 2 3
Eksempelutgang
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

Utdataene fra kommandoene ovenfor viser disse kolonnene:

  1. CPU: Prosessornummer som et heltall, eller ordet alle som gjennomsnitt for alle prosessorer.
  2. %usr: Prosentandel av CPU-bruk under kjøring av applikasjoner på brukernivå.
  3. %nice: Samme som %usr, men med god prioritet.
  4. %sys: Prosentandel av CPU-bruk som skjedde under kjøring av kjerneapplikasjoner. Dette inkluderer ikke tid brukt på å håndtere avbrudd eller håndtere maskinvare.
  5. %iowait: Prosentandel av tiden da den gitte CPUen (eller alle) var inaktiv, hvor det var en ressurskrevende I/O-operasjon planlagt på den CPUen. En mer detaljert forklaring (med eksempler) finner du her.
  6. %irq: Prosentandel av tiden brukt på å betjene maskinvareavbrudd.
  7. %soft: Samme som %irq, men med programvareavbrudd.
  8. %steal: Prosentandel av tiden brukt i ufrivillig ventetid (stjele eller stjålet tid) når en virtuell maskin, som gjest, "vinner" hypervisorens oppmerksomhet mens den konkurrerer om CPU(ene). Denne verdien bør holdes så liten som mulig. En høy verdi i dette feltet betyr at den virtuelle maskinen stopper opp – eller snart vil bli det.
  9. %guest: Prosentandel av tiden brukt på å kjøre en virtuell prosessor.
  10. %idle: prosentandel av tiden da CPU(er) ikke utførte noen oppgaver. Hvis du observerer en lav verdi i denne kolonnen, er det en indikasjon på at systemet er utsatt for stor belastning. I så fall må du se nærmere på prosesslisten, som vi vil diskutere om et minutt, for å finne ut hva som forårsaker det.

For å sette prosessoren under en noe høy belastning, kjør følgende kommandoer og kjør mpstat (som angitt) i en separat terminal:

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

Til slutt, sammenlign med utdataene til mpstat under "normale" omstendigheter:

Som du kan se i bildet ovenfor, var CPU 0 under en stor belastning under de to første eksemplene, som indikert av %idle-kolonnen.

I neste avsnitt vil vi diskutere hvordan man identifiserer disse ressurskrevende prosessene, hvordan man kan få mer informasjon om dem og hvordan man kan iverksette passende tiltak.

Rapportering av Linux-prosesser

For å liste prosesser som sorterer dem etter CPU-bruk, vil vi bruke den velkjente ps-kommandoen med -eo (for å velge alle prosesser med brukerdefinert format) og --sort (for å spesifisere en egendefinert sorteringsrekkefølge) alternativer, som slik:

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

Kommandoen ovenfor vil bare vise PID, PPID, kommandoen knyttet til prosessen, og prosentandelen av CPU- og RAM-bruk sortert etter prosentandelen av CPU-bruken i synkende rekkefølge . Når den utføres under opprettelsen av .iso-filen, er her de første linjene i utdataene:

Når vi har identifisert en prosess av interesse (som den med PID=2822), kan vi navigere til /proc/PID (/proc/2822 i dette tilfellet) og gjør en katalogoppføring.

Denne katalogen er hvor flere filer og underkataloger med detaljert informasjon om denne prosessen lagres mens den kjører.

For eksempel:
  1. /proc/2822/io inneholder IO-statistikk for prosessen (antall tegn og byte lest og skrevet, blant annet under IO-operasjoner).
  2. /proc/2822/attr/current viser de gjeldende SELinux-sikkerhetsattributtene til prosessen.
  3. /proc/2822/cgroup beskriver kontrollgruppene (forkortet cgroups) som prosessen tilhører hvis CONFIG_CGROUPS kjernekonfigurasjonsalternativet er aktivert, som du kan verifisere med:
cat /boot/config-$(uname -r) | grep -i cgroups

Hvis alternativet er aktivert, bør du se:

CONFIG_CGROUPS=y

Ved å bruke cgroups kan du administrere mengden tillatt ressursbruk per prosess som forklart i kapittel 1 til 4 i Red Hat Enterprise Linux 7 Resource Management guide, i kapittel 9 i openSUSE System Analysis og Tuning guide, og i kontrollgrupper-delen av Ubuntu 14.04 Server-dokumentasjonen.

/proc/2822/fd er en katalog som inneholder én symbolsk lenke for hver filbeskrivelse prosessen har åpnet. Følgende bilde viser denne informasjonen for prosessen som ble startet i tty1 (den første terminalen) for å lage .iso-bildet:

Bildet ovenfor viser at stdin (filbeskrivelse 0), stdout (filbeskrivelse 1) og >stderr (filbeskrivelse 2) er tilordnet /dev/zero, /root/test.iso og >/dev/tty1, henholdsvis.

Mer informasjon om /proc kan finnes i «The /proc filsystem»-dokumentet som holdes og vedlikeholdes av Kernel.org, og i Linux Programmers Manual.

Sette ressursgrenser på per-bruker-basis i Linux

Hvis du ikke er forsiktig og lar enhver bruker kjøre et ubegrenset antall prosesser, kan du til slutt oppleve en uventet systemavslutning eller bli låst ute når systemet går inn i en ubrukelig tilstand. For å forhindre at dette skjer, bør du sette en grense på antall prosesser brukere kan starte.

For å gjøre dette, rediger /etc/security/limits.conf og legg til følgende linje nederst i filen for å angi grensen:

*   	hard	nproc   10

Det første feltet kan brukes til å angi enten en bruker, en gruppe eller alle (*), mens det andre feltet håndhever en hard grense for antall prosesser (nproc) til 10. For å bruke endringer er det nok å logge ut og inn igjen.

La oss derfor se hva som skjer hvis en annen bruker enn root (enten en legitim en eller ikke) prøver å starte en shell-gaffelbombe. Hvis vi ikke hadde implementert grenser, ville dette i utgangspunktet lansert to forekomster av en funksjon, og deretter duplisert hver av dem i en uendelig løkke. Dermed vil det til slutt bringe systemet ditt til en gjennomgang.

Men med begrensningen ovenfor på plass, lykkes ikke gaffelbomben, men brukeren vil fortsatt bli låst ute til systemadministratoren dreper prosessen knyttet til den:

TIPS: Andre mulige begrensninger som er muliggjort av ulimit er dokumentert i filen limits.conf.

Linux andre prosessadministrasjonsverktøy

I tillegg til verktøyene som er diskutert tidligere, kan en systemadministrator også trenge å:

a) Endre utførelsesprioriteten (bruk av systemressurser) for en prosess ved hjelp av renice. Dette betyr at kjernen vil allokere mer eller mindre systemressurser til prosessen basert på den tildelte prioritet (et tall kjent som "hyggelighet " i området fra -20 til 19).

Jo lavere verdi, desto større utførelsesprioritet. Vanlige brukere (annet enn root) kan bare endre finheten til prosesser de eier til en høyere verdi (som betyr en lavere utførelsesprioritet), mens root kan endre denne verdien for enhver prosess, og kan øke eller redusere den.

Den grunnleggende syntaksen til renice er som følger:

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

Hvis argumentet etter den nye prioritetsverdien ikke er tilstede (tom), er det satt til PID som standard. I så fall er pent prosessen med PID=identifikator satt til .

b) Avbryt normal kjøring av en prosess ved behov. Dette er ofte kjent som å "drepe" prosessen. Under panseret betyr dette å sende prosessen et signal om å fullføre dens utførelse på riktig måte og frigjøre eventuelle brukte ressurser på en ryddig måte.

For å drepe en prosess, bruk kommandoen kill som følger:

kill PID

Alternativt kan du bruke pkill for å avslutte alle prosessene til en gitt eier (-u), eller en gruppeeier (-G), eller til og med de prosessene som har en PPID felles (-P). Disse alternativene kan etterfølges av den numeriske representasjonen eller det faktiske navnet som identifikator:

pkill [options] identifier

For eksempel,

pkill -G 1000

vil drepe alle prosesser som eies av gruppe med GID=1000.

Og,

pkill -P 4993 

vil drepe alle prosesser hvis PPID er 4993.

Før du kjører en pkill, er det en god idé å teste resultatene med pgrep først, kanskje også bruke -l-alternativet for å liste opp prosessnavn. Den tar de samme alternativene, men returnerer bare PID-ene til prosesser (uten å gjøre noe mer) som ville bli drept hvis pkill brukes.

pgrep -l -u gacanepa

Dette er illustrert i neste bilde:

Sammendrag

I denne artikkelen har vi utforsket noen måter å overvåke ressursbruk på for å verifisere integriteten og tilgjengeligheten til kritiske maskinvare- og programvarekomponenter i et Linux-system.

Vi har også lært hvordan vi kan iverksette passende tiltak (enten ved å justere utførelsesprioriteten til en gitt prosess eller ved å avslutte den) under uvanlige omstendigheter.

Vi håper konseptene som er forklart i denne opplæringen har vært nyttige. Hvis du har spørsmål eller kommentarer, kontakt oss gjerne ved å bruke kontaktskjemaet nedenfor.