...

iotop in de dagelijkse hostingpraktijk: de belasting van harde schijven onder Linux gericht identificeren

Met iotop hosting vind ik binnen enkele seconden het proces dat mijn harde schijven vertraagt en laadtijden, databasequery’s of back-ups vertraagt. Ik gebruik de tool specifiek wanneer er CPU-capaciteit vrij is, maar websites traag reageren en de I/O-wachttijd stijgt.

Centrale punten

  • Echte tijd: Actieve lees- en schrijftoegangen per proces direct bekijken
  • veroorzaker: Bepaal welke dienst de I/O-wachtrij vult
  • Context: Cron-taken, back-ups en logboekregistratie ordenen
  • Combinatie: De situatie in de gaten houden met iostat en vmstat
  • Praktijk: Vondsten overzetten naar onderhoudsvensters en limieten

Waarom ik eerst iotop start als de server traag lijkt te werken

Een trage server met vrije CPU-capaciteit vraagt erom dat je eens kijkt naar de Belasting van de harde schijf. Juist daar blinkt iotop uit, omdat ik per proces kan zien wie er op dat moment aan het lezen of schrijven is. Een enkel logbestand, een import of een indexering kan de responstijden vertragen, zonder dat er sprake is van een hardwarefout. Ik herken dergelijke patronen in realtime en beëindig in geval van twijfel de betreffende taak, voordat gebruikers afhaken. Deze snelle focus bespaart me tijd bij het Eerste diagnose en voorkomt blindvliegen.

Installatie en opstarten: de 30-secondenvariant

De installatie is in een paar stappen voltooid en vereist root-rechten of de benodigde Mogelijkheden. Onder Debian/Ubuntu installeer ik iotop met apt install iotop, onder RHEL/Alma met yum install iotop respectievelijk dnf install iotop. Voor het livebeeld bel ik iotop op, filter met -o alleen actieve processen, en ga verder met -d 1 een kort interval. Voorbeeld: iotop -o -d 1 laat me zien wie er op dit moment remt. Een droge batch-output met -b helpt me bij het meeschrijven in Logboeken.

Snelstartopdrachten die ik onthoud

Ik beslis per situatie welke modus ik nodig heb, en ga daarbij pragmatisch en snel te werk. iotop -o toont alleen werkelijk actieve processen; dat vermindert ruis. iotop -a houdt de totale I/O bij sinds de start en helpt bij langdurige taken. iotop -P vat threads op procesniveau samen, wat het overzicht op Diensten scherpt. iotop -b -qq -d 2 -n 30 schrijf ik in een bestand als ik pieken gedurende een kort tijdsbestek wil vastleggen. Deze kleine schakelaars geven me de nodige Controle, zonder omwegen via ingewikkelde installaties.

De uitdraai begrijpen: kolommen en hun betekenis

Om een goede beslissing te kunnen nemen, heb ik duidelijke criteria nodig: welke waarden zijn kritiek en welke vallen binnen de normale waarden. Bij iotop kijk ik vooral naar de kolommen voor lezen, schrijven en de I/O-percentages. De kolom IO% laat zien hoeveel tijd een proces in de kernel besteedt aan het wachten op I/O. SWAPIN% zou bijna altijd nul moeten blijven; als deze waarde stijgt, raakt het systeem verstopt door Uitbesteding. Met COMMAND zie ik snel welk script of welke dienst erachter zit en of ik moet ingrijpen.

Kolom Wat het laat zien Waar ik op let
PID / GEBRUIKER Proces-ID en gebruiker Wie maakt er gebruik van en op welke manieren? Rechten?
SCHIJF LEZEN / SCHRIJVEN Huidige doorvoer per proces Een constant hoog aantal MB/s gedurende meerdere seconden is verdachte.
SWAPIN% Aandeel van de tijd door swapping Waarden tussen 0 en 1% duiden op druk in de Geheugen daar.
IO% Percentage van de tijd in I/O-wachttoestanden Hoge IO% met lage MB/s = kleine, synchrone Schrijft.
PRIO Prioriteit/Nice-waarde Achtergrondtaken, eventueel met ionice stomen.
COMMAND Oproep incl. pad Snel controleren of het om logrotatie, een back-up of een Importeren is.

