...

Att förstå och använda kärnspårningspunkter för prestandaanalyser i Linux

Med hjälp av kärnspårpunkter kan jag förstå prestandaproblem i Linux ända ner på kärnnivå och mäta exakt var tid går förlorad. Jag använder dessa Mätpunkter, för att övervaka processer i schemaläggaren, i I/O-stacken och i nätverksvägen – med liten extra arbetsinsats och tydliga händelsedata.

Centrala punkter

Följande huvudpunkter ger dig en snabb överblick över vad jag tänker på när jag arbetar med spårningspunkter.

  • Statisk Förankrade händelser levererar tillförlitliga data vid viktiga ställen i koden.
  • Låg overhead gör spårning praktiskt genomförbar även under hög belastning.
  • Ett omfattande ekosystem med ftrace, perf, LTTng och eBPF-verktyg.
  • Målmedveten aktivering och filtrering förhindrar datöversvämningar.
  • Kombination med prestandamätare visar orsakskedjor.

Jag håller listan kort och fokuserar på Prioriteringar analysen. På så sätt slösar jag inte tid på oväsentliga detaljer och håller koll på de viktigaste signalerna. De nämnda punkterna styr mitt praktiska arbete från den första misstanken till den verifierade optimeringen. På så sätt skapar jag Öppenhet och reproducerbarhet. Jag arbetar utifrån data och kontrollerar varje steg.

Vad är kärnspårpunkter?

En tracepoint är en statisk instrumenteringspunkt i kärnkoden som utlöser en händelse med strukturerade fält. Där ser jag bland annat PID, tidsstämplar, CPU, statuskoder eller storleksuppgifter, beroende på händelse. Genom makron som TRACE_EVENT definierar kärnan platsen, formatet och de data som levereras. Dessa händelser finns vid meningsfulla gränssnitt som schemaläggning, block-I/O, filsystem eller nätverksvägen. Jag kan aktivera dem när som helst utan att behöva patcha kärnan eller utsätta produktionssystem för risker, vilket ger mig Planering av säkerhet där.

Varför man ska använda spårpunkter för prestandamätning

Tracepoints är i inaktivt läge praktiskt taget kostnadsfria och medför endast en liten extra belastning när de aktiveras. Även när händelserna är aktiverade mäter jag vanligtvis bara en extra fördröjning i det lägre tvåsiffriga nanosekundområdet – vilket är tillräckligt bra för system med strikta Latensmål. Eftersom de är stabilt integrerade i kärnan kan jag upprepa analyserna på ett konsekvent sätt över olika kärnversioner. Deras strukturerade utdata kan på ett tillförlitligt sätt analyseras och bearbetas vidare. På så sätt vinner jag pålitlig Mätningar istället för otydliga loggfragment.

Tidsstämplar, klockor och ordningsföljd

För att kunna tolka fördröjningar korrekt är jag noga med vilken tidskälla som används. Monotona klockor (t.ex. CLOCK_MONOTONIC) är mer tillförlitliga för mätningar än realtid, eftersom NTP-korrigeringar inte påverkar tid i efterhand. På flerkärniga system levererar buffertar per CPU händelser vars ordning stämmer lokalt på CPU:n, men som endast kan jämföras mellan olika CPU:er med hjälp av tidsstämplar. Därför kalibrerar jag perspektivet: antingen sorterar jag händelserna per CPU, eller så använder jag verktyg som synkroniserar buffertarna och löser tidslinjekonflikter på rätt sätt. Vid mycket knappa budgetar kontrollerar jag om TSC-basen är stabil, så att avvikelser inte felaktigt uppfattas som jitter. På så sätt förhindrar jag felaktiga tolkningar när till exempel väckningar sker på CPU 3 och kontextbyten på CPU 7.

Översikt över Linux-spårningssystemet

Jag använder flera verktyg som alla bygger på samma Tracepoint-händelser. ftrace gör det möjligt att snabbt aktivera dem via spårningsfilsystemet och lämpar sig för ad hoc-kontroller med Live-vy. Med perf kopplar jag samman spårpunkter, hårdvaruräknare och samplingsdata för att synliggöra korrelationer. LTTng hanterar långa inspelningar med hög händelsefrekvens och låg extra belastning, vilket är avgörande för djupgående analyser. eBPF-baserade verktyg läser av spårpunkter, utför aggregeringar i kärnan och minskar därmed Datatrafik till användarutrymmet.

Ringbuffert och förlustkontroll

