...

Linux PSI til præcis ydeevneanalyse og overvågning

Linux PSI giver mig nøgletal, der viser, hvor længe opgaver venter på CPU, hukommelse eller I/O, og dermed synliggør reelle flaskehalse. På den måde kan jeg præcist identificere, hvornår systemerne går i stå, i stedet for blot at måle udnyttelsesgraden, og ud fra Pressure-værdierne udlede konkrete tiltag til ydeevneanalyse og overvågning.

Centrale punkter

  • nogle/alle: Tidligt advarselssignal kontra kritisk blokering
  • CPU/hukommelse/I/O: Opdeling af tryk pr. ressource er tydelig
  • avg10/60/300: Tidsramme for trendvurdering
  • C-grupper: Identificere forurensere og berørte parter
  • Udløser: Automatisk reaktion ved overskridelse af tærskelværdien

Hvad Linux PSI måler, og hvorfor det er vigtigt

Jeg læser op fra Tryk-Metrikker viser, hvor meget reel arbejdstid processer går tabt på grund af mangel på CPU-tid, RAM eller I/O. Klassiske udnyttelsesværdier viser blot, hvor intensivt ressourcerne udnyttes, mens PSI afslører, hvor ofte systemet rent faktisk står stille. Netop det gør forskellen mellem en kort kø og en fuldstændig blokering synlig. I dynamiske opsætninger med containere og tætte deploymenter kan jeg dermed opdage flaskehalse tidligere og entydigt knytte dem til en bestemt ressource. På den måde prioriterer jeg optimeringstiltag målrettet og sparer mig selv for gætterier om den egentlige Årsag.

Aktivering og kontrol af Linux PSI

Først tjekker jeg, om PSI er aktivt, ved at se på filerne under /proc/pressure Læs; hvis CPU, hukommelse og I/O leverer værdier der, er alt klar. Mangler der data, aktiverer jeg PSI med kernel-bootparameteren psi=1 eller sikrer mig, at CONFIG_PSI=y er indstillet i kernen. Funktionen er tilgængelig fra kernel 4.20 og er ofte allerede aktiveret i aktuelle distributioner. Til hurtige tjek er enkle kommandoer som cat /proc/pressure/cpu tilstrækkelige, hvilket giver mig værdierne avg10, avg60, avg300 og total. Så ved jeg inden for få sekunder, om mit system leverer meningsfulde Metrikker giver.

Sådan forstår du filerne under /proc/pressure

I /proc/pressure findes der tre filer til CPU, memory og io, som hver viser to typer værdier: some og full. some angiver, at mindst én opgave har måttet vente, mens full viser, at alle opgaver, der ikke er inaktive, er gået i stå på samme tid. Derudover får jeg glidende gennemsnit over 10, 60 og 300 sekunder samt en kumulativ totalværdi. Ved hjælp af disse tidsvinduer skelner jeg mellem korte spidsbelastninger og vedvarende problemer. På den måde vurderer jeg objektivt, om der kun forekommer sporadiske spidsbelastninger, eller om der er tale om vedvarende Tryk er tilgængelig.

»some« kontra »full« i praksis

Jeg betragter »some« som en tidlig indikator og »full« som en alvorlig alarm, da »full« beskriver faser, hvor det produktive arbejde reelt står stille. Hvis »some« stiger for CPU’en, tjekker jeg skemaplanlægning, låse og belastningsfordeling; det kan i så fald hjælpe at optimere tråde eller måle Måling af scheduler-latens. Høje »memory-some«-værdier tyder ofte på sidegenvinding, swapping eller ressourcekrævende allokeringer. Hvis »io-some« stiger, undersøger jeg køer, prioriteter og konkurrerende adgang. Jeg træffer ikke beslutninger ud fra mavefornemmelse, men ud fra klare Signaler.

Systemomfattende kontra Cgroup-baseret evaluering

Jeg ser først på systemomfattende Værdier, for at få et samlet overblik, og skifter derefter over til Cgroups for at identificere kilderne. Med cgroup v2 finder jeg separate pressure-filer for hver tjeneste eller container, hvilket giver mig mulighed for at tilknytte dem til pods, slices eller units. Denne fremgangsmåde adskiller symptomer fra årsager i stedet for blot at tilskrive al belastning til værten. Derefter justerer jeg kvoter, CPU-andele eller hukommelsesgrænser målrettet. På den måde øger jeg retfærdigheden og reducerer gensidig Indflydelse.

PSI inden for overvågning, dashboards og Kubernetes

