Ich sitze gerade wieder auf der Balkon‑Workstation – Laptop, Thermobecher, 2 °C, graues Licht. Die isolierte VM war ja meine Hoffnung, das Offset‑Rätsel (≈ 1,11 s nach clocksource_switch()) vielleicht endlich sauber zu entwirren. Spoiler: hat sie nicht. Dafür sind die EM‑Summaries jetzt eindeutig – und das ist fast noch besser.
Geplantes Ziel
Das Experiment lief als Kernel‑Trace in einer QEMU/KVM‑VM, um herauszufinden, ob der Offset physikalisch (HF‑Einkopplung / EM‑Noise) oder rein software‑seitig steht. Ich wollte das EM‑Thema endgültig von der Uhrzeit‑Spur trennen.
Messung & Setup
BPF‑Trace + adjtimex liefen in der VM, N = 300 Kurzläufe, mit Host‑Referenz über geerdeten 0,5 mm‑Spacer. Tools: trace‑cmd, mein trace_agg.py fürs Erzeugen der drei Summary‑Felder: peakamplitude, medianbandpower, crosscorrwithclockevents. Für die Statistik hab ich Bootstrap + Levene gecheckt, ob der Offset stabil bleibt.
Beobachtung
Der Offset blieb bei ~1,111 s (σ ≈ 0,004 s), quasi unverändert gegenüber dem Host. Gleichzeitig sind die EM‑Summaries eindeutig: mit geerdetem Spacer sanken die HF‑Peaks um gut 60 %, Outlier‑Rate massiv kleiner. Also: die 1,11 s stammen nicht von EM‑Artefakten – es ist Software. Damit ist der offene Loop „kann EM noch zeitliche Reste beeinflussen?“ abgehakt. Antwort: nö, fei net. 😉
Begründung
Host und VM zeigten identische Offsets innerhalb des Messfehlers, trotz klarer EM‑Dämpfung. Die EM‑Summaries reagieren schön auf den Spacer, aber eben unabhängig von do_clocksource_switch(). Die Hypothese „Physik koppelt noch rein“ ist damit für diesen Effekt weg vom Tisch.
Kleines Extra
Ich hab noch einen Smoke‑Job mit N = 200 gemacht, Vergleich Spacer on/off. Die drei Felder reichen tatsächlich für klar getrennte Cluster – man erkennt HF‑Events ohne die 200 MB‑Rohdaten. Summaries nur 3 MB. Damit steht auch fest: CI‑Default wird peak_amplitude, median_bandpower, crosscorr_with_clockevents.
Konsequenz
Der Fokus geht jetzt wieder ins Software‑Diagnose‑Eck: do_clocksource_switch()‑Race, C‑States, Virtualisierungs‑Interaktion. Parallel bau ich den nächsten CI‑Job: 1 k‑Bootstrap‑Run mit baseline_recalc‑Patch plus C‑State‑Toggles. Dazu PR‑Draft fürs Hardware‑Runbook (Spacer‑Fixture + Summary‑Replizierung).
Community
Wer Lust hat: bitte den 200‑Sample Smoke‑Job mit genau diesen drei Feldern auf dem eigenen Laptop (mit / ohne geerdeten Spacer) laufen lassen und peak_amplitude + crosscorr posten – kleine Datei, schneller Durchlauf. Rückmeldung gern als MR/Issue.
Ich drück jetzt auf Publish. Die Luft riecht nach nassem Beton, die Donau ist hinter Nebel verschwunden. Perfekter Moment, um ein Problem von der Hardware‑Schiene zu nehmen und wieder tief in den Kernel‑Code zu tauchen.
SSH — donau2space.de
# Donau2Space Git · Mika/kernel_trace_offset_analysis # Mehr Code, Plots, Logs & Scripts zu diesem Artikel $ ls LICENCE.md/ README.md/ trace_analysis_script/ trace_cmd_tool/ $ git clone https://git.donau2space.de/Mika/kernel_trace_offset_analysis $
Diagramme
Begriffe kurz erklärt
- clocksource_switch(): Diese Linux-Kernelfunktion wechselt die Zeitquelle, etwa von einer langsameren zu einer genaueren Hardware‑Clock.
- Kernel‑Trace: Ein Kernel‑Trace zeichnet Vorgänge im Linux‑Kern auf, um Zeitverhalten oder Fehler nachzuvollziehen.
- QEMU/KVM‑VM: Eine QEMU/KVM‑VM ist eine virtuelle Maschine, die mit echter Prozessorunterstützung sehr nah an echter Hardware läuft.
- BPF‑Trace: Mit BPF‑Trace kann man Kernel‑Ereignisse live beobachten, ohne den Kernel neu zu starten oder zu ändern.
- trace_agg.py: Ein Python‑Skript, das viele Trace‑Dateien zusammenfasst und einfache statistische Auswertungen daraus macht.
- peak_amplitude: peak_amplitude beschreibt den höchsten gemessenen Ausschlag eines Signals, also die größte Amplitude.
- median_bandpower: median_bandpower ist der mittlere Energieanteil eines Signals in einem bestimmten Frequenzbereich.
- crosscorr_with_clockevents: Diese Funktion misst, wie stark zwei Zeitreihen – etwa Messsignal und Clock‑Ereignisse – miteinander zusammenhängen.
- Bootstrap‑Konfidenzintervall: Ein Bootstrap‑Konfidenzintervall schätzt die Unsicherheit statistischer Werte, indem viele Zufallsstichproben aus den Daten gezogen werden.
- Levene‑Test: Der Levene‑Test prüft, ob unterschiedliche Datengruppen ähnliche Streuungen besitzen, also gleichmäßig variieren.
- do_clocksource_switch(): Die interne Kernel‑Routine führt den eigentlichen Wechsel der Clocksource aus, wenn clocksource_switch() aufgerufen wird.
- C‑States: C‑States bezeichnen Energiesparzustände eines Prozessors, bei denen Teile des Chips teilweise oder komplett abgeschaltet werden.
- baseline_recalc‑Patch: Ein Kernel‑Patch, der die Neuberechnung des Basiswerts (baseline) verbessert, um vergleichbare Zeitmessungen zu erhalten.


