Articles

Boolean World

Met het commando “Top” kunnen gebruikers het gebruik van processen en systeembronnen onder Linux monitoren. Het is een van de handigste tools in de gereedschapskist van een systeembeheerder, en het is op elke distributie voorgeïnstalleerd. In tegenstelling tot andere commando’s zoals ps, is het interactief, en kunt u door de lijst van processen bladeren, een proces doden, enzovoort.

In dit artikel gaan we begrijpen hoe u het top commando kunt gebruiken.

Aan de slag

Zoals u misschien al geraden had, hoeft u alleen maar dit in te typen om top te starten:

top

Dit start een interactieve opdrachtregeltoepassing op, vergelijkbaar met die in de schermafbeelding hieronder. De bovenste helft van de uitvoer bevat statistieken over processen en het gebruik van hulpbronnen, terwijl de onderste helft een lijst bevat van de momenteel draaiende processen. U kunt de pijltjestoetsen en de Page Up/Down-toetsen gebruiken om door de lijst te bladeren. Als u wilt afsluiten, drukt u gewoon op “q”.

Er zijn een aantal varianten van top, maar in de rest van dit artikel zullen we het hebben over de meest voorkomende variant – de variant die wordt geleverd met het “procps-ng” pakket. U kunt dit controleren door te draaien:

top -v

Als u deze variant hebt, zal dit in de uitvoer te zien zijn, zoals dit:

procps-ng version 3.3.10

Er gebeurt nogal wat in de interface van top, dus we zullen het in de volgende sectie stukje voor stukje uitsplitsen.

Inzicht in de interface van top: het samenvattingsgebied

Zoals we eerder hebben gezien, is de uitvoer van top verdeeld in twee verschillende secties. In dit deel van het artikel gaan we ons richten op de elementen in de helft van de uitvoer. Dit gebied wordt ook wel het “samenvattingsgebied” genoemd.

Systeemtijd, uptime en gebruikerssessies

In de linkerbovenhoek van het scherm (zoals aangegeven in de schermafbeelding hierboven), geeft top de huidige tijd weer. Dit wordt gevolgd door de uptime van het systeem, die ons vertelt hoe lang het systeem al draait. In ons voorbeeld is de huidige tijd bijvoorbeeld “15:39:37”, en draait het systeem al 90 dagen, 15 uur en 26 minuten.

Daarna komt het aantal actieve gebruikerssessies. In dit voorbeeld zijn er twee actieve gebruikerssessies. Deze sessies kunnen worden gemaakt op een TTY (fysiek op het systeem, via de opdrachtregel of een desktop-omgeving) of een PTY (zoals een terminal emulator-venster of via SSH). In feite, als je inlogt op een Linux systeem via een desktop omgeving, en dan een terminal emulator start, zul je zien dat er twee actieve sessies zijn.

Als je meer details wilt krijgen over de actieve gebruikerssessies, gebruik dan het who commando.

Geheugengebruik

De sectie “geheugen” toont informatie over het geheugengebruik van het systeem. De regels gemarkeerd met “Mem” en “Swap” tonen informatie over respectievelijk RAM en swap space. Simpel gezegd, een swap space is een deel van de harde schijf dat wordt gebruikt als RAM. Wanneer het RAM-geheugen bijna vol is, worden weinig gebruikte delen van het RAM-geheugen weggeschreven naar de wisselruimte, klaar om later te worden opgehaald als dat nodig is. Maar omdat het benaderen van schijven langzaam is, kan te veel vertrouwen op swapping de systeemprestaties schaden.

Zoals je natuurlijk zou verwachten, hebben de “total”, “free” en “used” waarden hun gebruikelijke betekenissen. De waarde “avail mem” is de hoeveelheid geheugen die aan processen kan worden toegewezen zonder dat er nog meer wordt geswapt.

