Benutzerhandbuch der Messwerkzeuge

CPU-, Speicher- und IRQ-Verhalten messen.

Befehle, Messgrenzen, Ausgabefelder und reproduzierbare Vergleiche für Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Hier beginnen

Wählen Sie ein Werkzeug, prüfen Sie dessen Version und führen Sie eine zeitlich oder mengenmäßig begrenzte Messung durch.

Jitter Tools 1.3.0 bietet drei eigenständige Linux-Befehlszeilenwerkzeuge. CPUJitter beobachtet Ausführungslücken auf einer CPU. MEMjitter misst definierte Speicheroperationen. IRQjitter beobachtet Kernel-IRQ- und softirq-Ereignisse über tracefs. Verwenden Sie sie einzeln, um eine konkrete Messfrage zu beantworten.

KomponenteAbgedeckte VersionZentrale Frage
CPUJitter3.2.2Wie lang sind aufeinanderfolgende Zählerleseintervalle auf der gewählten CPU?
MEMjitter3.5.2Wie lange dauern residente Zugriffe, erste Schreibzugriffe oder erfolgreiche mmap-Aufrufe?
IRQjitter1.3.0Welche beobachteten IRQ-/softirq-Handler und Wartezeiten haben lange verstrichene Zeiten?
Maschinenlesbarer Datenstromjitter.stream/0.6.0Wie werden Messungen, Abdeckung, Qualität und Bereinigung aufgezeichnet?
Aus einem Verzeichnis mit den drei ausführbaren Dateien
./cpujitter --version
./memjitter --version
./irqjitter --version

Die folgenden Beispiele laufen aus einer entpackten Binärdistribution. Nach einem Quellcode-Build liegen dieselben ausführbaren Dateien in ./bin/. Wenn sie über PATH erreichbar sind, lassen Sie das Präfix ./ weg. CPU-Nummern sind Beispiele, keine Platzierungsempfehlung für den Produktivbetrieb. Ersetzen Sie sie durch zulässige, aktive Linux-CPU-IDs auf Ihrem Host.

CPU- und Speicherknotengrenzen des aktuellen Prozesses lesen
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
CPU-Ausführungsintervalle, eine Zusammenfassung pro Sekunde
./cpujitter -c 4 --duration 10
Residente Byte-Lesezugriffe, eine Zusammenfassung pro Sekunde
./memjitter -c 4 --duration 10
IRQ-Übersicht; CPU 1 führt den Collector aus, alle aktiven CPUs werden beobachtet
sudo ./irqjitter -c 1 --duration 10

Führen Sie diese Beispiele einzeln aus. CPU- und Speichertests sind aktive Arbeitslasten. IRQjitter ist insofern passiv, als es keinen Testverkehr erzeugt, dennoch verursachen Tracing und Erfassung Overhead. CPU/MEM erfordern weder root, deaktiviertes SMT, CPU-Isolation, eine exklusive CPU noch HFTKernel. IRQ-Erfassung benötigt Zugriff auf einen bestehenden tracefs-Mount und die Berechtigung, eine eigene Instanz zu erstellen; sudo ist eine Möglichkeit, diese Berechtigungen zu erteilen.

Jitter Tools 1.3.0

Erstellen und prüfen

Prüfungen des Quellcode-Builds von Prüfungen der Binärdistribution trennen.

Das bereitgestellte 1.3.0-Archiv enthält ausschließlich Quellcode. Es enthält keine direkt ausführbaren ELF-Dateien. Die dokumentierte Qualifizierung belegt weder einen abgeschlossenen Rust-Build noch einen realen IRQ-Durchlauf. Der unterstützte Einstiegspunkt für den Quellcode ist test.sh; er erstellt und testet, bevor Binärdateien veröffentlicht werden.

Build-AnforderungUmfang
Linux GNU, x86_64 oder aarch64Nativ für die Hostarchitektur kompilieren.
Rust 1.85 oder neuer, rustfmt und clippyCompiler und Rust-Qualitätsprüfungen.
C-Compiler, ar, Entwicklungsdateien für statische libc, readelfNativer ABI-Code, GNU-static-Linking und ELF-Prüfungen.
Python 3.10 oder neuer und die TestabhängigkeitenQuellcodetests und Build-Orchestrierung. Die daraus erzeugten Messprogramme benötigen Python nicht.
Unterstützter Einstiegspunkt für Quellcode-Build und Tests
cd jitter-tools-1.3.0
./test.sh

Cargo läuft offline mit einem gesperrten Abhängigkeitssatz und ohne Registry-Abhängigkeiten. Python-Testabhängigkeiten können in .test-env/ innerhalb des Projekts eingerichtet werden. Verwenden Sie --offline, wenn die Umgebung bereits vorbereitet ist und Downloads aus Paketindizes deaktiviert werden müssen.

Quellcode-Abnahmelauf mit bereits verfügbaren Abhängigkeiten
./test.sh --offline --acceptance

Nach erfolgreichem Abschluss aller erforderlichen Prüfungen veröffentlicht der Ablauf bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json und ein versioniertes statisches Release-Archiv. Öffentliche Archivverweise verwenden den kanonischen Namen jitter-tools-1.3.0.tgz. Das Versionspaket enthält BUILD.json, ELF.json, Prüfsummen, Hinweise und Dokumentation. Betrachten Sie einen teilweise abgeschlossenen Quellcode-Build nicht als qualifizierte statische Distribution.

