LFCS: Overvåg Linux-processer Ressourcebrug og indstil procesgrænser pr. Bruger - Del 14


På grund af nylige ændringer i målene for LFCS-certificeringseksamen, der træder i kraft den 2. februar 2016, tilføjer vi også de nødvendige artikler til LFCE-serien.

Hver Linux-systemadministrator har brug for at vide, hvordan man verificerer integriteten og tilgængeligheden af hardware, ressourcer og nøgleprocesser. Derudover skal indstilling af ressourcebegrænsninger pr. Bruger også være en del af hans/hendes færdighedssæt.

I denne artikel undersøger vi et par måder at sikre, at både hardware og softwaren fungerer korrekt for at undgå potentielle problemer, der kan forårsage uventet produktionsstop og pengetab.

Linux-rapporteringsprocessorstatistikker

Med mpstat kan du se aktiviteterne for hver processor individuelt eller systemet som helhed, både som et engangsbillede eller dynamisk.

For at bruge dette værktøj skal 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]

Læs mere om sysstat og dets hjælpeprogrammer på Learn Sysstat and Its Utilities mpstat, pidstat, iostat og sar i Linux

Når du har installeret mpstat, skal du bruge den til at generere rapporter om processorstatistikker.

For at få vist 3 globale rapporter om CPU-udnyttelse ( -u ) for alle CPU'er (som angivet af -P ALL) med et interval på 2 sekunder, skal du gøre følgende:

# mpstat -P ALL -u 2 3
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 at se de samme statistikker for en bestemt CPU (CPU 0 i følgende eksempel) skal du bruge:

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

Outputtet fra ovenstående kommandoer viser disse kolonner:

  1. CPU : Processornummer som et heltal eller ordet alle som et gennemsnit for alle processorer.
  2. % usr : Procentdel af CPU-udnyttelse under kørsel af applikationer på brugerniveau.
  3. % nice : Samme som % usr , men med god prioritet.
  4. % sys : Procentdel af CPU-udnyttelse, der opstod under udførelse af kerneapplikationer. Dette inkluderer ikke tid brugt på afbrydelser eller håndtering af hardware.
  5. % iowait : Procentdel af tid, hvor den givne CPU (eller alle) var inaktiv, hvorunder der var planlagt en ressourcekrævende I/O-operation på denne CPU. En mere detaljeret forklaring (med eksempler) findes her.
  6. % irq : Procentdel af tid brugt på at afbryde hardwareafbrydelser.
  7. % soft : Samme som % irq , men med softwareafbrydelser.
  8. % stjæle : Procentdel af tid brugt i ufrivillig ventetid (stjæle eller stjålet tid), når en virtuel maskine som gæst "vinder" hypervisorens opmærksomhed, mens den konkurrerer om CPU (erne). Denne værdi skal holdes så lille som muligt. En høj værdi i dette felt betyder, at den virtuelle maskine går i stå - eller snart vil være.
  9. % gæst : Procentdel af tid brugt på at køre en virtuel processor.
  10. % inaktiv : procentdel af tid, hvor CPU (er) ikke udførte nogen opgaver. Hvis du observerer en lav værdi i denne kolonne, er det en indikation af, at systemet placeres under tung belastning. I så fald bliver du nødt til at se nærmere på proceslisten, som vi vil diskutere om et øjeblik for at bestemme, hvad der forårsager den.

For at placere processoren under en noget høj belastning skal du køre følgende kommandoer og derefter udføre mpstat (som angivet) 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

Endelig sammenlign med output fra mpstat under "normale" omstændigheder:

Som du kan se på billedet ovenfor, var CPU 0 under tung belastning i løbet af de første to eksempler, som angivet i kolonnen % inaktiv .

I det næste afsnit vil vi diskutere, hvordan man identificerer disse ressource-sultne processer, hvordan man får mere information om dem, og hvordan man tager passende skridt.

Rapportering af Linux-processer

For at liste processer, der sorterer dem efter CPU-brug, bruger vi den velkendte ps kommando med -eo (til at vælge alle processer med brugerdefineret format) og --sort (for at specificere en brugerdefineret sorteringsrækkefølge) muligheder som sådan:

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

Ovenstående kommando viser kun PID , PPID , kommandoen tilknyttet processen og procentdelen af CPU- og RAM-brug sorteret efter procentdelen af CPU-brug i faldende rækkefølge . Når de udføres under oprettelsen af .iso-filen, er her de første par linjer i output:

Når vi har identificeret en proces af interesse (som den med PID = 2822 ), kan vi navigere til /proc/PID (/proc/2822 i dette tilfælde) og foretag en katalogoversigt.

Denne mappe er hvor flere filer og underkataloger med detaljeret information om denne særlige proces opbevares, mens den kører.

  1. /proc/2822/io indeholder IO-statistikker for processen (antal tegn og bytes, der er læst og skrevet, blandt andet under IO-operationer).
  2. /proc/2822/attr/current viser de aktuelle SELinux-sikkerhedsattributter for processen.
  3. /proc/2822/cgroup beskriver de kontrolgrupper (cgroups for korte), som processen hører til, hvis CONFIG_CGROUPS-kernekonfigurationsindstillingen er aktiveret, som du kan bekræfte med:

# cat /boot/config-$(uname -r) | grep -i cgroups