De Linux-kernel probeert ook de toegangstijd tot schijven op verschillende manieren te verkorten. Het onderhoudt een “disk cache” in RAM, waar vaak gebruikte regio’s van de schijf worden opgeslagen. Daarnaast worden schijf-schrijfbewerkingen opgeslagen in een “schijf-buffer”, en de kernel schrijft ze uiteindelijk weg naar de schijf. Het totale geheugen dat hierdoor wordt gebruikt is de “buff/cache” waarde. Het klinkt misschien als een slechte zaak, maar dat is het niet – geheugen dat door de cache wordt gebruikt, wordt aan processen toegewezen als dat nodig is.

Taken

De sectie “Taken” toont statistieken met betrekking tot de processen die op uw systeem draaien. De waarde “totaal” is simpelweg het totale aantal processen. In de bovenstaande schermafbeelding zijn er bijvoorbeeld 27 processen actief. Om de rest van de waarden te begrijpen, hebben we een beetje achtergrond nodig over hoe de Linux kernel met processen omgaat.

Processen voeren een mix van I/O-gebonden werk (zoals het lezen van schijven) en CPU-gebonden werk (zoals het uitvoeren van rekenkundige bewerkingen) uit. De CPU is inactief als een proces I/O uitvoert, dus het besturingssysteem schakelt in die tijd over op het uitvoeren van andere processen. Bovendien laat het OS een bepaald proces een zeer korte tijd uitvoeren, waarna het overschakelt op een ander proces. Dit is hoe OS’en lijken te “multitasken”. Om dit alles te doen moeten we de “toestand” van een proces bijhouden. In Linux kan een proces in een van de volgende toestanden verkeren:

  • Runnable (R): Een proces in deze toestand is ofwel aan het uitvoeren op de CPU, of het is aanwezig op de run queue, klaar om uitgevoerd te worden.
  • Interruptible sleep (S): Processen in deze toestand wachten op een gebeurtenis om te voltooien.
  • Ononderbreekbare slaap (D): In dit geval wacht een proces op de voltooiing van een I/O-bewerking.
  • Stopped (T): Deze processen zijn gestopt door een opdrachtbesturingssignaal (zoals door op Ctrl+Z te drukken) of omdat ze worden getraceerd.
  • Zombie (Z): De kernel onderhoudt verschillende gegevensstructuren in het geheugen om processen bij te houden. Een proces kan een aantal kind-processen creëren, en deze kunnen worden afgesloten terwijl de ouder nog aanwezig is. Deze gegevensstructuren moeten echter in de buurt blijven totdat de ouder de status van de kindprocessen heeft verkregen. Zulke beëindigde processen waarvan de gegevensstructuren nog aanwezig zijn worden zombies genoemd.

Processen in de D en S toestanden worden getoond als “slapend”, en die in de T toestand worden getoond als “gestopt”. Het aantal zombies wordt weergegeven als de “zombie”-waarde.

CPU-gebruik

Het gedeelte CPU-gebruik toont het percentage van de CPU-tijd dat aan verschillende taken wordt besteed. De us waarde is de tijd die de CPU besteedt aan het uitvoeren van processen in userspace. De sy waarde is de tijd die wordt besteed aan het uitvoeren van kernelspace processen.

Linux gebruikt een “nice” waarde om de prioriteit van een proces te bepalen. Een proces met een hoge “nice” waarde is “aardiger” voor andere processen, en krijgt een lage prioriteit. Op dezelfde manier krijgen processen met een lagere “nice” een hogere prioriteit. Zoals we later zullen zien, kan de standaard “nice” waarde veranderd worden. De tijd die wordt besteed aan het uitvoeren van processen met een handmatig ingestelde “nice” verschijnt als de ni waarde.

Dit wordt gevolgd door id, dat is de tijd dat de CPU inactief blijft. De meeste besturingssystemen zetten de CPU in een energiebesparende stand als hij inactief is. Daarna komt de wa waarde, dat is de tijd die de CPU besteedt aan het wachten op I/O om te voltooien.