In einer entpackten Binärdistribution prüft test.sh die ausgelieferten Dateien
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

Das test.sh der Binärdistribution benötigt sh, readelf, sha256sum und grep. Es ist nicht das Build-Skript für den Quellcode. GNU-static-Programme benötigen zur Laufzeit weder Rust, Python, einen ELF-Interpreter noch benachbarte gemeinsam genutzte Bibliotheken. Sie benötigen weiterhin einen architekturkompatiblen Linux-Kernel, die erforderlichen Systemaufrufe sowie /proc und /sys; IRQjitter benötigt zusätzlich tracefs. ELF-Prüfungen sind Paketierungsnachweise, keine Garantie für Messgenauigkeit oder Unterstützung auf jeder Kernel-Version.

Jitter Tools 1.3.0

Gemeinsame Einstellungen

CPU auswählen, Durchlauf begrenzen und Fenster- oder Rohausgabe wählen.

EinstellungVerhalten
-c CPUFür alle Messdurchläufe erforderlich. Eine einzelne dezimale Linux-CPU-ID, 0..65535. Listen und Bereiche werden hier nicht akzeptiert. Kein automatischer Rückfall auf eine andere CPU.
-n SECFensterbreite und Zusammenfassungsintervall; Standard 1 Sekunde, Bereich 0.001..86400. Legt nicht die Abtastfrequenz fest.
--duration SECBegrenzte Beobachtungsdauer, 0.001..86400 Sekunden. CPU/MEM-Vorbereitung und Kalibrierung erfolgen vor der Beobachtung.
--samples NNur CPU/MEM. Nach einer positiven Anzahl abgeschlossener Beobachtungen stoppen. IRQjitter hat keine --samples-Option.
--jsonJSON Lines. Behält die standardmäßigen Einsekundenfenster bei, sofern nicht auch --raw angegeben wird.
--rawEinzelbeobachtungen mit vollständigen Protokolldatensätzen. Nicht mit -n oder ausschließlich fensterbezogenen Einstellungen kombinierbar.
--help, --version, --build-infoJede Informationsoption einzeln ausführen. Weder -c noch Kalibrierung oder Messung sind erforderlich.

CPU/MEM akzeptieren auch --cpu und --interval. IRQjitter 1.3.0 verwendet für diese Einstellungen nur -c und -n. Alle drei akzeptieren angehängte Kurzwerte wie -c4 -n0.1. Verwenden Sie einfache Dezimalsekunden, zum Beispiel 0.1, nicht 100ms, 1e-1 oder .1. Wiederholte Optionen werden abgelehnt.

Statistikfenster von 100 ms; die Erfassungsschleife läuft zwischen den Zusammenfassungen weiter
./cpujitter -c4 -n0.1 --duration 5
Begrenzte Roherfassung; keine -n-Option
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

Daten gehen an stdout und Diagnosemeldungen an stderr. Eine Umleitung von stdout wählt weder JSON- noch Rohmodus. Verwenden Sie eine begrenzte Dauer oder Ctrl+C zum Stoppen. Ein behandeltes SIGINT/SIGTERM gibt Abschlussdatensätze aus, wenn der Ausgabekanal nutzbar bleibt und die Bereinigung gelingt. Ein blockierter Systemaufruf, SIGKILL, Hostausfall oder eine geschlossene Pipe verhindern jede Garantie für sofortiges Stoppen oder vollständige Abschlussausgabe.

Jitter Tools 1.3.0

CPUJitter

Aufeinanderfolgende Ausführungsintervalle auf einer gewählten CPU messen.

Die Metrik cpu_iteration_elapsed_ns ist die kalibrierte verstrichene Zeit zwischen aufeinanderfolgenden Hardwarezähler-Lesezugriffen innerhalb eines Erfassungsblocks. Sie umfasst Schleifenverzweigung, Zeitstempelspeicherung und Zählerlese-Overhead. Sie ist weder die Anzahl der CPU-Kerntakte noch eine Messung der Geräte-Interrupt-Zustellung oder eine direkte Klassifikation der Pausenursache.

ordered ist der Standardmodus für Zählerlesezugriffe; relaxed ist eine explizite Alternative mit eigenem Kontext. Die Kalibrierung nutzt sieben Segmente von mindestens 50 ms gegen CLOCK_MONOTONIC_RAW, mit festem Skalierungsfaktor für den Durchlauf. Weder Baseline noch Zählerkosten werden abgezogen. Auf x86 sind deklarierte invariant-TSC-Unterstützung und nutzbarer Zählerzugriff erforderlich; nicht unterstützte Zähler werden abgelehnt statt stillschweigend ersetzt.

Ordered- und relaxed-Durchläufe trennen; ihre Verteilungen getrennt halten
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Intervalle streng über 5 Mikrosekunden zählen, ohne Stichproben zu filtern
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Fenster, Metadaten und Beendigungszustand speichern
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
CPU-spezifische oder ErfassungseinstellungStandard und Bereich
--counter-read ordered|relaxedordered. Nur gleiche Zählerlesekontexte vergleichen.
--batch-records N4096; 1..65536. Vorab zugewiesene Blockkapazität für aufeinanderfolgende Lesezugriffe.
--buffer-bytes N8388608; 16384..8388608. Begrenzte stdout-Warteschlange.
--write-timeout-ms N1000; 1..60000. Kooperative Ausgabefrist, keine harte Echtzeitgarantie.
--threshold cpu_iteration_elapsed_ns=NNichtnegative ganzzahlige Nanosekunden. Zählt Werte > N in Fenstern.

