De Gebruikelijke Verdachten: iostat, vmstat en dstat

Laten we beginnen met de heilige drie-eenheid van prestatiemonitoring tools:

1. iostat: De I/O Detective

Wanneer schijf I/O je hoofdpijn bezorgt, is iostat je aspirine. Deze handige tool geeft je een momentopname van CPU-gebruik en I/O-statistieken voor al je apparaten.

$ iostat -xz 1
Linux 5.4.0-42-generic (mijnserver)     15/06/2023     _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.43    0.00    1.22    0.31    0.00   96.04

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.35    2.13     14.44     34.96     0.00     0.57   0.00  21.05    0.57    2.50   0.01    41.54    16.43   0.40   0.10

Wat vertelt dit ons? Nou, we hebben hier een behoorlijk inactief systeem. De CPU verveelt zich 96% van de tijd, en onze schijf (sda) doet nauwelijks iets met slechts 0.10% gebruik.

2. vmstat: De Geheugen Maestro

vmstat is je venster naar de ziel van het geheugen van je systeem. Het laat je alles zien, van de lengte van de wachtrij tot het gebruik van swap.

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 6981496 191268 724132    0    0     3     5   36   79  2  1 97  0  0
 0  0      0 6981496 191268 724132    0    0     0     0  209  355  1  0 99  0  0

Kijk naar die free kolom - we hebben ongeveer 7GB aan vrij geheugen. Geen wonder dat ons systeem zo relaxed is!

3. dstat: De Alleskunner

Als iostat en vmstat een kind zouden krijgen, zou het dstat zijn. Deze veelzijdige tool combineert CPU, schijf, netwerk, paging en systeemstatistieken in één kleurrijke output.

$ dstat -cdngy
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw 
  2   1  97   0   0|  14k   40k|   0     0 |   0     0 | 237   420 
  1   0  99   0   0|   0     0 |  66B  722B|   0     0 | 206   357 
  1   0  99   0   0|   0     0 |  60B  722B|   0     0 | 208   355 

Dat noem ik een alles-in-één oplossing voor systeemstatistieken!

Dieper Graven: De Onbezongen Helden

Maar wacht, er is meer! Laten we enkele minder bekende maar even krachtige tools verkennen:

4. sar: De Tijdreiziger

sar (System Activity Reporter) is als een tijdmachine voor je systeemstatistieken. Het kan je historische data laten zien en zelfs mooie grafieken genereren.

$ sar -u 1 3
Linux 5.4.0-42-generic (mijnserver)     15/06/2023     _x86_64_    (4 CPU)

13:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
13:00:02        all      2.01      0.00      0.75      0.25      0.00     96.98
13:00:03        all      1.75      0.00      0.75      0.00      0.00     97.49
13:00:04        all      1.75      0.00      0.75      0.25      0.00     97.24
Average:        all      1.84      0.00      0.75      0.17      0.00     97.24

Pro tip: Gebruik sar -A om ALLE statistieken te zien. Maar wees gewaarschuwd, het is als drinken uit een brandweerslang!

5. perf: De Profiling Krachtpatser

Wanneer je dieper moet graven, is perf je uitrusting. Het kan CPU-gebruik profileren, systeemoproepen traceren en zelfs cache-missers analyseren.

$ sudo perf top
Samples: 42K of event 'cpu-clock', 4000 Hz, Event count (approx.): 5250000000 lost: 0/0 drop: 0/0
Overhead  Shared Object                    Symbol
   7.89%  [kernel]                         [k] _raw_spin_unlock_irqrestore
   4.32%  [kernel]                         [k] finish_task_switch
   3.21%  [kernel]                         [k] __schedule
   2.96%  [kernel]                         [k] schedule

Kijk eens aan! De _raw_spin_unlock_irqrestore functie van de kernel gebruikt bijna 8% van onze CPU. Misschien tijd om in de kernelcode te duiken?

Het Plot Dikt: Prestaties Visualiseren

Soms zegt een afbeelding meer dan duizend strace outputs. Maak kennis met deze grafische tools:

6. htop: De Interactieve Procesviewer

Denk aan top met extra's. htop geeft je een kleurrijk, interactief overzicht van je processen.

htop screenshot
htop in actie: Een feest voor de ogen en een buffet voor de hersenen.

7. atop: De Systeem- en Procesmonitor

atop is als de overijverige neef van top. Het toont systeemcounters en per-proces statistieken in één overzicht.

$ atop
ATOP - mijnserver                        2023/06/15  13:15:23                        ------------------------------
PRC | sys    1.85s | user   3.70s | #proc    213 | #zombie    0 | #exit      0 |
CPU | sys       2% | user      4% | irq       0% | idle    94% | wait      0% |
CPL | avg1    0.02 | avg5    0.05 | avg15   0.05 | csw    53592 | intr   43357 |
MEM | tot    15.5G | free    6.8G | cache 724.7M | buff  191.3M | slab  409.8M |
SWP | tot    15.9G | free   15.9G |              | vmcom   4.7G | vmlim  23.7G |
DSK |          sda | busy      0% | read     131 | write    644 | avio 2.50 ms |
NET | transport    | tcpi      37 | tcpo      36 | udpi       0 | udpo       0 |
NET | network      | ipi       37 | ipo       36 | ipfrw      0 | deliv     37 |
NET | eth0    ---- | pcki      19 | pcko      18 | si    1 Kbps | so    1 Kbps |

  PID SYSCPU USRCPU   VGROW  RGROW  RDDSK  WRDSK  ST EXC  S  CPU CMD       1/600
 1829  0.37s  0.73s      0K     0K     0K     0K  --   -  R   1% atop
    1  0.02s  0.03s      0K     0K     0K     0K  --   -  S   0% systemd

Dat noem ik een informatie-overload!

Het Geheime Ingrediënt: Aangepaste Monitoring Scripts

Soms zijn standaardtools niet genoeg. Dan is het tijd om je mouwen op te stropen en je eigen monitoringscripts te schrijven. Hier is een eenvoudig voorbeeld dat iostat en vmstat gegevens combineert:


#!/usr/bin/env python3

import subprocess
import time

def get_iostat():
    output = subprocess.check_output("iostat -c 1 1 | tail -n 2 | head -n 1", shell=True).decode()
    cpu_stats = output.split()
    return float(cpu_stats[5])  # %idle

def get_vmstat():
    output = subprocess.check_output("vmstat 1 2 | tail -n 1", shell=True).decode()
    stats = output.split()
    return int(stats[3])  # free memory

while True:
    cpu_idle = get_iostat()
    free_mem = get_vmstat()
    print(f"CPU Idle: {cpu_idle}%, Free Memory: {free_mem}K")
    time.sleep(5)

Voer dit script uit, en je hebt je eigen mini-monitoringsysteem!

De Les: Word de Sherlock Holmes van Systeemprestaties

Het monitoren van Linux-systemen op laag niveau is als een detective zijn in een cyberpunk roman. Je hebt je tools (iostat, vmstat, dstat), je vergrootglas (perf), en je Watson (aangepaste scripts). De sleutel is te weten welke tool je wanneer moet gebruiken en hoe je de resultaten moet interpreteren.

Onthoud:

  • Begin met de basis (iostat, vmstat, dstat) voor een snel overzicht
  • Duik dieper met gespecialiseerde tools zoals perf indien nodig
  • Visualiseer data met htop en atop voor een ander perspectief
  • Wees niet bang om aangepaste scripts te schrijven voor je specifieke behoeften

En het allerbelangrijkste, oefen, oefen, oefen! Hoe meer systemen je monitort, hoe beter je wordt in het opsporen van afwijkingen en het oplossen van prestatiepuzzels.

Stof tot Nadenken

"De meest effectieve debugtool is nog steeds zorgvuldig nadenken, gecombineerd met strategisch geplaatste printstatements." — Brian Kernighan

Hoewel we al deze geavanceerde tools tot onze beschikking hebben, is soms de beste aanpak om een stap terug te doen, kritisch na te denken over het probleem en misschien een paar strategische echo statements toe te voegen. Laat de tools je probleemoplossende vaardigheden niet overschaduwen!

Wat Nu?

Nu je gewapend bent met deze kennis, waarom zou je geen testomgeving opzetten en beginnen met experimenteren? Probeer verschillende belastingscenario's te simuleren en kijk hoe deze tools reageren. Of beter nog, pas deze technieken toe op een echt probleem waar je mee te maken hebt. De proef van de pudding is immers in het eten!

Veel plezier met monitoren, en moge je systemen altijd goed presteren!