Jeg indsamler sjældent PSI manuelt, men lader Exporter eksportere dataene som tidsrækker indsamle, så dashboards kan vise tendenser og sammenhænge. I Kubernetes læser jeg PSI på node-, pod- og containerniveau, hvilket giver en klar adskillelse mellem forbrug og flaskehalse for hver enkelt workload. På den måde kan jeg se, om en enkelt pod forlænger ventetiderne for andre, eller om problemet forekommer på tværs af noder. Jeg indstiller alarmer for "full"-udviklinger og vedvarende høje "some"-værdier. Dermed kan jeg reagere proaktivt, inden brugerne oplever ventetider føle.

Typiske anvendelsesscenarier og fornuftige tærskelværdier

Jeg bruger PSI i belastningstests for at kontrollere, om responstiderne stiger på grund af belastning af CPU, hukommelse eller I/O, og om dette kun sker kortvarigt eller vedvarende. I kapacitetsplanlægningen overvåger jeg avg300 for at identificere tilbagevendende mønstre og i god tid udvide ressourcerne eller omfordele arbejdsbelastningen. Til autoskalering bruger jeg triggere tæt på den tærskel, hvor »full« opstår, så jeg kan reagere i tide. Ved en gradvis forringelse af ydeevnen sammenligner jeg baseline-værdier før og efter udgivelser for at synliggøre effekterne. På den måde træffer jeg faktabaserede beslutninger og investerer der, hvor der er mest Effekt er oprettet.

Hurtig gennemgang af PSI-metrikkerne i tabelform

Når jeg ser på PSI, har jeg en enkel oversigt klar, så jeg hurtigere kan nå frem til den rigtige hypotese. Den følgende tabel opsummerer fortolkningen af »some« og »full« for hver ressource og giver nogle indledende handlingsmuligheder. Den erstatter ikke en dybere analyse, men sparer mig værdifuld tid i driften. Det er stadig afgørende at vurdere kortvarige spidsbelastninger anderledes end længere perioder. Netop til dette formål bruger jeg glidende gennemsnitsværdierne avg10, avg60 og avg300 som Sammenhæng.

Ressource some-Signal fuld signal Hyppige årsager Mulige foranstaltninger
CPU Lejlighedsvise ventetider Alle opgaver er blokeret Konflikter i planlæggeren, låse, for mange tråde Justering af trådpuljer, lempelse af låse, tilpasning af CPU-andele/kvoter
Hukommelse Genanvendelser, sidefejl, allokeringsflaskehalse Stort pres, swap dominerer Overcommit, store heap-områder, cache-belastning Kontrollere grænser, optimere allokeringer, reducere swapping
I/O Stadigt længere køer I/O er et overordnet begreb Overbelastede diske/netværk, konkurrerende adgang Prioriteringer, batchbehandling, køoptimering, separate volumener

Sådan fortolkes lagertryk korrekt

Jeg analyserer memory.pressure i sammenhæng med RSS, cache-andele og swap-udnyttelse, fordi det først er denne kombination, der giver pålidelige konklusioner. Ofte skyldes en høj some-værdi en fase med intensive frigivelser eller en stigning i page-faults, som kan udjævnes med bedre allokeringsmønstre. Hvis »full« bliver synlig, stopper jeg eksperimenterne og reducerer først presset ved hjælp af begrænsninger eller mindre aggressive cacher. En mere dybdegående introduktion til emnet får jeg fra Hukommelsesbelastning med praktiske tip til RAM-optimering. Sådan forhindrer jeg, at ukontrolleret swapping forlænger responstiderne domineret.

Identificere og løse I/O-flaskehalse

Jeg undersøger io.pressure sammen med latenstider, re-queue-rater og kødybder, fordi rene gennemstrømningsværdier kan skjule flaskehalse. En høj some-værdi ved moderat belastning tyder ofte på uensartede adgangsprofiler, som kan udjævnes ved hjælp af batching eller prioritering. Ved first-byte-forsinkelser og stigende »full« satser jeg på afkobling via asynkron I/O og separate volumener til hotpaths. Til detaljerede diagnoser bruger jeg måleserier og den i praksis gennemprøvede vejledning til Analyse af I/O-ventetid. På den måde træffer jeg målrettede beslutninger i stedet for Antagelser.

PSI kontra Load Average og klassiske måleparametre

Jeg sætter bevidst PSI op ved siden af Load Average, CPU-udnyttelse, iowait og hukommelsesudnyttelse for at udfylde hullerne mellem disse perspektiver. En høj belastning ved lav cpu.pressure viser mig ofte blot, at mange opgaver kan udføre beregninger aktivt – uden systemomfattende flaskehalse. Omvendt er stigende cpu.pressure ved moderat udnyttelse et tegn på scheduler-konflikter eller lock-contention. Hvad angår I/O, gælder følgende: iowait alene fortæller mig ikke, hvor meget det samlede system lider under det; io.pressure kvantificerer, hvor meget arbejdstid der går tabt i den forbindelse. Netop denne omsætning af “udnyttelse” til “tabt tid” gør mine beslutninger betydeligt mere pålidelige.

avg-vinduet og læse det helt præcist

Jeg opfatter værdierne avg10/60/300 som procentdele af den tid, hvor opgaver var blokeret. En avg10 på 2,50 betyder, at der i de sidste 10 sekunder gik 2,51 TP3T af den potentielle arbejdstid tabt. Total-værdien akkumulerer stalletid siden opstart (i finopdelte tidsenheder) og viser mig dermed Arealet under kurven. Når det gælder kapacitetsplanlægning, ser jeg på stigningen i de samlede og daglige profiler: Hvis kurven bliver markant stejlere i spidsbelastningsperioder, planlægger jeg aflastning. Når det gælder driftssignaler, vurderer jeg mønstre: Et kortvarigt opsving i avg10 bekymrer mig mindre end en samtidig stigning i avg60 og avg300, som tyder på strukturelt pres.

Cgroups i praksis: Struktur, stier og rettigheder

Jeg arbejder i cgroup v2 med pressure-filerne direkte i de respektive service-, slice- eller pod-mapper. På den måde kan jeg for hver enhed, pod eller container se, om presset opstår lokalt eller blot videregives. Systemd-enheder, Kubernetes-pods og brugerdefinerede grupper kan på denne måde klart adskilles fra hinanden. Når jeg har fået sat det på plads, begrænser jeg målrettet: strammere CPU-kvoter, mere retfærdige CPU-andele og realistiske hukommelsesgrænser. I praksis sørger jeg for at foretage målingen der, hvor den har effekt – nemlig i netop den Cgroup, der også fastsætter grænserne. Det forhindrer, at jeg bekæmper symptomerne et sted, mens den egentlige kilde forbliver uberørt.

Alarmstrategier uden en oversvømmelse af alarmer

Jeg definerer alarmer på en måde, så de tager højde for tendenser og vedvarende mønstre. Til tidlig opdagelse indstiller jeg tærskelværdier til »some«, kombinerer dem med observationsvinduer og hysterese og kontrollerer, om avg10 og avg60 skal forblive høj. Til akutte indgreb kombinerer jeg full med korte vinduer og automatiske reaktioner (skalering, prioritering, begrænsning). For at undgå fluktuationer lader jeg først systemet udløse, når en tilstand er bekræftet flere gange, og skifter først tilbage, når værdierne falder markant under tilbagevendenstærsklen. Jeg knytter alarmer til service-SLO’er: Når p95-latenser stiger, og belastningen samtidig øges, er konklusionen pålidelig – ren udnyttelse alene er ikke nok for mig.

Praksiseksempler: Mønstre, som jeg genkender med det samme

Jeg samler gerne på tilbagevendende mønstre, fordi de gør det hurtigere at træffe beslutninger:

  • CPU: Lock-konflikter i stedet for “for få kerner” – cpu.some stiger, selvom CPU-udnyttelsen ikke er ved grænsen. Jeg undersøger hotlocks, reducerer trådfordelingen og udjævner spidsbelastninger med backpressure. Det giver ofte bedre resultater end at tilføje flere kerner.
  • Hukommelse: Reclaim-spiralen – memory.some stiger og svinger i takt med sidefejl, mens swap aktiveres. Jeg sænker cache-aggressiviteten, reducerer heap-toppe (f.eks. batchstørrelser), justerer grænserne og forhindrer dermed, at memory.full overhovedet vises.
  • I/O: Ubalancerede adgangshændelser – io.some stiger, mens den normale gennemstrømning forbliver uændret. Jeg adskiller læse- og skrivebaner, samler små I/O’er i batches og fordeler hotpaths på separate volumener. På den måde reducerer jeg ventetiderne uden nødvendigvis at øge den rene gennemstrømning.

Begrænsninger og hindringer ved fortolkningen

Jeg holder i baghovedet, at PSI måler ventetid – ikke den absolutte udnyttelse. Et CPU-bundet batchjob kan vise høj udnyttelse uden at øge cpu.pressure, så længe der er nok kerner til rådighed. Omvendt kan lav gennemstrømning med høj io.pressure være et klart tegn på overbelastning. I virtualiserede miljøer tjekker jeg desuden, om begrænsninger eller affiniteter skaber lokale flaskehalse: En container, der kun er fastgjort til få kerner, kan vise højt cpu.pressure, selvom værten har ledige ressourcer. Det er også vigtigt at sammenligne det systemomfattende billede med det cgroup-lokale – kun på den måde kan jeg se, om jeg løser problemet det rigtige sted.

Operative retningslinjer: Stikprøver, overhead og visualisering

Jeg holder samplingen enkel: et interval på 1–5 sekunder er tilstrækkeligt for mig til operationelle beslutninger, fordi gennemsnitsvinduerne allerede udjævner dataene. Jeg vurderer PSI’s overhead som ubetydelig, især da jeg holder målingen tæt på systemet og kun registrerer få, velplacerede tidsserier. Til visualisering placerer jeg paneler side om side for hver ressource (some/full, avg10/60/300, total) og korrelerer dem med latenstider og fejlrater. I post-mortem-analyser tegner jeg kurven for »total« i forhold til deployments, releases eller konfigurationsændringer – på den måde bliver det tydeligt, hvilke tiltag der rent faktisk reducerer belastningen.

Målrettede modforanstaltninger for hver enkelt ressource

Ud fra mønstrene udleder jeg konkrete skridt, uden automatisk at anskaffe yderligere hardware:

  • CPU: Begræns trådpuljer og samtidighedsbeskyttelse, afbød hotlocks (granularitet/låsestrategi), fordel belastningen retfærdigt (andele/kvoter), tag højde for topologien (NUMA, affinitet). Først når lokal aflastning ikke virker, skalerer jeg horisontalt eller vertikalt.
  • Hukommelse: Stabilisere allokeringer (batching, buffer), begrænse cacher, fastsætte realistiske grænser, udjævne spidsbelastninger i heap’en, mindske swap-påvirkningen. Jeg foretager målrettede målinger før og efter ændringer, da memory.some reagerer følsomt på allokeringsmønstre.
  • I/O: Udjævne adgangsprofiler (batching, asynkron I/O), afkoble hotpaths, fastsætte prioriteter, vælge passende kødybder og adskille konkurrerende arbejdsbelastninger. Jeg måler succes ud fra et faldende io.pressure og kortere P99-latenser.

PSI i teamets hverdag: Kommunikation og ejerskab

Jeg bruger også PSI som et fælles sprog mellem platform- og produktteams. I stedet for at tale abstrakt om “langsom”, navngiver jeg ressourcen og mønsteret: “io.some avg60 har i 20 minutter ligget over 4% for tjeneste X” eller “memory.full udløses i cgroup Y”. Denne præcision gør det lettere at prioritere, fordi det står klart, hvilke ansvarlige der skal handle, og hvilket budget (tid, ressourcer) der lover de største effekter. Via definerede baselines aftaler jeg kvalitetsmål, der både er teknisk holdbare og forståelige for interessenterne.

Triggere, baselinjer og gradvis implementering

Jeg bruger PSI-triggere med tærskelværdier og overvågningsvinduer, så en daemon reagerer automatisk, når trykket forbliver højt. For at sikre pålidelige konklusioner opretter jeg inden ændringer en baseline baseret på typiske belastningsfaser, som jeg senere sammenligner med nye måleserier. Jeg definerer alarmer konservativt: »some« ved vedvarende forhøjede værdier giver mig tid, mens »full« udløser modforanstaltninger. I store flåder implementerer jeg PSI-baserede alarmer trinvis for at undgå støj og justere tolerancerne præcist. Således forbliver min overvågning klar og pålidelig, uden at overbelaste teamene med unødvendige meddelelser.

Fordele ved hosting, virtualisering og multi-tenant

Med PSI kan jeg se, om enkelte arbejdsbelastninger bremser andre, om hardwarereserverne er tilstrækkelige, og hvor der skal justeres grænserne. I delte miljøer kan jeg identificere vedvarende belastning af CPU, hukommelse eller I/O fra enkelte konti og planlægge omfordelinger i god tid. Cgroup-baserede værdier viser mig, hvilke tjenester der er berørt, og hvor jeg målrettet kan begrænse eller prioritere. På den måde sikrer jeg pålidelige responstider og en retfærdig ressourceudnyttelse, selv under belastning. Det reducerer omkostningerne, forhindrer eskaleringer og øger den mærkbare kvalitet.

Konklusion: Nøgletal fører til beslutninger

Jeg bruger Linux PSI, fordi det gør ventetider målbare og dermed udligner kløften mellem udnyttelsesgrad og brugeroplevelse. Med »some« opfanger jeg tidlige tegn, med »full« reagerer jeg på reelle blokeringer, og med Cgroups finder jeg de nøjagtige årsager. Dashboards, triggere og baselines omdanner dette overblik til konkrete tiltag: optimerede grænseværdier, bedre belastningsfordeling, rene I/O-stier. Den, der aktivt bruger PSI, forkorter tiden til at finde årsagen og sparer sig for mange blinde optimeringsrunder. På den måde bliver overvågningsdata til klare Beslutninger, der gør systemerne mærkbart hurtigere.

Aktuelle artikler

Linux-server med visualiserede nøgletal for tryk-stall-information i datacentret
Administration

Linux PSI til præcis ydeevneanalyse og overvågning

Linux PSI (Pressure Stall Information) viser, i hvor høj grad CPU, hukommelse og I/O bremser dit system. Find ud af, hvordan du aktiverer PSI og bruger det til præcis overvågning af ydeevnen.