Ein Block enthält einen Ausgangszeitstempel und abgeschlossene Beobachtungen. Die Erfassung ist von Zeitankern, Validierung, Aggregation und Ausgabe getrennt. Ein kooperatives Zählerbudget prüft alle 256 Datensätze auf ungefähr 20 ms Erfassungsarbeit; es schneidet keine große beobachtete Verzögerung ab. ACTIVE% beschreibt den abgedeckten Erfassungsanteil, nicht die gesamte CPU-Auslastung. Pausen außerhalb der Erfassung bleiben für diese Metrik unbeobachtet.

Nanosekunden werden mit geprüfter Ganzzahlarithmetik und Rundung auf den nächsten Wert berechnet: (delta_ticks * 1000000000 + hz / 2) / hz. Ereigniszeitstempel für die Fensterzuordnung verwenden die eingeklammerte Counter-to-MONOTONIC-Abbildung. Der Wert und sein abgebildetes Start-/Endintervall dienen unterschiedlichen Zwecken und müssen nicht numerisch identisch sein. Unbekannte physische Genauigkeit bleibt im Datenstrom null.

Jitter Tools 1.3.0

MEMjitter

Residente Zugriffe, first-touch oder mmap-Aufruf-latency wählen.

ModusMetrikGemessene Operation
resident, Standardmem_resident_operation_nsEin Byte-Lesezugriff, nichtatomares Lesen/Ändern/Schreiben oder ein pointer-chase-Schritt.
first-touchmem_first_touch_nsEin flüchtiger Byte-Schreibzugriff auf einen unberührten Offset in einer verifizierten Mapping-/Reset-Epoche.
allocmem_alloc_call_nsEin erfolgreicher privater anonymer mmap-API-Aufruf; kein Seitenzugriff oder munmap innerhalb der Messklammer.

Residente Lesezugriffe und Lesen/Ändern/Schreiben

Standard sind resident, read, sequential, eine Abbildung von 16777216 Byte (16 MiB), eine Schrittweite in Systemseitengröße, Offset 0 und Seed 1. Die Vorbereitung berührt jede Basisseite, wärmt den Zugriffsplan auf und prüft die anfängliche Residenz mit mincore. Ohne explizite Sperre ist diese Momentaufnahme keine Zusage fortdauernder Residenz.

Getrennte residente Tests: Standardlesezugriffe und zufälliges nichtatomares Byte-RMW
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read misst einen flüchtigen Byte-Lesezugriff. rmw misst Byte-Lesen, Inkrementieren mit Überlauf und Speichern; es ist nicht atomar und misst nicht den global sichtbaren Abschluss des Schreibzugriffs. Die Messklammer enthält Zeitstempel-/Fence-Overhead. Das Ergebnis ist keine reine DRAM-latency.

Abhängiges pointer chase

Eine abhängige Kette durch die gewählten Offsets
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase wählt automatisch pointer-chase, sofern kein Muster explizit angegeben wurde. Ein explizites Muster muss ebenfalls pointer-chase sein. Weitere residente Muster sind sequential, random mit Zurücklegen und permutation. Adressauswahl und Verwaltung liegen außerhalb jeder gemessenen Operation. Eine seitenweise durchlaufene 16 MiB-Abbildung auf einem Host mit 4096-Byte-Seiten hat 4096 abgetastete Positionen; pro Durchlauf werden nicht 16 MiB Nutzdaten gelesen.

First-touch-Schreibzugriffe

Neue Abbildungen mit Reset außerhalb des gemessenen Schreibzugriffs
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Explizites Verwerfen mit MADV_DONTNEED und wiederholbarer Zugriffsreihenfolge
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch erlaubt sequential oder permutation, ohne Zurücklegen innerhalb einer Epoche. write ist die einzige Operation und muss nicht angegeben werden. Nach jedem erfolgreichen Remap/Discard muss mincore bestätigen, dass keine Seiten resident sind, bevor eine neue Epoche beginnt. Reset-Arbeit ist ausgeschlossene Servicezeit. Ein erster Byte-Schreibzugriff ist nicht zwingend ein eigener Seitenfehler oder eine physische Seitenallokation, besonders wenn THP mehrere Offsets hinterlegt. Remap und madvise sind unterschiedliche Experimente.

Allokations-API-Aufrufe

Reine mmap-Aufruf-latency; dies sind getrennte Durchläufe
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc erstellt jeweils höchstens eine eigene Abbildung und hebt sie vor dem nächsten Aufruf auf. Nur erfolgreiche mmap-Intervalle gehen in das Histogramm ein. mmap richtet eine virtuelle Abbildung ein, keine physische Belegung jeder Seite. Der C-ABI-/libc-Wrapper und die Zeitstempelklammer bleiben Teil des Werts. Der frühere alloc-cycle, malloc-/calloc-latency und automatische Speicherdruckerzeugung werden von diesem Modus nicht implementiert.

Layout- und Modusoptionen

