Zoeken op website

LFCS: Bewaak het resourcegebruik van Linux-processen en stel proceslimieten in per gebruiker - Deel 14


Vanwege recente wijzigingen in de doelstellingen van het LFCS-certificeringsexamen, die van kracht zijn vanaf 2 februari 2016, voegen we de benodigde artikelen toe aan de LFCS-serie die hier wordt gepubliceerd. Ter voorbereiding op dit examen wordt u sterk aangemoedigd om ook de LFCE-serie te doorlopen.

Elke Linux-systeembeheerder moet weten hoe hij de integriteit en beschikbaarheid van hardware, bronnen en sleutelprocessen moet verifiëren. Bovendien moet het instellen van resourcelimieten per gebruiker ook deel uitmaken van zijn/haar vaardigheden.

In dit artikel zullen we een aantal manieren onderzoeken om ervoor te zorgen dat zowel de hardware als de software van het systeem zich correct gedragen om potentiële problemen te voorkomen die onverwachte productie-uitval en geldverlies kunnen veroorzaken.

Statistieken van Linux-rapportageprocessors

Met mpstat kunt u de activiteiten voor elke processor afzonderlijk of voor het systeem als geheel bekijken, zowel als eenmalige momentopname of dynamisch.

Om deze tool te gebruiken, moet u sysstat installeren:

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]

Lees meer over sysstat en zijn hulpprogramma's op Leer Sysstat en zijn hulpprogramma's mpstat, pidstat, iostat en sar in Linux

Zodra u mpstat heeft geïnstalleerd, kunt u het gebruiken om rapporten met processorstatistieken te genereren.

Om 3 globale rapporten van CPU-gebruik (-u) voor alle CPU's weer te geven (zoals aangegeven door -P ALL) met een interval van 2 seconden , Doen:

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

Om dezelfde statistieken voor een specifieke CPU (CPU 0 in het volgende voorbeeld) te bekijken, gebruikt u:

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