Interrupts zijn signalen aan de processor over een gebeurtenis die onmiddellijke aandacht vereist. Hardware interrupts worden meestal gebruikt door randapparatuur om het systeem te informeren over gebeurtenissen, zoals een toetsaanslag op een toetsenbord. Software interrupts worden daarentegen gegenereerd door specifieke instructies die op de processor worden uitgevoerd. In beide gevallen handelt het OS ze af, en de tijd die wordt besteed aan het afhandelen van hardware- en software-interrupts wordt gegeven door respectievelijk hi en si.

In een gevirtualiseerde omgeving wordt een deel van de CPU-resources aan elke virtuele machine (VM) gegeven. Het besturingssysteem detecteert wanneer het werk te doen heeft, maar kan dit niet uitvoeren omdat de CPU bezig is met een andere VM. De hoeveelheid tijd die op deze manier verloren gaat, is de “steel”-tijd, weergegeven als st.

Load average

De sectie load average geeft de gemiddelde “load” weer over één, vijf en vijftien minuten. “Belasting” is een maatstaf voor de hoeveelheid rekenwerk die een systeem verricht. Bij Linux is de belasting het aantal processen in de R- en D-status op een bepaald moment. De “load average” waarde geeft je een relatieve maatstaf voor hoe lang je moet wachten tot dingen klaar zijn.

Laten we een paar voorbeelden bekijken om dit concept te begrijpen. Op een systeem met één core betekent een belastingsgemiddelde van 0,4 dat het systeem slechts 40% van het werk doet dat het kan doen. Een belastingsgemiddelde van 1 betekent dat het systeem precies op capaciteit zit – het systeem zal worden overbelast door zelfs maar een klein beetje extra werk toe te voegen. Een systeem met een belastingsgemiddelde van 2,12 betekent dat het wordt overbelast door 112% meer werk dan het aankan.

Op een multi-core systeem moet u eerst het belastingsgemiddelde delen door het aantal CPU-kernen om een vergelijkbare maatstaf te krijgen.

Bovendien is “belastingsgemiddelde” eigenlijk niet het typische “gemiddelde” dat de meesten van ons kennen. Het is een “exponentieel voortschrijdend gemiddelde”, wat betekent dat een klein deel van de vorige belastingsgemiddelden wordt verdisconteerd in de huidige waarde. Als u geïnteresseerd bent, vindt u in dit artikel alle technische details.

Inzicht in de interface van Top: het taakgebied

Het overzichtsgebied is relatief eenvoudiger, en het bevat een lijst met processen. In dit gedeelte leren we meer over de verschillende kolommen die in de standaarduitvoer van top worden weergegeven.

  • PID

Dit is de proces-ID, een uniek positief geheel getal dat een proces identificeert.

  • USER

Dit is de “effectieve” gebruikersnaam (die overeenkomt met een gebruikers-ID) van de gebruiker die het proces heeft gestart. Linux kent een echte gebruikers-ID en een effectieve gebruikers-ID toe aan processen; de laatste staat een proces toe om namens een andere gebruiker te handelen. (Een niet-root gebruiker kan zich bijvoorbeeld tot root verheffen om een pakket te installeren.)

  • PR en NI

Het “NI” veld toont de “nice” waarde van een proces. Het “PR” veld toont de scheduling prioriteit van het proces vanuit het perspectief van de kernel. De “nice”-waarde is van invloed op de prioriteit van een proces.

  • VIRT, RES, SHR en %MEM

Deze drie velden zijn gerelateerd aan het geheugengebruik van de processen. “VIRT” is de totale hoeveelheid geheugen die door een proces wordt gebruikt. Dit omvat de code van het programma, de gegevens die door het proces in het geheugen zijn opgeslagen, alsmede de geheugengebieden die naar de schijf zijn geswapt. “RES” is het geheugen dat door het proces in RAM wordt gebruikt, en “%MEM” drukt deze waarde uit als een percentage van het totale beschikbare RAM-geheugen. Tenslotte is “SHR” de hoeveelheid geheugen die met andere processen wordt gedeeld.

  • S