EinstellungWerte und Einschränkungen
--moderesident | first-touch | alloc; Standard resident.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NDezimale Bytezahl, Vielfaches der Seitengröße; Standard 16777216, Maximum 1073741824. Keine Zeichenfolge mit MiB-Suffix.
--stride-bytes NMindestens eine Betriebssystemseite, seitenausgerichtet und Teiler von --bytes; Standard ist die Systemseitengröße. Nur resident/first-touch.
--offset-bytes NByte-Offset innerhalb einer abgetasteten Basisseite; Standard 0. Chase erfordert zusätzlich usize-Ausrichtung und ausreichenden Platz.
--seed NGanzzahl ungleich null; Standard 1. Nur resident/first-touch.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetNur first-touch: remap (Standard) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msDieselben Standards und Grenzen wie CPUJitter.
--threshold METRIC=NDie exakte Metrik für den gewählten Modus verwenden; strenger >-Vergleich in Fenstern.
First-touch-Werte über 20 Mikrosekunden zählen
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc lehnt Optionen für Muster, Schrittweite, Offset, Seed und Reset ab, selbst wenn ihre Werte den Standards ähneln. Kein Speichermodus akzeptiert CPUJitters --counter-read. Behalten Sie für Ergebnisvergleiche dieselbe Operation, dasselbe Muster, dieselbe Bytezahl, Schrittweite, Offset, Seed, Reset und denselben Ausgabemodus bei.

Jitter Tools 1.3.0

Speicherrichtlinien

Optionale Richtlinien nur auf die werkzeugeigene Abbildung anwenden.

Standard sind --lock none, --thp system, geerbte NUMA-Richtlinie und keine explizite HugeTLB-Anforderung. Das Werkzeug konfiguriert das System nicht um, erhöht keine Sperrgrenzen, ändert keinen Huge-Page-Pool und versucht es nicht mit einer schwächeren Richtlinie erneut. Eine explizite nicht unterstützte Anforderung scheitert mit Begründung.

Richtlinieresidentfirst-touchalloc
--lock noneStandardStandardZulässig
--lock residentmlock vor der VorbereitungAbgelehntAbgelehnt
--lock onfaultmlock2, gefolgt von residenter VorbereitungNur mit --reset remapAbgelehnt
--thp systemStandard, kein HinweisStandard, kein HinweisZulässig
--thp never oder --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEZulässig und nach remap erneut angewendetAbgelehnt
--numa-node NAuf den Bereich begrenztes MPOL_BINDAuf den Bereich begrenztes MPOL_BINDAbgelehnt
--hugetlb-bytes NExplizite HugeTLB-AbbildungAbgelehntAbgelehnt
Eine kleine gesperrte residente Arbeitsmenge, begrenzt durch RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Beim Seitenfehler sperren und dabei die first-touch-Vorbereitung beibehalten
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Getrennte THP-Hinweisexperimente, keine globale THP-Konfiguration
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Eigene Abbildung an einen zulässigen physischen NUMA-Knoten binden
./memjitter -c 4 --numa-node 0 --duration 10
Explizite 2 MiB-HugeTLB-Seiten, nur wenn Pool und Hostunterstützung bereits verfügbar sind
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

Eine Sperre verhindert das Auslagern der Abbildung, solange sie gehalten wird; sie hält Daten nicht dauerhaft im CPU-Cache. Ein akzeptierter THP-Hinweisaufruf beweist keine Huge-Page-Hinterlegung. Das Zurücklesen der NUMA-Richtlinie unterscheidet sich von der beobachteten physischen Seitenplatzierung. NUMA-IDs liegen bei 0..4095 und müssen vom Host erlaubt sein.

Eine explizite HugeTLB-Größe muss eine Zweierpotenz größer als die Basis-Seitengröße des Betriebssystems sein, höchstens 1 GiB betragen und die Abbildungsgröße teilen. Sie ist nicht mit expliziter Sperrung oder THP-Hinweisen außer system kompatibel. Residente Vorbereitung erfordert erfolgreiches MADV_POPULATE_WRITE für diesen Bereich. Bestehender Pool, Quoten, Berechtigungen und erforderliche Kernel-Operation müssen die Anforderung unterstützen; es gibt keinen Rückfall auf gewöhnliche Seiten.

Angeforderte Richtlinie, erfolgreiche Operationen und beobachteter Abbildungszustand werden getrennt aufgezeichnet. Anfängliche Beobachtungen erscheinen in meta; abschließende Abbildungsbeobachtungen werden vor dem Aufheben an stderr geschrieben. Nicht verfügbare oder nicht zuordenbare Informationen bleiben null. Proc-Datei-Momentaufnahmen und Richtlinienprüfungen verursachen zusätzliche Servicearbeit; vergleichen Sie daher Durchläufe mit übereinstimmenden Richtlinien.

Jitter Tools 1.3.0

IRQjitter

Handler-Dauern und softirq-Wartezeiten beobachten, ohne die IRQ-Platzierung zu ändern.

IRQjitter verwendet einen Userspace-Lesethread und eine eigene tracefs-Instanz. Erforderliche IRQ-Tracepoints sind irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry und softirq_exit. Die Instanz muss die Trace-Uhr mono unterstützen. Es mountet tracefs nicht, ändert dessen Rechte nicht per chmod, ändert keine IRQ-/RSS-Affinität, stoppt irqbalance nicht und aktiviert kein alternatives Backend.

Bestehenden tracefs-Mount prüfen; tatsächlichen Mountpunkt verwenden
grep " tracefs " /proc/mounts
Expliziter tracefs-Mountpfad mit einer Übersichtszeile pro Sekunde
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

Collector-CPU und beobachtete CPUs