Diagnosetraject: eerst iotop, daarna iostat/vmstat controleren

Ik start iotop om te zien wat de oorzaak is en leg de situatie vast met systeemstatistieken. Een hoge IO%-waarde bij een proces betekent voor mij dat juist deze dienst de schijf bezet houdt. Daarna controleer ik met iostat -x 1, of de schijf een hoge belasting vertoont en de latentie toeneemt. Een blik in vmstat 1 laat me zien of het uitbesteden of de run-queue het beeld vertekent. Wie zich hier verder in wil verdiepen, vindt hier een beknopte inleiding over I/O-wachttijd analyseren, wat mij opviel bij het vergelijken van de Metriek helpt.

Typische oorzaken in het dagelijkse hostingwerk en hoe ik ze onder controle houd

Een groeiend logbestand is een klassieker die met veel kleine synchronisatieschrijfacties de I/O-wachtrij vult en de responstijden onder druk zet. Databaseworkloads met ongeschikte indexen veroorzaken onregelmatige patronen en vertragen het systeem door willekeurige Toegang tot. Back-ups tijdens de piekuren zorgen voor pieken die merkbare gevolgen hebben voor andere diensten. Een zoekindexering of een cronjob op het verkeerde moment is al genoeg om verzoeken te vertragen. Ik spreid dergelijke taken, stel zinvolle logniveaus in en laat harde schrijfbewerkingen plaatsvinden in Onderhoudsvenster rennen.

Tijdschema's, cronjobs en logboekregistratie overzichtelijk ordenen

Ik verdeel zware taken over rustige momenten en pas ze aan met behulp van Nice- en Ionice-waarden. Voor back-ups gebruik ik ionice -c2 -n7, zodat interactieve processen voorrang krijgen. Ik pas het logniveau aan als bestanden onnodig snel groeien en het bestandssysteem belasten. Taken die ’s nachts zijn gestart, bekijk ik ’s ochtends even met iotop en vertrouw ik op logbestanden uit de batchmodus. Wie trends in de latentie in de loop van de tijd wil bekijken, kan terecht bij De schijflatentie meten zich te richten op en de Basislijnen vastdraaien.

SSD, NVMe en wachtrijdiepte: waarom doorvoersnelheid alleen niet voldoende is

Een NVMe zorgt voor hoge IOPS-waarden, maar veel kleine synchronisatieschrijfbewerkingen veroorzaken toch haperingen in de respons. Daarom beoordeel ik niet alleen MB/s, maar ook IO% en de typische verzoekgrootte. Wanneer de wachtrijdiepte volledig is benut, stapelen de verzoeken zich op en neemt de latentie merkbaar toe. Dit valt vaak op met iotop, hoewel de ruwe doorvoer er prima uitziet. Wie zich verder in dit onderwerp wil verdiepen, kan kijken naar de Wachtrijdiepte van NVMe en rangschikt de Wachtrijen netjes.

Praktische aanpassingen: kleine aanpassingen met een snel effect

Ik begin met het voor de hand liggende: de cache-hitratio van de database controleren, indexen aanvullen, het write-ahead-log correct configureren. Voor bestanden stel ik zinvolle mount-opties in en let ik op `noatime` als het workloadprofiel daarvoor geschikt is. Ik beoordeel journaling-opties op basis van het risico, zonder de gegevensbeveiliging te verwaarlozen. Voor back-uptools kies ik opties die de voorkeur geven aan grote, sequentiële schrijfbewerkingen. Elk van deze wijzigingen verlaagt de Wrijving en voorkomt knelpunten voordat deze gebruikers raken.

Automatiseren en documenteren: iotop in batchmodus