De uitvoer van de bovenstaande opdrachten toont deze kolommen:

  1. CPU: Processornummer als geheel getal, of het woord all als gemiddelde voor alle processors.
  2. %usr: percentage van CPU-gebruik tijdens het uitvoeren van applicaties op gebruikersniveau.
  3. %nice: Hetzelfde als %usr, maar met nice-prioriteit.
  4. %sys: percentage CPU-gebruik dat plaatsvond tijdens het uitvoeren van kerneltoepassingen. Dit omvat niet de tijd die wordt besteed aan het omgaan met interrupts of het omgaan met hardware.
  5. %iowait: percentage van de tijd waarin de gegeven CPU (of alles) inactief was, gedurende welke er een resource-intensieve I/O-bewerking op die CPU was gepland. Een uitgebreidere uitleg (met voorbeelden) vindt u hier.
  6. %irq: percentage van de tijd besteed aan het onderhouden van hardware-interrupts.
  7. %soft: Hetzelfde als %irq, maar met software-interrupts.
  8. %steal: percentage van de tijd besteed aan onvrijwillig wachten (stelen of gestolen tijd) wanneer een virtuele machine, als gast, de aandacht van de hypervisor ‘wint’ terwijl hij strijdt om de CPU(s). Deze waarde moet zo klein mogelijk gehouden worden. Een hoge waarde in dit veld betekent dat de virtuele machine vastloopt – of dat binnenkort zal doen.
  9. %guest: percentage van de tijd besteed aan het draaien van een virtuele processor.
  10. %idle: percentage van de tijd waarin CPU('s) geen taken uitvoerden. Als u in deze kolom een lage waarde waarneemt, is dat een indicatie dat het systeem zwaar wordt belast. In dat geval moet u de proceslijst nader bekijken, zoals we zo meteen zullen bespreken, om te bepalen wat de oorzaak is.

Om de processor enigszins zwaar te belasten, voert u de volgende opdrachten uit en voert u vervolgens mpstat uit (zoals aangegeven) in een aparte 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

Vergelijk ten slotte met de uitvoer van mpstat onder “normale” omstandigheden:

Zoals je in de afbeelding hierboven kunt zien, werd CPU 0 zwaar belast tijdens de eerste twee voorbeelden, zoals aangegeven door de kolom %idle.

In de volgende sectie bespreken we hoe we deze processen die veel hulpbronnen vergen, kunnen identificeren, hoe we er meer informatie over kunnen verkrijgen en hoe we passende actie kunnen ondernemen.

Rapporteren van Linux-processen

Om processen weer te geven, gesorteerd op CPU-gebruik, gebruiken we het bekende ps commando met de -eo (om alle processen met een door de gebruiker gedefinieerd formaat te selecteren) en --sort (om een aangepaste sorteervolgorde op te geven), zoals:

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

De bovenstaande opdracht toont alleen de PID, PPID, de opdracht die aan het proces is gekoppeld en het percentage CPU- en RAM-gebruik, gesorteerd op het percentage CPU-gebruik in aflopende volgorde . Wanneer uitgevoerd tijdens het maken van het .iso bestand, zijn hier de eerste paar regels van de uitvoer:

Zodra we een interessant proces hebben geïdentificeerd (zoals het proces met PID=2822), kunnen we navigeren naar /proc/PID (/proc/2822 in dit geval) en maak een directorylijst.

In deze map worden verschillende bestanden en submappen met gedetailleerde informatie over dit specifieke proces bewaard terwijl het wordt uitgevoerd.

Bijvoorbeeld:
  1. /proc/2822/io bevat IO-statistieken voor het proces (onder andere het aantal tekens en bytes dat wordt gelezen en geschreven tijdens IO-bewerkingen).
  2. /proc/2822/attr/current toont de huidige SELinux beveiligingsattributen van het proces.
  3. /proc/2822/cgroup beschrijft de controlegroepen (afgekort cgroups) waartoe het proces behoort als de kernelconfiguratie-optie CONFIG_CGROUPS is ingeschakeld, wat je kunt verifiëren met:
cat /boot/config-$(uname -r) | grep -i cgroups

Als de optie is ingeschakeld, zou u het volgende moeten zien:

CONFIG_CGROUPS=y

Met behulp van cgroups kunt u de hoeveelheid toegestane brongebruik per proces beheren, zoals uitgelegd in de hoofdstukken 1 tot en met 4 van de Red Hat Enterprise Linux 7 Resource Management-handleiding, in hoofdstuk 9 van de openSUSE Systeemanalyse en Tuning-gids, en in het gedeelte Controlegroepen van de Ubuntu 14.04 Server-documentatie.

De /proc/2822/fd is een directory die één symbolische link bevat voor elke bestandsdescriptor die het proces heeft geopend. De volgende afbeelding toont deze informatie voor het proces dat in tty1 (de eerste terminal) is gestart om de .iso-afbeelding te maken:

De bovenstaande afbeelding laat zien dat stdin (bestandsdescriptor 0), stdout (bestandsdescriptor 1) en stderr (bestandsdescriptor 2) worden toegewezen aan /dev/zero, /root/test.iso en /dev/tty1, respectievelijk.

Meer informatie over /proc kan worden gevonden in het document “The /proc filesystem” dat wordt bijgehouden en onderhouden door Kernel.org, en in de Linux Programmer’s Manual.

Resourcelimieten per gebruiker instellen in Linux

Als u niet voorzichtig bent en elke gebruiker een onbeperkt aantal processen laat uitvoeren, kunt u uiteindelijk te maken krijgen met een onverwachte afsluiting van het systeem of wordt u buitengesloten als het systeem in een onbruikbare toestand terechtkomt. Om dit te voorkomen, moet u een limiet stellen aan het aantal processen dat gebruikers kunnen starten.

Om dit te doen, bewerkt u /etc/security/limits.conf en voegt u de volgende regel toe onderaan het bestand om de limiet in te stellen:

*   	hard	nproc   10

Het eerste veld kan worden gebruikt om een gebruiker, een groep of allemaal (*) aan te geven, terwijl het tweede veld een harde limiet oplegt aan het aantal processen (nproc) tot 10. Om wijzigingen door te voeren is uit- en weer inloggen voldoende.

Laten we dus eens kijken wat er gebeurt als een bepaalde gebruiker, anders dan root (al dan niet legitiem), probeert een granaatvorkbom te starten. Als we geen limieten hadden geïmplementeerd, zou dit in eerste instantie twee exemplaren van een functie starten en deze vervolgens in een eindeloze lus dupliceren. Het zou dus uiteindelijk uw systeem in de war brengen.

Als de bovenstaande beperking echter van kracht is, slaagt de vorkbom niet, maar wordt de gebruiker nog steeds buitengesloten totdat de systeembeheerder het bijbehorende proces beëindigt:

TIP: Andere mogelijke beperkingen die mogelijk worden gemaakt door ulimit zijn gedocumenteerd in het bestand limits.conf.

Linux Andere procesbeheertools

Naast de eerder besproken tools kan een systeembeheerder ook het volgende nodig hebben:

a) Wijzig de uitvoeringsprioriteit (gebruik van systeembronnen) van een proces met behulp van renice. Dit betekent dat de kernel meer of minder systeembronnen aan het proces zal toewijzen op basis van de toegewezen prioriteit (een getal dat algemeen bekend staat als “niceness ” in een bereik van -20 tot 19).