Collector auf CPU 1; nur CPUs 4 bis 7 beobachten
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Ohne --target-cpus werden unterstützte Ereignisse auf allen aktiven CPUs beobachtet, einschließlich der Collector-CPU. Eine CPU-Liste wie 2,4-7 schränkt die Erfassung ein, nicht nur die Darstellung. IRQ-Aktivität, die den gewählten Satz verlässt, liegt außerhalb der Abdeckung. CPU-Hotplug wird innerhalb des anfänglichen Rahmens möglicher CPUs überwacht; Änderungen werden mit Abdeckungsinformationen gemeldet.

Drei unterschiedliche Zeitmetriken

MetrikWas gemessen wirdEinordnung
irq_handler_elapsed_nsEin zusammengehöriges Action-Handler-Eintritts-/Austrittspaar auf derselben CPUUmfasst dazwischenliegende/verschachtelte Arbeit; keine Interrupt-Zustellungs-latency vom Gerät zur CPU.
softirq_elapsed_nsEin zusammengehöriges softirq-Vektor-Eintritts-/Austrittspaar auf derselben CPUKeine exklusive CPU-Zeit oder Verarbeitungszeit pro Paket.
softirq_observed_raise_to_entry_nsVom ersten gespeicherten beobachteten ausstehenden raise bis zum nächsten Eintritt auf dieser CPU/diesem VektorEine beobachtete, möglicherweise zusammengefasste Wartezeit; keine Wartezeit eines einzelnen Pakets.

Eine IRQ-Quelle wird durch Metrik, tatsächliche CPU, Quellennummer und Namen identifiziert. Zähler beschreiben abgeschlossene Handler-Beobachtungen, keine physischen Interrupts oder Pakete. Identische Quellennummer-/Namenspaare beweisen keine dauerhafte Geräteidentität über Neukonfigurationen hinweg. Ein Zeitwert von null kann die Auflösung textueller Trace-Zeitstempel widerspiegeln, meist im Mikrosekundenbereich, statt physisch null Zeit.

Übersicht, Details und Rohereignisse

Getrennte Durchläufe: Übersicht, kompakte Tabelle je Quelle und detaillierte JSON-Fenster
sudo ./irqjitter -c 1 -n 1 --duration 30
sudo ./irqjitter -c 1 -n 1 --details --duration 30
sudo ./irqjitter -c 1 -n 1 --json --duration 30 > irq.jsonl 2> irq.stderr.log
Kurze Roherfassung für eine beobachtete CPU
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details ist nur für kompakte Fenster gültig und nicht mit --json oder --raw kombinierbar. JSON bewahrt bereits Fensterdatensätze je CPU/Quelle. Diese Version enthält weder timerlat-Modus noch eBPF-Backend. Der echte TIMER-softirq bleibt beobachtbar.

Optionale NAPI-Arbeits-/Budgetbeobachtungen

NAPI ergänzt beide kompakten Ansichten um Arbeits-/Budgetbeobachtungen
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi erfordert einen unterstützten Tracepoint napi:napi_poll. Die Metrik ist napi_poll_work, Einheit work, nicht Nanosekunden. Sie meldet zurückgegebenen Arbeitswert und Budget. at_budget erfordert ein positives Budget und einen Arbeitswert gleich dem Budget; over_budget erfordert einen Arbeitswert größer als ein positives Budget. Keines von beiden beweist allein einen Paketrückstau. NAPI-Dauer, IRQ-zu-NAPI-latency und eine abgeleitete Hardware-Warteschlangen-ID werden nicht bereitgestellt.

Fenster- und Ressourceneinstellungen

EinstellungStandard und Bereich
--threshold NSNichtnegative Ganzzahl; gilt nur für Zeitreihen. Anders als bei CPU/MEM wird kein Metrikname angegeben.
--lateness SECStandard min(window / 10, 0.01 Sekunden). Bereich 0..window, bis zu neun Nachkommastellen. Nur Fenster.
--max-series N256 für Fenster, 4096 für Rohdaten; Bereich 1..4096.
--window-memory-mib N64; 1..512. Speicherobergrenze für Fenster.
--buffer-kb N256 je möglicher CPU; 16..16384.
--max-trace-mib N256; 1..4096. Konservatives Gesamtbudget für Kernel-Trace-Puffer, nicht der gesamte Prozessspeicher.
--output-bytes N8388608; 65536..8388608. Begrenzte Ausgabewarteschlange.
--write-timeout-ms N1000; 1..60000. Kooperative Ausgabefrist.
Zeitwerte über 10 Mikrosekunden im gewählten CPU-Bereich beobachten
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

Spät abgeschlossene Stichproben werden als verspätet gemeldet und weder in ein späteres Fenster verschoben noch zum Umschreiben alter Ausgabe verwendet. Langsame Ausgabe kann das Trace-Lesen verzögern und Kernel-Pufferverluste verursachen. Der Collector prüft Einstellungen und Pufferstatistiken, doch weder leere Lesezugriffe noch das Fehlen einer Verlustmeldung beweisen vollständige Abdeckung. Trace-Instrumentierung läuft auch auf Ereignis-CPUs, nicht nur auf der Collector-CPU.

Jitter Tools 1.3.0

Ausgabe verstehen

Messwerte, Abdeckung, statistische Grenzen und Durchlaufstatus trennen.

Kompakte CPU/MEM-Spalten

