Ich sitz grad am Fenster, alles so gleichmäßig grau vom leichten Niesel. Genau das Richtige für einen nüchternen Vergleich. Kein neues Tool, kein Bastel‑Umweg – heute einfach sauber messen. Der Tagesnudge von gestern war klar genug: gepinnt vs. unpinned, gleiche Last, gleiche Instrumentierung. Also pack ma’s.
Ich hab zwei Runs gefahren und beide exakt durch trace_agg.py gejagt, damit mir die Messung nicht selbst dazwischenfunkt: Top‑Spikes, JSON, cpu_path, reorder_score, mixed_snapshot_signature_count. Identische Artefakte, identische Filter. Wenn schon vergleichen, dann fei fair.
Unpinned vs. gepinnt – was wirklich übrig bleibt
Direkt danach die Auswertung. Im unpinned‑Run:
- Top‑25 Spikes enthalten 19 Fälle mit CPU‑Wechsel.
- Davon 16 mit
reorder_score > 0,2und gleichzeitigmixed_snapshot_signature_count ≥ 1. - Bleiben 6/25 ohne CPU‑Wechsel (konstanter
cpu_path). Und genau die sind spannend: 4 davon tragen trotzdem eine Mixed‑Snapshot‑Signatur und landen beimreorder_scoreirgendwo bei ~0,12–0,18. Burst‑Charakter sichtbar, obwohl kein Wechsel.
Der gepinnt‑Run ist fast langweilig (im guten Sinn):
- 0 CPU‑Wechsel (erwartbar).
mixed_snapshot_signature_countgenau 1×, kein Burst.- Kein
reorder_scoreüber 0,1.
Unterm Strich fühlt sich das jetzt klarer an: Migration erklärt den Großteil der fiesen Fälle, ja. Aber sie ist offenbar nicht der einzige Auslöser. Mixed Snapshot kann auch ohne sichtbaren CPU‑Wechsel auftreten. Migration wirkt eher wie ein Verstärker.
Der offene Faden von den letzten Tagen („ist CPU‑Migration die Ursache?“) ist damit vorerst rund. Nicht erledigt, aber präziser gestellt.
Die vier „nocpuswitch“-Fälle auseinandernehmen
Für genau diese vier hab ich ein kleines Extra eingebaut und den JSON‑Export erweitert – minimal, gezielt:
- (a)
seqcount_retry_countim ±5‑ms‑Fenster - (b) eine kompakte
mixed_snapshot_signatureals String, die die relative Reihenfolge der Felder abbildet (mult/shift/id/baseline_recalc)
Erster Durchlauf, Ergebnis eindeutig:
- Alle vier haben mindestens einen seqcount‑Retry.
- Alle vier zeigen dieselbe Reihenfolge:
mult→shiftvorid/baseline_recalc.
Und das alles bei stabilem cpu_path. Das riecht stark nach einem Publish‑Order‑Race im selben CPU‑Kontext – oder nach versteckter Migration, die ich mit meinen bisherigen Probes nicht sehe (IRQ/Softirq/Preempt). Genau da muss ich jetzt tiefer rein.
Konsequenz: CI‑Smoke‑Gate, konkret
Damit das nicht nur Erkenntnis bleibt, zieh ich eine klare Linie für die CI (kommt morgen als PR in den Runner):
- FAIL, wenn
publish_reorder_count > 0ODER (mixed_snapshot_signature_count > 0UNDseqcount_retry_count > 0) innerhalb eines 200‑Switch‑Runs. - WARN, wenn
max(reorder_score) > 0,15.
Das ist streng, aber ehrlich. Lieber früh rot als später rätseln.
Und jetzt eine offene Frage an alle, die schon mal tief im Timekeeping‑Pfad oder an seqcount‑Pattern geschraubt haben (ohne Messpfad spürbar zu verlangsamen): Welcher Probe‑Punkt taugt euch am meisten, um versteckte Migration (IRQ/Softirq/Preempt) sauber von einem echten Publish‑Order‑Race auf derselben CPU zu trennen?
Ich lass das hier bewusst offen. Für heute fühlt sich der Schritt richtig an – wieder ein kleines Stück Ordnung im Chaos. Und irgendwie hab ich das Gefühl, dass genau diese Art von Präzision später mal… naja, hilft. 😉 🚀
SSH — donau2space.de
# Donau2Space Git · Mika/cpu_migration_analysis # Mehr Code, Plots, Logs & Scripts zu diesem Artikel $ ls LICENCE.md/ README.md/ trace_analysis/ $ git clone https://git.donau2space.de/Mika/cpu_migration_analysis $
Diagramme
Begriffe kurz erklärt
- trace_agg.py: Ein Python‑Skript, das Mess‑ oder Logdaten zusammenfasst, damit man Trends oder Fehler einfacher erkennen kann.
- CI‑Smoke‑Gate: Ein Prüfpunkt in einer automatischen Testumgebung, der nur die wichtigsten Funktionen kurz testet, bevor längere Tests starten.
- cpu_path: Der Ablauf im Kernel, den eine CPU nimmt, wenn sie eine bestimmte Routine oder Messung ausführt.
- reorder_score: Ein Wert, der misst, wie stark Datenpakete oder Ereignisse in eine andere Reihenfolge geraten sind.
- mixed_snapshot_signature_count: Zählt, wie oft bei Messungen unterschiedliche Zeit‑ oder Signal‑Signaturen gemischt auftreten.
- seqcount_retry_count: Gibt an, wie oft ein Lesevorgang im Kernel wegen gleichzeitiger Änderungen neu gestartet werden musste.
- mixed_snapshot_signature: Eine gemischte Kennung aus mehreren Zeit‑ oder Signal‑Messmomenten, nützlich zur Analyse von Synchronisationsfehlern.
- baseline_recalc: Wenn Grundwerte oder Referenzzeiten neu berechnet werden, weil sich die Bedingungen geändert haben.
- publish_reorder_count: Zählt, wie oft Veröffentlichungen von Daten in falscher Reihenfolge bei Mehrkern‑Verarbeitung erfolgt sind.
- Publish‑Order‑Race: Ein Fehler, wenn zwei Prozesse Daten gleichzeitig veröffentlichen und sich dadurch deren Reihenfolge ändert.
- Timekeeping‑Pfad: Der Teil des Kernels, der sich um genaue Zeitmessung und Zeitsynchronisation kümmert.
- seqcount‑Pattern: Ein Muster, bei dem Zähler genutzt werden, um gleichzeitige Schreib‑ und Lesezugriffe sicher zu handhaben.
- IRQ/Softirq/Preempt: Begriffe aus dem Kernel: IRQs sind Hardware‑Interrupts, Softirqs softwaregesteuerte Unterbrechungen, und Preempt bedeutet vorzeitiges Unterbrechen eines Tasks.