Hoe lager de waarde, hoe groter de uitvoeringsprioriteit. Gewone gebruikers (anders dan root) kunnen de kwaliteit van processen waarvan zij eigenaar zijn alleen wijzigen naar een hogere waarde (wat betekent een lagere uitvoeringsprioriteit), terwijl root deze waarde voor elk proces kan wijzigen en deze kan verhogen of verlagen.

De basissyntaxis van renice is als volgt:

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

Als het argument na de nieuwe prioriteitswaarde niet aanwezig is (leeg), wordt het standaard ingesteld op PID. In dat geval wordt het proces met PID=identifier ingesteld op .

b) Onderbreek de normale uitvoering van een proces wanneer dat nodig is. Dit staat algemeen bekend als het “doden” van het proces. Onder de motorkap betekent dit dat het proces een signaal wordt gestuurd om de uitvoering ervan correct af te ronden en alle gebruikte bronnen op een ordelijke manier vrij te geven.

Om een proces te beëindigen, gebruikt u het kill commando als volgt:

kill PID

Als alternatief kunt u pkill gebruiken om alle processen van een bepaalde eigenaar (-u), of een groepseigenaar (-G), of zelfs die processen die een PPID hebben, te beëindigen gemeenschappelijk (-P). Deze opties kunnen worden gevolgd door de numerieke weergave of de daadwerkelijke naam als identificatie:

pkill [options] identifier

Bijvoorbeeld,

pkill -G 1000

zal alle processen beëindigen die eigendom zijn van een groep met GID=1000.

En,

pkill -P 4993 

zal alle processen beëindigen waarvan de PPID 4993 is.

Voordat u een pkill uitvoert, is het een goed idee om eerst de resultaten te testen met pgrep, eventueel ook met behulp van de -l optie om de namen van processen. Het gebruikt dezelfde opties, maar retourneert alleen de PID's van processen (zonder verdere actie te ondernemen) die zouden worden beëindigd als pkill wordt gebruikt.

pgrep -l -u gacanepa

Dit wordt geïllustreerd in de volgende afbeelding:

Samenvatting

In dit artikel hebben we een aantal manieren onderzocht om het gebruik van bronnen te controleren om de integriteit en beschikbaarheid van kritieke hardware- en softwarecomponenten in een Linux-systeem te verifiëren.

We hebben ook geleerd hoe we onder ongebruikelijke omstandigheden passende actie kunnen ondernemen (door de uitvoeringsprioriteit van een bepaald proces aan te passen of door het te beëindigen).

We hopen dat de concepten die in deze tutorial worden uitgelegd nuttig zijn geweest. Heeft u vragen of opmerkingen, neem dan gerust contact met ons op via onderstaand contactformulier.