Nur Spaltenlayout, keine Messergebnisse
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
SpalteBedeutung
TIME(s)Fensterende relativ zum Beobachtungsbeginn, in Sekunden, nicht UTC.
COUNTAnzahl akzeptierter Beobachtungen in dieser Zeile.
MIN / MAXExakte Extremwerte der gemeldeten Ganzzahlwerte, bei Zeitmetriken in ns. Dies bestätigt keine physische Genauigkeit.
AVGMit Ganzzahlarithmetik auf 0.1 ns angezeigt; JSON bewahrt exakte Summe/Anzahl.
P99<= / P99.9<=Obergrenzen der entsprechenden Histogrammklassen, begrenzt durch beobachtete Extremwerte. Kein exakt sortiertes Perzentil oder Konfidenzintervall.
ACTIVE%Abgedeckte Messzeit geteilt durch Fensterdauer, keine CPU-Auslastung.
LOSSseen bedeutet, dass eine Verlustmeldung beobachtet wurde; das Flag bleibt gesetzt. Ein Strich bedeutet, dass keine Meldung gesehen wurde, nicht nachgewiesene Vollständigkeit.
QUALITYBeibehaltene Datenqualitätsklassifikation. partial kann unqualifizierte Instrumentierung beschreiben.
PARTyes bedeutet, dass das letzte Statistikfenster kürzer als die angeforderte Breite ist. Dies ist unabhängig von QUALITY.

Ein Zeitschwellenwert ergänzt ein Suffix wie >5000=N, wobei N die Anzahl streng oberhalb der Grenze ist. Eine leere Population hat COUNT=0 und NA-Statistiken, nicht null latency. IRQ --details ergänzt METRIC, SOURCE, UNIT und die NAPI-spezifischen Felder BUDGET_MAX, AT_BUDGET und OVER_BUDGET; nicht zutreffende Werte sind NA.

Spalten der IRQ-Übersicht

Standard-IRQ-Übersicht; --napi ergänzt eine eigene Arbeits-/Budgetgruppe
TIME(s) IRQ_N IRQ_P99<= IRQ_MAX SOFT_N SOFT_P99<= SOFT_MAX WAIT_N WAIT_P99<= WAIT_MAX PAIR_GAPS LATE BUFFER OTHER PART

IRQ, SOFT und WAIT sind getrennte Populationen. Jede vereint kompatible Quellhistogramme über die beobachteten CPUs für diese Metrik und dieses Fenster; Perzentile werden aus zusammengeführten Klassenanzahlen neu berechnet, nicht über Quellenperzentile gemittelt.

DiagnosespalteBedeutung
PAIR_GAPSAnzahl erkannter Paarungsmeldungen. Keine Anzahl verlorener Hardware-Interrupts oder Pakete.
LATEAbgeschlossene Stichproben, die nach Veröffentlichung ihres Fensters abgelehnt wurden. Unbekannte Anzahlen bleiben unbekannt.
BUFFERnot-observed, loss-observed oder unknown. not-observed bestätigt nicht die Abwesenheit von Verlusten.
OTHERAndere Diagnosemeldungen, keine IRQ-Anzahlen.
PARTEin kürzeres letztes Statistikfenster.

Zum Beispiel erhöht softirq_entry_without_observed_raise die Paarungsdiagnosezähler. Dies belegt keinen Trace-Ring-Überlauf, und eine gültige nachfolgende Eintritts-/Austrittsdauer kann weiterhin erhalten bleiben. Pufferstatistiken und textuelle Verlustmarkierungen können sich überschneiden; addieren Sie sie nicht zu einer erfundenen Gesamtverlustzahl.

Zusammenfassungen am Durchlaufende

Die kompakte Ausgabe druckt nach dem letzten Fenster einschließlich des letzten Teilfensters # SUMMARY, # TOTAL-Zeilen und einen Endstatus. CPU/MEM und IRQ-Details fassen jede Reihe zusammen; die IRQ-Übersicht erzeugt getrennte zusammengeführte Zeitsummen und optionale NAPI-Arbeitssummen. Die Zusammenfassung der IRQ-Übersicht enthält MAX_CPU und MAX_SOURCE, sodass das größte beobachtete Ereignis seine Quelle behält.

Gesamtergebnisse verwenden exakte Anzahlen und Summen vollständig gemeldeter Fenster, gewichteten Mittelwert, Extremwerte und zusammengeführte Histogrammklassen. Sie sind keine Mittelwerte von Fenstermittelwerten oder Perzentilen. scope=reported_windows schließt nicht gemeldete und verspätete Stichproben aus. Eine einem Maximum zugeordnete Quelle ist eine Beobachtungsidentität, keine nachgewiesene Grundursache.

JSON Lines für Automatisierung

Verwenden Sie --json, um Metadaten, Fenster je Reihe, Qualitätsgründe, Verlust-/Lückendatensätze und den abschließenden Enddatensatz zu behalten. Verwenden Sie --raw --json für Einzelstichproben. Kompakter Zusammenfassungstext wird nicht an JSON angehängt. Große Ganzzahlwerte wie Nanosekunden, Anzahlen und Summen sind Dezimalzeichenfolgen; parsen Sie sie als Ganzzahlen, nicht als Gleitkommazahlen. Ein null-Wert ist unbekannt, nicht null im numerischen Sinn.

Optionale jq-Beispiele zur Untersuchung einer gespeicherten JSONL-Datei
jq 'select(.type == "meta")' cpu.jsonl
jq 'select(.type == "end") | {execution, exit_code, quality, cleanup}' cpu.jsonl
jq 'select(.type == "window") | {series, stats, coverage}' cpu.jsonl

Der Enddatensatz trennt execution, Qualität und cleanup.confirmed. observations_aggregated ist für den Fenstermodus wichtig; observations_emitted gleich null bedeutet nicht, dass keine Daten erfasst wurden, wenn Werte in Fenstern aggregiert wurden. Bewahren Sie die vollständige Datei und stderr auf, statt nur ausgewählte Fensterzeilen.

Jitter Tools 1.3.0

Automatisierung und A/B-Durchläufe

Vollständige Durchläufe speichern und den Exit-Code des Erzeugers beibehalten.

Exit-CodeBedeutung
0Vollständige Ausführung/Daten unter dem gemeldeten Vertrag. Aktuelle Live-Erzeuger behalten stattdessen normalerweise den Status unqualified.
2CLI-, Fähigkeits-, Laufzeit-, Ausgabe- oder Bereinigungsfehler. stderr und jeden verfügbaren Enddatensatz prüfen.
3Teilweise oder unqualifizierte Daten. Kann ein funktional abgeschlossener Durchlauf mit bestätigter Bereinigung sein.
130Behandeltes SIGINT, etwa Ctrl+C, bei erfolgreicher Bereinigung.
143Behandeltes SIGTERM bei erfolgreicher Bereinigung.

Dies sind die dokumentierten Codes des Werkzeugs, keine Zusage für jede Shell, jeden Timeout-Wrapper oder jedes fatale Signal. Behalten Sie einen Status ungleich null bei; vermeiden Sie || true, um ein Ergebnis erfolgreich erscheinen zu lassen. Eine durch head geschlossene Pipe kann Abschlussdatensätze verhindern. --samples oder --duration ist der unterstützte Weg, eine Erfassung zu begrenzen.

Bash-Beispiel, das Ausgabe, Diagnose, Build-Identität und Exit-Status erhält
out="jitter-run-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir "$out"
./cpujitter --build-info > "$out/build-info.json"

if ./cpujitter -c 4 -n 1 --duration 30 --json \
    > "$out/cpu.jsonl" 2> "$out/cpu.stderr.log"; then
    rc=0
else
    rc=$?
fi
printf "%s\n" "$rc" > "$out/exit-code.txt"
printf "Saved %s, exit code %s\n" "$out" "$rc"

case "$rc" in
  0) echo "Completed; inspect the end record." ;;
  3) echo "Partial/unqualified; inspect quality and cleanup before comparing." ;;
  *) echo "Run did not complete normally; inspect diagnostics." >&2 ;;
esac

Gleichartige Durchläufe vergleichen

Verwenden Sie für einen Vergleich zwischen Standardkernel und HFTKernel denselben Programm-Build, dieselbe CPU-Rolle, Speichermodus, Operation, Muster, Größe, Seed, Reset-Richtlinie, explizite Speicherrichtlinien, Zählerlesemodus, Blockgröße, Ausgabeziel, Fenstergröße und Dauer. Bewahren Sie Kernel-, Topologie- und Scheduler-Metadaten jedes Durchlaufs auf. Ändern Sie die beabsichtigte Variable, statt zugleich die Messdefinition zu ändern.

Führen Sie jedes Experiment separat aus. Diese Version erlaubt zwei aktive Werkzeuge auf derselben CPU, ihre Durchläufe beeinflussen sich dann jedoch gegenseitig und sind keine unabhängigen Baselines. Halten Sie diagnostisches Tracing von der primären A/B-Messung getrennt, wenn verhindert werden soll, dass nur auf einer Seite zusätzliche Trace-Last entsteht.

Vergleichen Sie Anzahlen, Verteilungen, Maxima, Schwellenüberschreitungen, Abdeckung und Qualität gemeinsam. Mitteln Sie p99-Werte nicht über Durchläufe oder Fenster. Ein kompaktes Gesamtergebnis führt gemeldete Histogramme innerhalb dieses Durchlaufs zusammen; exakte populationsbezogene Analysen über mehrere Durchläufe erfordern die Aufbewahrung kompatibler zugrunde liegender Daten. CLI und Messpopulationen von CPU/MEM 3.x sind nicht mit den älteren, bereits auf der HFTKernel-Website veröffentlichten 2.x-Benchmarkprofilen austauschbar.

Jitter Tools 1.3.0

Fehlerbehebung

Die fehlgeschlagene Phase ermitteln, ohne das Experiment stillschweigend zu ändern.