Voor terugkerende pieken schrijf ik de iotop-uitvoer naar een bestand en analyseer ik deze daarna. Het commando iotop -b -o -qq -d 2 -n 120 > /var/log/iotop.log neemt vier minuten op zonder TUI-frame. Ik combineer dit met een tijdstempelvoorvoegsel of schakel logrotatie in, zodat de bestanden overzichtelijk blijven. Later filter ik op een opvallende procesnaam en controleer ik het tijdvenster. Zo documenteer ik terugkerende Tips en leid daaruit concrete actiepunten af.

Rechten, kernelopties en containers: wat ik van tevoren duidelijk maak

iotop toont alle benodigde details alleen met root-rechten of CAP_SYS_ADMIN, wat ik bewust gebruik voor snelle controles. De kernel moet Taskstats en accounting-functies beschikbaar stellen, wat bij gangbare distributies standaard is ingeschakeld. In containers zie ik vaak alleen processen binnen de namespace, wat het overzicht beperkt. Voor cgroups gebruik ik aanvullende tools die de groep als geheel controleren. Zo is het me duidelijk wat iotop weergeeft en waar ik aanvullende Inzichten nodig hebben.

Fijnzinnig in plaats van grof: IO-Scheduler, ionice en limieten

Met ionice Ik zet achtergrondtaken op een lager niveau en geef interactieve diensten meer ruimte. Op systeemniveau controleer ik of de I/O-scheduler past bij het type werklast, bijvoorbeeld BFQ voor interactieve patronen of MQ-varianten voor NVMe. Rate-limits in back-uptools beschermen de rest van het systeem tegen neveneffecten. Voor schrijfintensieve plug-ins pas ik cachestrategieën toe en ontlast ik de database. Deze stappen kosten weinig tijd, maar leveren merkbare voordelen op Rust in drukke periodes.

Dieper kijken: de natuurlijke beperkingen van iotop

Ik interpreteer iotop altijd in de juiste context. Niet elke hoge IO% betekent daadwerkelijk dat “de schijf vol is”. Buffered Writes komen eerst in de paginacache terecht en worden asynchroon door kernel-threads (bijv. de write-back-worker) doorgestuurd. Vervolgens zie ik in iotop mogelijk onschuldige MB/s bij het proces dat dit veroorzaakt, terwijl een kworker of de journaling-thread de daadwerkelijke belasting verwerkt. Ook versleutelde stacks (dm-crypt/LUKS), op FUSE gebaseerde bestandssystemen of overlay-FS in containers maken de toewijzingen onduidelijk. Als er dus alleen kernel-threads bovenaan staan, bepaal ik aan de hand van COMMAND en het tijdstip welke gebruikerstaak kort daarvoor heeft geschreven en waar de gegevens naartoe gaan.

Bij NFS of gedistribueerde bestandssystemen volstaat het lokale perspectief vaak niet. iotop laat me weliswaar wachttijden zien, maar de oorzaak ligt mogelijk aan de netwerk- of serverzijde. In dergelijke gevallen breng ik de lokale meetpunten in verband met latenties op de opslag of met systeemstatistieken, voordat ik overhaast diensten opnieuw start of limieten instel.

Bestandssystemen en journaalopties in de dagelijkse praktijk

Ik houd rekening met de specifieke kenmerken van het bestandssysteem, omdat deze bepalend zijn voor de iotop-afbeeldingen. Bij ext4 beïnvloeden de journalmodus en het commit-interval hoe “spiky” schrijfbewerkingen overkomen: data=geordend is een goede norm, terugschrijven verhoogt de doorvoer ten koste van de consistentiegaranties en dagboek maakt schrijfbewerkingen consistent, maar ook duurder. XFS schaalt goed bij veel parallelle threads en is geschikt voor grote bestanden en hoge gelijktijdigheid. Btrfs biedt Copy-on-Write, checksums en eventueel compressie – dat helpt bij leesbelasting, maar kan bij veel kleine synchronisatie-schrijfbewerkingen de belasting verhogen.