Hvis indstillingen er aktiveret, skal du se:

CONFIG_CGROUPS=y

Ved hjælp af cgroups kan du administrere mængden af tilladt ressourceforbrug pr. Procesbasis som forklaret i kapitel 1 til 4 i kontrolgruppeafsnittet i Ubuntu 14.04 Server-dokumentationen.

/proc/2822/fd er et bibliotek, der indeholder et symbolsk link til hver filbeskrivelse, processen har åbnet. Følgende billede viser denne information for den proces, der blev startet i tty1 (den første terminal) for at oprette .iso-billedet:

Ovenstående billede viser, at stdin (filbeskrivelse 0), stdout (filbeskrivelse 1) og stderr (filbeskrivelse 2) er kortlagt til henholdsvis/dev/zero, /root/test.iso og/dev/tty1.

Flere oplysninger om /proc kan findes i "The /proc filesystem" -dokumentet, der opbevares og vedligeholdes af Kernel.org og i Linux Programmer's Manual.

Indstilling af ressourcebegrænsninger pr. Bruger i Linux

Hvis du ikke er forsigtig og tillader enhver bruger at køre et ubegrænset antal processer, kan du til sidst opleve en uventet nedlukning af systemet eller blive låst ude, når systemet går i en ubrugelig tilstand. For at forhindre dette skal du lægge en grænse for antallet af processer, som brugere kan starte.

For at gøre dette skal du redigere /etc/security/limits.conf og tilføje følgende linje i bunden af filen for at indstille grænsen:

*   	hard	nproc   10

Det første felt kan bruges til at angive enten en bruger, en gruppe eller dem alle (*) , mens det andet felt tvinger en hård grænse for antallet af processer (nproc) til 10. To anvende ændringer, det er nok at logge af og tilbage.

Lad os derfor se, hvad der sker, hvis en anden bruger end root (enten en legitim eller ej) forsøger at starte en shellgaffelbombe. Hvis vi ikke havde implementeret grænser, ville dette oprindeligt starte to forekomster af en funktion og derefter duplikere hver af dem i en uendelig løkke. Således vil det til sidst bringe dit system til en gennemgang.

Men med ovenstående begrænsning på plads, lykkes gaffelbomben ikke, men brugeren bliver stadig låst ude, indtil systemadministratoren dræber den proces, der er knyttet til den:

TIP: Andre mulige begrænsninger muliggjort af ulimit er dokumenteret i filen limits.conf .

Linux Andre processtyringsværktøjer

Ud over de tidligere diskuterede værktøjer kan en systemadministrator muligvis også:

a) Modificer udførelsesprioriteten (brug af systemressourcer) af en proces ved hjælp af tvivl. Dette betyder, at kernen vil allokere mere eller mindre systemressourcer til processen baseret på den tildelte prioritet (et tal, der almindeligvis er kendt som "pænhed" i et interval fra -20 til 19 ).

Jo lavere værdi, jo større er eksekveringsprioriteten. Almindelige brugere (bortset fra root) kan kun ændre de processer, de ejer, til en højere værdi (hvilket betyder en lavere eksekveringsprioritet), mens root kan ændre denne værdi til enhver proces og kan øge eller formindske den.

Den grundlæggende syntaks for renice er som følger:

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

Hvis argumentet efter den nye prioritetsværdi ikke er til stede (tomt), er det som standard indstillet til PID. I så fald er nøjagtigheden af processen med PID = identifikator indstillet til .

b) Afbryd den normale udførelse af en proces, når det er nødvendigt. Dette kaldes almindeligvis "at dræbe" processen. Under emhætten betyder det at sende processen et signal for at afslutte udførelsen korrekt og frigive brugte ressourcer på en ordnet måde.

For at dræbe en proces skal du bruge kill-kommandoen som følger:

# kill PID

Alternativt kan du bruge pkill til at afslutte alle processer for en given ejer (-u) eller en gruppeejer (-G) eller endda de processer, der har en PPID til fælles (-P) . Disse muligheder kan efterfølges af den numeriske repræsentation eller det aktuelle navn som identifikator:

# pkill [options] identifier

For eksempel,

# pkill -G 1000

vil dræbe alle processer, der ejes af en gruppe med GID = 1000.

Og,

# pkill -P 4993 

vil dræbe alle processer, hvis PPID er 4993.

Før du kører en pkill, er det en god ide at teste resultaterne med pgrep først, måske også ved hjælp af indstillingen -l til at angive processernes navne. Det tager de samme muligheder, men returnerer kun PID'erne for processer (uden yderligere handling), der ville blive dræbt, hvis pkill bruges.

# pgrep -l -u gacanepa

Dette illustreres i det næste billede:

Resumé

I denne artikel har vi undersøgt et par måder til at overvåge ressourceforbrug for at kontrollere integriteten og tilgængeligheden af vigtige hardware- og softwarekomponenter i et Linux-system.

Vi har også lært, hvordan man træffer passende handlinger (enten ved at justere udførelsesprioriteten for en given proces eller ved at afslutte den) under usædvanlige omstændigheder.

Vi håber, at de begreber, der er forklaret i denne vejledning, har været nyttige. Hvis du har spørgsmål eller kommentarer, er du velkommen til at kontakte os ved hjælp af nedenstående kontaktformular.