BeobachtungInterpretation und nächste Prüfung
Direkt nach dem Start keine ZeileCPU/MEM bereiten zuerst vor und kalibrieren. Danach muss ein vollständiges -n-Fenster verstreichen. Ein kürzerer begrenzter Durchlauf gibt sein letztes Teilfenster aus.
CPU abgelehnt oder AffinitätsfehlerAngeforderte Linux-CPU-ID, Online-Status und cpuset-Berechtigungen prüfen. Wählen Sie explizit eine gültige CPU; das Werkzeug wählt nicht stillschweigend eine andere.
Zählerzugriffs- oder KalibrierungsfehlerZähler- und Uhrdiagnose prüfen. CPU/MEM erfordern nutzbare architekturspezifische Zähler; diese CLI bietet keinen Rückfall auf eine alternative Uhr.
Exit-Code 3 / partial / producer_unqualifiedAusführung und Bereinigung als getrennte Tatsachen lesen. Dieser Status allein belegt weder überlastete IRQ-Behandlung noch fehlerhaftes Kernel-Tuning.
IRQ-Werte null oder NANull kann die Trace-Zeitstempelauflösung widerspiegeln; NA kann bedeuten, dass keine Stichprobe abgeschlossen wurde. Keines beweist ein verzögerungsfreies System.
softirq_entry_without_observed_raiseEin unvollständiges beobachtetes ausstehendes Paar. PAIR_GAPS und detailliertes JSON prüfen; nicht als Paketverlust oder Ringüberlauf bezeichnen.
Verspätete Ereignisse oder PufferverlustVerlustnachweise behalten. Ereignisumfang, Ausgabegeschwindigkeit und Ressourcenbudgets prüfen. Kürzere Fenster und Rohausgabe können Last erhöhen. Ein neuer Durchlauf mit geänderten Einstellungen ist eine andere Konfiguration.
tracefs-Instanz kann nicht geöffnet/erstellt werdenMount, Berechtigungen, mono-Uhr und unterstützte Ereignisformate prüfen. Das Programm mountet nicht, führt kein chmod aus und übernimmt keine fremde Sitzung.
record-cmd oder record-tgid fehlen in einer InstanzDiese globalen Caches sind für diesen Collector optional. Diagnostizieren Sie die tatsächlich erforderliche Einstellung und errno; ändern Sie globale Caches nicht nur, um das Werkzeug zufriedenzustellen.
NAPI angefordert, aber nicht unterstütztDie --napi-Anforderung scheitert ausdrücklich. Führen Sie einen Durchlauf ohne --napi nur als bewusst getrenntes reines IRQ-Experiment aus.
mlock-/NUMA-/HugeTLB-Anforderung abgelehnterrno, Sperrgrenze, zulässige Knoten, bestehenden Huge-Page-Pool und Hostunterstützung prüfen. Es erfolgen weder automatische Rechteerhöhung noch Poolbereitstellung oder Richtlinienrückfall.
Ausgabe-Timeout, EPIPE oder fehlender EnddatensatzDie Ausgabe ist unvollständig. Bewahren Sie stderr auf, verwenden Sie begrenzte Durchläufe und ein ausreichend schnelles Ziel. Klassifizieren Sie eine abgeschnittene Erfassung nicht als vollständig.
Bereinigungsfehler oder zurückgebliebene Instanzcleanup.errors und recovery_required prüfen. Vor jedem Administratoreingriff die gemeldete eigene Instanz und das Fehlen eines aktiven Besitzers verifizieren. tracefs-Instanzen nicht rekursiv löschen.

Geordnetes IRQ-Beenden stoppt die Aufzeichnung, leert innerhalb begrenzter Grenzen, deaktiviert eigene Ereignisse, schließt Deskriptoren, entfernt nur die eigene Instanz und stellt die Affinität wieder her. Ein behandelter Fehler bleibt ein Fehler, auch wenn spätere Bereinigung Ressourcen freigibt. Bei SIGKILL und Hostausfall ist eine vollständige Instanzentfernung nicht garantiert.

Quellcodereferenzen

Versionsgebundene Implementierungsreferenzen

Dieses Handbuch basiert auf dem bereitgestellten Jitter Tools 1.3.0-Quellcode, den CLI-Parsern und den Messverträgen. Es bestätigt weder die Genauigkeit realer Zeitmessungen noch die Kompatibilität mit jeder Distribution. Die folgenden Quelldateipfade sind relativ zum Quellarchiv.

Quellarchiv: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Versionsidentität und Build-Ablauf
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Befehlszeilenparser und Validierung
  • tools/cpujitter/src/cli.rs
  • tools/memjitter/src/cli.rs
  • tools/irqjitter/src/cli.rs
  • vendor/jitter-common/src/interval.rs
  • docs/CLI_TRACEFS.md
S3. CPU-Erfassung, Uhren und Platzierung
  • tools/cpujitter/src/counter.rs
  • tools/cpujitter/src/model.rs
  • tools/cpujitter/src/runtime.rs
  • vendor/jitter-common/src/observed_placement.rs
  • docs/CPUJITTER.md
  • docs/LAUNCH.md
S4. Residente Speicheroperationen
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. First-touch- und Allokationsmodi
  • tools/memjitter/src/first_touch.rs
  • tools/memjitter/src/first_touch_runtime.rs
  • tools/memjitter/src/alloc.rs
  • tools/memjitter/src/alloc_runtime.rs
  • tools/memjitter/native/allocation.c
  • docs/FIRST_TOUCH.md
  • docs/ALLOC.md
S6. Explizite Speicherrichtlinien je Abbildung
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Passive IRQ-Erfassung und tracefs-Lebenszyklus
  • tools/irqjitter/src/engine.rs
  • tools/irqjitter/src/parser.rs
  • tools/irqjitter/src/runtime.rs
  • tools/irqjitter/src/session.rs
  • tools/irqjitter/src/native.rs
  • docs/IRQJITTER.md
  • docs/CLI_TRACEFS.md
S8. IRQ-Fenster, Übersicht und NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Ausgabe, Histogramme, Zusammenfassung und Datenstromschema
  • vendor/jitter-common/src/compact.rs
  • vendor/jitter-common/src/run_summary.rs
  • vendor/jitter-common/src/histogram.rs
  • vendor/jitter-common/src/record.rs
  • vendor/jitter-common/src/lifecycle.rs
  • docs/OUTPUT.md
  • contracts/stream/schemas/stream.schema.json
  • contracts/stream/contracts/metrics.json