Zoals we eerder hebben gezien, kan een proces zich in verschillende toestanden bevinden. Dit veld toont de status van het proces in de vorm van één letter.

  • TIME+

Dit is de totale CPU-tijd die door het proces is gebruikt sinds het is gestart, tot op honderdsten van seconden nauwkeurig.

  • COMMAND

In de kolom COMMAND staat de naam van de processen.

Top commando gebruiksvoorbeelden

Top heeft tot nu toe de interface van top besproken. Het kan echter ook processen beheren, en u kunt verschillende aspecten van de uitvoer van top controleren. In dit gedeelte gaan we een paar voorbeelden bekijken.

In de meeste van de onderstaande voorbeelden moet u een toets indrukken terwijl top draait. Houd in gedachten dat deze toetsaanslagen hoofdlettergevoelig zijn – dus als u op “k” drukt terwijl Caps Lock aan staat, heeft u eigenlijk een “K” ingedrukt, en zal het commando niet werken, of iets heel anders doen.

Processen doden

Als u een proces wilt doden, drukt u gewoon op ‘k’ terwijl top draait. Er verschijnt dan een prompt, die vraagt om het proces-ID van het proces en druk op enter.

Volgende voert u het signaal in waarmee het proces moet worden gedood. Als u dit leeg laat, gebruikt top een SIGTERM, waarmee processen op een nette manier kunnen worden beëindigd. Als u een proces geforceerd wilt doden, kunt u hier SIGKILL typen. Je kunt hier ook het signaalnummer invoeren. Bijvoorbeeld, het nummer voor SIGTERM is 15 en SIGKILL is 9.

Als je het proces ID leeg laat en direct op enter drukt, zal het bovenste proces in de lijst worden beëindigd. Zoals we al eerder zeiden, kunt u scrollen met de pijltjestoetsen, en het proces dat u wilt doden op deze manier wijzigen.

Sorteren van de proceslijst

Een van de meest voorkomende redenen om een tool als top te gebruiken is om uit te vinden welk proces de meeste bronnen verbruikt. U kunt op de volgende toetsen drukken om de lijst te sorteren:

  • ‘M’ om op geheugengebruik te sorteren
  • ‘P’ om op CPU-gebruik te sorteren
  • ‘N’ om op proces-ID te sorteren
  • ‘T’ om op de looptijd te sorteren

Top toont standaard alle resultaten in aflopende volgorde. U kunt echter omschakelen naar oplopende volgorde door op ‘R’ te drukken.

U kunt de lijst ook sorteren met de -o schakelaar. Als u bijvoorbeeld processen op CPU-gebruik wilt sorteren, kunt u dat doen met:

top -o %CPU

U kunt de lijst op dezelfde manier sorteren op elk van de attributen in het overzichtsgebied.

Een lijst van threads in plaats van processen laten zien

We hebben al eerder besproken hoe Linux tussen processen schakelt. Helaas delen processen geen geheugen of andere bronnen, waardoor zulke omschakelingen nogal traag verlopen. Linux, net als veel andere besturingssystemen, ondersteunt een “lichtgewicht” alternatief, genaamd een “thread”. Ze maken deel uit van een proces en delen bepaalde delen van het geheugen en andere bronnen, maar ze kunnen gelijktijdig worden uitgevoerd zoals processen.

Top toont standaard een lijst van processen in zijn uitvoer. Als u in plaats daarvan een lijst van threads wilt zien, druk dan op ‘H’ terwijl top draait.

Het is u misschien opgevallen dat geen van de attributen in de proceslijst is gewijzigd. Hoe is dat mogelijk, aangezien processen verschillen van threads? In de Linux-kernel worden threads en processen met dezelfde gegevensstructuren afgehandeld. Elke thread heeft dus zijn eigen ID, status, enzovoort.

Als je terug wilt naar de procesweergave, druk je weer op ‘H’. Bovendien kunt u de -H switch gebruiken om standaard threads weer te geven.