Ik stel de mount-opties bewust in: noatime of relatime verminderen onnodige schrijfbewerkingen van metagegevens. barrière/geen barrière Ik beoordeel dit uitsluitend vanuit het oogpunt van de veiligheid van de schrijfcache van de hardware. verbinden=-Intervallen bepalen hoe vaak metadata wordt vastgelegd – een hogere waarde vlakt pieken af, maar vergroot de kans op verlies bij crashes. Ik bekijk dergelijke instellingen altijd vanuit het perspectief van risico versus reactietijd en test ze tijdens onderhoudsvensters.

De opslagstack begrijpen: RAID, LVM en caches

Ik kijk niet alleen naar het proces, maar ook naar de onderliggende structuur. Een RAID5/6 bestraft kleine, willekeurige schrijfbewerkingen door middel van Read-Modify-Write, wat in iotop opvalt als een hoge IO% met magere MB/s. Stripe-groottes en uitlijning in LVM beïnvloeden of toegangen mooi aaneengesloten plaatsvinden of gefragmenteerd. Write-back-caches op controllers zorgen voor een zichtbare versnelling, maar zijn alleen verantwoord bij een gegarandeerde stroomvoorziening. NVMe met Multi-Queue-Stack levert lage latenties – zolang de wachtrijdieptes, de scheduler en de IRQ-verdeling kloppen. Ik controleer daarom of de belasting past bij de geometrie van de opslag, voordat ik aan de dienst zelf ga sleutelen.

Kernelparameters die de I/O-belasting afvlakken

Als I/O-bursts merkbare gevolgen hebben voor gebruikers, pas ik het writeback-mechanisme doelgericht aan:

  • vm.dirty_bytes / vm.vuile_achtergrond_bytes: absolute grenzen vanaf wanneer processen (of flushers) beginnen met schrijven. Ik geef de voorkeur aan bytes in plaats van procenten om systemen met veel RAM-geheugen onder controle te houden.
  • vm.dirty_writeback_centiseconden en vm.dirty_expire_centisecs: bepalen de frequentie en de “leeftijd” van de te schrijven pagina’s – handig om pieken te spreiden.
  • vm.swappiness: ik houd deze instelling gematigd, zodat er onder belasting niet onnodig wordt geswapt (SWAPIN% blijft idealiter op 0).

Ik test dergelijke aanpassingen stapsgewijs. Het doel is om de latentie voor gebruikers te stabiliseren zonder de reserves in de totale doorvoercapaciteit te verspillen.

Databases doelgericht stabiliseren

Bij MySQL/MariaDB kijk ik naar innodb_buffer_pool_grootte (cache-hitpercentage), geschikte indexen en zinvolle flush-strategieën: innodb_flush_log_at_trx_commit en sync_binlog kies ik op basis van het risico om commit-paden minder risicovol te maken. Een te kleine innodb_log_file_size leidt tot onnodige controlepunten en I/O-pieken. Tijdelijke bestanden sla ik op snelle schijven op als ze daadwerkelijk intensief worden gebruikt.

Bij PostgreSQL gebruik ik voor het afvlakken checkpoint_timeout, max_wal_grootte en een verstandige Autovacuum-configuratie. Plaats WAL op een snel, consistent volume, stel checkpoints niet te agressief in en ontlast hotspots met indexen – dat verlaagt IO% merkbaar. In beide gevallen geldt: één ontbrekende index veroorzaakt vaak meer chaos dan welke hardwarebeperking dan ook. Ik voer metingen uit, controleer met iotop de schrijfactiviteit van het DB-proces en beslis vervolgens of tuning of het optimaliseren van query’s voorrang heeft.

Containers en cgroups correct interpreteren

In containeromgevingen groepeer ik processen met -P samen om diensten in plaats van threads te beoordelen. iotop laat me in de eerste plaats zien wat er in de namespace zichtbaar is; aan de hostzijde aggregeer ik via Cgroup wanneer meerdere pods/containers hetzelfde volume delen. Ik gebruik rate-limits (bijvoorbeeld via Cgroups) om “luidruchtige” workloads in te dammen zonder ze volledig te stoppen. Opvallend zijn overlay-lagen: als een container veel naar zijn overlay schrijft, kan de ‘copy-on-write’-eigenschap zorgen voor kleine, dure schrijfbewerkingen. Dan verplaats ik schrijfpaden naar speciale volumes of stel ik de schrijfinintensiteit in via ionice naar beneden.

Netwerkopslag (NFS/blokopslag): als het netwerk traag is

Als diensten toegang hebben tot NFS of cloud-block-storage, beoordeel ik de latentie op twee manieren: lokaal en op afstand. iotop laat zien dat een proces wacht, maar de oorzaak kan liggen in het netwerkpad, in limieten van de externe opslag of in ongunstige mount-opties. Typisch: een grote metadatabelasting op NFS-homedirectory's of zeer kleine synchronisatieschrijfbewerkingen op blokvolumes met een IOPS-limiet. Vervolgens pas ik rsize/wsize (NFS) aan, werk ik met grotere, sequentiële schrijfbewerkingen of verdeel ik hotspots over lokale SSD’s als cache. Ik vind het belangrijk om MB/s niet op zichzelf te bekijken: een paar MB/s met een hoge IO% duiden op wachttijd, niet op doorvoerbegrenzingen.

Uit de praktijk: mijn workflow van 10 minuten

  • Minute 1–2: iotop -o -d 1 Starten, de schuldigen markeren, nagaan of lezen of schrijven de overhand heeft, IO% en SWAPIN% controleren.
  • Minute 3–4: iostat -x 1 daarnaast: de latenties, bezettingsgraad en wachtrijdiepte op hun plausibiliteit controleren.
  • Minute 5: Als een duidelijke batch de oorzaak is, met ionice/nice afzwakken of tijdelijk onderbreken.
  • Minute 6–7: Het patroon indelen (Cron? Back-up? Indexering?) en het tijdschema/de limiet noteren.
  • Minute 8–9: Bestandssysteem- en database-context controleren (journal/commit, indexen, flushing).
  • Minute 10: Batch-Trace starten (iotop -b -o -qq -d 2 -n 120) en taken noteren.

Automatiseren: batch-uitvoer samenvoegen

Ik vat batch-logs op een pragmatische manier samen om herhalingen te herkennen. Een eenvoudig uitgangspunt is een optelling per COMMAND-regel, om te zien wie het vaakst en het meest intensief gebruik heeft gemaakt van de batch. Voorbeeld: een korte awk-Lauf kan de gemeten WRITE/READ-waarden per procesnaam bij elkaar optellen en de grootste veroorzakers weergeven. Zo krijg ik binnen enkele seconden een ranglijst, zonder ingewikkelde pijplijnen. Voor vergelijkingen op langere termijn stel ik de logrotatie strak in en houd ik de uitvoerformaten stabiel, zodat ik weken later A/B-vergelijkingen kan maken.

Kort samengevat

Ik gebruik iotop om in realtime te achterhalen welke dienst de I/O-wachtrij verstopt, en controleer vervolgens aan de hand van systeemstatistieken hoe zwaar de schijf werkelijk wordt belast. Typische boosdoeners zijn loggroei, ongelukkige cron-tijden, database-intensieve schrijfbewerkingen of een parallelle indexering die dwars op het verkeer loopt. Met overzichtelijke schema’s, passende logboekregistratie, ionice/Nice en een paar opslagfijn afgestelde instellingen weet ik de wachttijd betrouwbaar te verminderen. Het blijft belangrijk om patronen te documenteren en de bevindingen om te zetten in concrete maatregelen. Zo wordt snelle Problemen oplossen een blijvende snelheidswinst voor hostingopstellingen van elke omvang.

Huidige artikelen