Bakom varje aktiv händelse finns en ringbuffert per CPU. Jag dimensionerar dessa buffertar så att belastningstoppar dämpas utan att händelser förkastas. Förlusträknare och varningar från verktygen är viktiga: I perf håller jag koll på räknaren för förlorade händelser, i ftrace kontrollerar jag statistiken över bortkastade händelser i tracefs. LTTng visar också när konsumentvägen inte hänger med. Om förluster uppstår ökar jag buffertarna, filtrerar strängare eller aggregerar tidigare. För „Flight Recorder“-scenarier använder jag ögonblicksbilder som bevarar en tidsperiod kring en utlösare. På så sätt håller jag datakvaliteten hög och undviker felaktiga hypoteser baserade på ofullständiga spår.

Val av verktyg: ftrace, perf, LTTng, eBPF

Jag börjar ofta med perf, eftersom jag där analyserar samplingar, räknevärden och spårpunkter tillsammans. För snabba händelseinspektioner använder jag ftrace och aktiverar specifikt Händelser fri. Komplexa, långvariga sessioner med många CPU:er kör jag gärna med LTTng, eftersom det på ett tillförlitligt sätt loggar höga datahastigheter. Om jag vill föraggregera i kärnan använder jag eBPF-baserade spårare för att endast exportera aggregerade nyckeltal. Den som vill fördjupa sig i perf hittar praktiska tips i inlägget om perf-verktyg, vilket är till hjälp för både nybörjare och mer erfarna användare.

Reproducerbarhet och automatisering av sessioner

Jag dokumenterar framgångsrika sessioner enligt följande: aktiverade händelser, filter, buffertstorlekar, samplingsfrekvenser och körtid. Dessutom dokumenterar jag kärnversion, verktygsversioner, CPU-topologi och ströminställningar, så att senare mätningar blir jämförbara. På så sätt kan jag vid behov upprepa en session oförändrad, överföra den till andra värddatorer eller automatisera den i CI-pipelines. Vid längre analyser sparar jag rådata och genererar sammanfattningar (histogram, percentiler, värmekartor) direkt efter mätningen. Jag arbetar iterativt: korta, målinriktade körningar, utvärdering, förtydligande av hypoteser – och sedan mäter jag igen. På det här sättet förlorar jag mig inte i data, utan drar tillförlitliga slutsatser med minimal slingtid.

Användningsscenarier i praktiken

I schemaläggaren övervakar jag kontextbyten, väckningar och köinteraktioner för att upptäcka överdrivna växlingar eller olämpliga prioriteringar. I blockstacken korrelerar jag inlämning och slutförande av förfrågningar med ködjup och storlek, vilket gör att jag kan upptäcka Förvaring-Flaskhalsar. I nätverksvägen följer jag paketens in- och utflöde samt köerna för att förstå latenskedjorna per flöde. När det gäller systemanrop kontrollerar jag frekvens och latens för att upptäcka avvikelser i hotpaths. Vid behov kombinerar jag detta med hårdvaruräknare så att cache-missar, grenförutsägelser och I/O-händelser kan Orsakskedja resultat.

Konkreta evenemangsnamn och fältinterpretation

Jag väljer händelser så att jag kan rekonstruera hela vägen med endast ett fåtal mätpunkter. En grunduppsättning som har visat sig fungera bra:

  • Schemaläggare: sched:sched_switch (föregående/nästa kommando, föregående tillstånd), sched:sched_wakeup och sched:sched_wakeup_new (väckningskälla, mål-CPU)
  • Block-I/O: block:block_rq_issue, block:block_rq_complete (sektorer, storlek, enhet, latens via delta)
  • Nätverk: net:net_dev_queue, net:netif_receive_skb (köhantering och mottagning), tcp:tcp_retransmit_skb (om sändningar)
  • Systemanrop: syscalls:sys_enter_*, syscalls:sys_exit_* (varaktighet per anrop, felkoder)

Jag kontrollerar fältens betydelser i förväg för att kunna korrelera korrekt: Från prev_state läser jag av vilande uppgifter, och från CPU-fälten identifierar jag förflyttningar mellan olika socklar. Vid nätverkshändelser tar jag, om det är möjligt, med flödesmetadata (t.ex. portar) för att gruppera fördröjningar per anslutning. På så sätt får jag fram vägar som faktiskt stämmer överens med det observerade beteendet i tjänsten.

Steg för steg: Från frågan till spårningssessionen

Jag börjar alltid med en tydlig fråga, till exempel: „Varför ökar svarstiderna under toppbelastningar?“ Det här steget tvingar mig att hitta rätt Delsystem att välja: Schemaläggare, nätverk, block, filsystem eller lagringshantering. Därefter listar jag lämpliga spårpunkter med „perf list“ eller i spårningsfilsystemet och antecknar relevanta fält. Jag konfigurerar sessionen, ställer in filter på PID-, CPU- eller händelsefält och anger buffertstorlek samt varaktighet. Därefter kör jag belastningsscenariot och analyserar sedan latensfördelningar, sekvenser och korrelationer innan jag testar en hypotes och mäter förändringen på nytt för att fastställa Effekt för att bekräfta.

Filtrering och korrelation: PID:er, TID:er, cgroups och flöden

Exakta filter sparar tid åt mig. Beroende på målet arbetar jag med PID-/TID-filter, CPU-urval eller cgroup-filter för att hålla mig inom gränserna för containrar eller tjänster. När jag vill förstå nätverkslatensen korrelerar jag händelser utifrån flödesattribut (t.ex. käll-/målport) för att skilja mellan masstrafik och latenskänsliga flöden. När det gäller filer ordnar jag dem efter enhets-/blockadress eller grupperar dem efter monteringspunkt, beroende på vilket verktyg jag använder. När det gäller schemaläggningen mäter jag tiden från uppvaknandet till den första sched_switch till mål-CPU:n; på så sätt kan jag se väntetiden i körköerna separat från den faktiska CPU-tiden.

Hantera overheadkostnader: bästa praxis

Jag aktiverar bara de spårningspunkter som jag verkligen behöver för att hålla datamängden och den extra belastningen på en låg nivå. Filtrering efter PID, CPU eller fält håller brusnivån låg och skonsam Buffert. Jag anpassar buffertstorleken efter händelsefrekvensen för att inte gå miste om några händelser. Jag sätter tydliga tidsgränser för sessionerna och upprepar dem endast när jag vill testa en hypotes. Vid extremt frekventa händelser använder jag sampling eller in-kernel-aggregering via eBPF, så att utvärderingen i användarutrymmet smal kvarstår.

Jämförelse: Tracepoints jämfört med prestanda-händelser

De båda metoderna kompletterar varandra. Tracepoints förklarar specifika händelser i delsystem och ger meningsfull Fält. Prestandatester ger mig en statistisk överblick över cykler, cache-missar och förgreningar. Genom att sammanställa dessa uppgifter kan jag se hur mycket tid som går förlorad och i vilket steg det uppstår problem. Tabellen nedan hjälper mig att välja verktyg och fokuserar på vad jag behöver i nästa mätomgång. Den fungerar som Önskelista för planeringen av sessionen.

Aspekt Tracepoints Prestationshändelser (perf)
Stabilitet Statiska händelser på olika ställen i kärnan, i stort sett versionsberoende Beror på hårdvaruräknare och kärnimplementering
Overhead Låg, händelsestyrd Mycket låg vid provtagningen
Fokus Konkreta händelser i delsystemen Systemomfattande nyckeltal
Dataformat Strukturerad, maskinläsbar Mätvärden, prover, profiler
Typisk användning „Vad“ och „när“ i en väg „Hur mycket“ och „Hur dyrt“

Jag brukar börja med prestandatester för att hitta en grov flaskhals och går sedan in på detaljerna med spårningspunkter. Omvänt aktiverar jag först spårningspunkterna när jag vill förstå en väg och lägger sedan till räknare för Kvantisering. Denna ordning sparar tid och gör datainsamlingen målinriktad. Det är viktigt att hålla koll på händelsefrekvensen så att inga data går förlorade. På så sätt håller jag mig uppdaterad med Mätdisciplin på rätt kurs.

Gränser, validering och korskontroller

Inte alla drivrutinsvägar är genomgående instrumenterade, och vissa sällsynta felvägar syns inte i loggarna. Därför jämför jag mätningarna med alternativa datakällor: räknare, loggar, syntetiska tester, men också enkla tidsmätningar i själva tjänsten. Om spår och räknare inte stämmer överens kontrollerar jag först filter och dataförluster, därefter klockbasen. Jag är dessutom uppmärksam på störningar: debug-builds, höga loggningsfrekvenser eller säkerhetshooks kan förskjuta latenser. Endast genom korskontroller kan jag med säkerhet fastställa att en upptäckt orsak verkligen är den avgörande faktorn för optimeringen.

Exempel: Mäta lagringsfördröjningar

Jag aktiverar spårpunkter i blockstacken för inlämning och avslutning av I/O-förfrågningar. Medan ett belastningstest pågår registrerar jag tidsstämplar, förfrågans storlek, enhet och PID för att Fördröjningar för varje process. Därefter sorterar jag efter varaktighet och genererar histogram som visar toppar och avvikelser. I ett andra steg lägger jag till CPU-räknare för att kontrollera om beräkningsbelastningen och I/O-fördröjningarna hänger ihop. Till slut justerar jag I/O-schemaläggaren, ködjupet eller lagringsbackenden och upprepar mätningen tills Mål har uppnåtts på ett tillförlitligt sätt.

Exempel: Förstå latenser i schemaläggare och väckningsmekanismer

När trådar uppvisar „spiky“ beteende mäter jag tiden från sched:sched_wakeup till den första sched:sched_switch på mål-CPU:n. På så sätt skiljer jag väntetiden i körköerna från den faktiska exekveringstiden. Jag grupperar efter CPU, prioritet och policy (CFS/RT) för att upptäcka avvikelser – till exempel när trådar med högt CPU-behov hamnar på överbelastade kärnor trots att det finns lediga kärnor. Om jag ser många väckningar över flera CPU:er kontrollerar jag affiniteter och NUMA-tilldelning. I kombination med Perf-räknare för LLC-missar kan jag fastställa om felaktig placering driver upp cache-latenser. En liten justering av trådaffinitet eller schemaläggningsparametrar ger ofta omedelbara mätbara förbättringar här.

Tips för produktiva arbetsmiljöer

Jag aktiverar spårning utanför underhållsfönstren endast med tydliga filter och korta tidsfönster. Innan dess kontrollerar jag händelsefrekvenserna på ett testsystem för att se till att jag Buffert ställer in det på lämpligt sätt. I produktiva miljöer använder jag aggregeringar inbyggda i kärnan för att minska belastningen i användarutrymmet. För snabba ad hoc-diagnoser är det värt att ta en titt på bpftrace i webbhotellet, eftersom jag då får de första svaren inom några minuter. Jag dokumenterar varje mätkörning omedelbart, så att jag Repeterbarhet sann.

Säkerhet, rättigheter och gränser för isolering

Spårning på kärnnivå kräver lämpliga behörigheter. Jag ser till att tracefs är korrekt monterat och kontrollerar systemomfattande inställningar som perf_event_paranoid eller kptr_restrict, som kan dölja detaljer. I känsliga miljöer begränsar jag vem som får aktivera spårning och fastställer rutiner för godkännande. Jag anonymiserar processnamn eller IP-adresser när data måste delas och definierar tydliga regler för hur länge spårningsdata ska sparas. I containrar gäller följande: Root i containern har inte automatiskt behörighet att läsa händelser i värdkärnan. Jag spårar därför helst från värden eller arbetar med explicita cgroup-filter för att endast registrera den avsedda arbetsbelastningen.

Checklista och vanliga misstag

Jag definierar först frågan, sedan delsystemen och därefter händelserna – i den ordningen. Jag kontrollerar att jag verkligen har angett alla nödvändiga fält innan jag startar belastningstestet. Glöm inte att ställa in filter; ofiltrerade sessioner genererar snabbt enorma datamängder och överbelastar Minne. Jag jämför kärnversionen, händelsens namn och verktygsinställningarna för att undvika missförstånd. För mer avancerade eBPF-arbetsflöden utökar jag konfigurationen med BCC-verktyg, för att förbehandla komplexa mätvärden i kärnan och endast exportera aggregerade signaler, vilket Klarhet skapar.

Spårning i containrar och virtuella maskiner

I container-miljöer filtrerar jag helst efter cgroup för att se just den tjänst som intresserar mig. På så sätt kan jag mäta i miljöer med flera användare utan att registrera andra arbetsbelastningar. När det gäller virtuella maskiner gäller att jag bara ser vad som händer i gästkärnan. Virtio-/vhost-vägar och hypervisorsidan förblir osynliga utan värdspårning. För att mäta latens från ändpunkt till ändpunkt korrelerar jag därför gäst- och värdmätningar när jag vill ha överblick över båda påverkansområdena. Dessutom beaktar jag tidssynkroniseringen mellan värd och gäst, så att jag på ett meningsfullt sätt kan överlagra loggar, mätvärden och spårningar. Med denna disciplin förblir analyserna tillförlitliga även i virtualiserade miljöer.

Att ta med sig: De viktigaste lärdomarna

Tracepoints ger mig stabila förankringspunkter i kärnan och levererar strukturerade händelser utan onödigt skräp. Jag använder dem för att få exakta Processer att förstå, identifiera flaskhalsar och mätbart utvärdera förändringar. Med ftrace, perf, LTTng och eBPF väljer jag det verktyg som passar bäst för målet och kombinerar dem vid behov. En tydlig frågeställning, strikta filter och lämpliga buffertstorlekar håller belastningen låg och data användbara. På så sätt hittar jag orsakerna snabbare, kan belägga effekten av mina åtgärder och hålla Prestanda ständigt under kontroll.

Aktuella artiklar