top -H

Tonen van volledige paden

Top toont standaard niet het volledige pad naar het programma, of maakt onderscheid tussen kernelspace processen en userspace processen. Als u deze informatie nodig heeft, druk dan op ‘c’ terwijl top draait. Druk nogmaals op ‘c’ om terug te gaan naar de standaardinstellingen.

Kernelspace-processen worden aangeduid met vierkante haken er omheen. In de bovenstaande schermafbeelding zijn er bijvoorbeeld twee kernelprocessen, kthreadd en khelper. Op de meeste Linux-installaties zullen dat er nog een paar meer zijn.

Aternatief kunt u ook top starten met het -c argument:

top -c

Forest view

Soms wilt u misschien de child-parent hiërarchie van processen zien. U kunt dit zien met de forest view, door op ‘v’/’V’ te drukken terwijl top draait.

Zoals u kunt zien in de schermafbeelding hierboven, was het systemd proces het eerste dat op het systeem werd opgestart. Het heeft processen gestart zoals sshd, die op zijn beurt weer andere sshd processen heeft aangemaakt, enzovoort.

Lijst processen van een gebruiker

Om processen van een bepaalde gebruiker in een lijst te zetten, drukt u op ‘u’ wanneer top draait. Typ vervolgens de gebruikersnaam in, of laat deze leeg om processen voor alle gebruikers weer te geven.

Als alternatief kunt u het commando top uitvoeren met de -u-schakelaar. In dit voorbeeld hebben we alle processen van de root gebruiker opgesomd.

top -u root

Filteren door processen

Als u veel processen hebt om mee te werken, zal een eenvoudige sortering niet goed genoeg werken. In zo’n situatie kunt u top’s filtering gebruiken om u op een paar processen te concentreren. Om deze modus te activeren, drukt u op ‘o’/’O’. Er verschijnt een prompt in top, en u kunt hier een filterexpressie typen.

Een filterexpressie is een verklaring die een relatie specificeert tussen een attribuut en een waarde. Enkele voorbeelden van filters zijn:

  • COMMAND=getty: Filter processen die “getty” bevatten in het COMMANDO-attribuut.
  • !COMMAND=getty: Filter processen die niet “getty” in het COMMANDO attribuut hebben.
  • %CPU>3.0: Filter processen die een CPU-gebruik hebben van meer dan 3%.

Als je eenmaal een filter hebt toegevoegd, kun je verder snoeien door meer filters toe te voegen.

Het standaard uiterlijk van de CPU- en geheugenstatistieken wijzigen

Als u meestal thuis bent in een GUI-omgeving, vindt u de standaardmanier waarop top CPU- en geheugenstatistieken toont misschien niet prettig. U kunt op ‘t’ en ‘m’ drukken om de stijl van de CPU en geheugen statistieken te veranderen. Hier is een screenshot van top, waar we één keer op ‘t’ en ‘m’ hebben gedrukt.

Als u herhaaldelijk op ‘t’ of ‘m’ drukt, worden er vier verschillende weergaven weergegeven. Bij de eerste twee drukken worden twee verschillende soorten voortgangsbalken getoond. Als u de toets voor de derde keer indrukt, wordt de voortgangsbalk verborgen.

Opslaan van uw instellingen

Als u wijzigingen hebt aangebracht in de uitvoer van top, kunt u die opslaan voor later gebruik door op ‘W’ te drukken. top schrijft zijn configuratie naar het .toprc bestand in uw home directory.

Conclusie

Het top commando is uiterst nuttig voor het monitoren en beheren van processen op een Linux systeem. Dit artikel is slechts een tipje van de sluier, en er is nog heel wat dat we niet hebben behandeld. Er zijn bijvoorbeeld nog veel meer kolommen die u aan top kunt toevoegen. Voor al deze dingen moet u zeker de man pagina bekijken door man top op uw systeem uit te voeren.

Als u dit artikel leuk vond, deel het dan 🙂

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *