Guida utente degli strumenti di misurazione

Misura il comportamento di CPU, memoria e IRQ.

Comandi, limiti di misurazione, campi di output e confronti riproducibili per Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Inizia qui

Scegli uno strumento, verificane la versione ed esegui una misurazione limitata.

Jitter Tools 1.3.0 fornisce tre strumenti autonomi a riga di comando per Linux. CPUJitter osserva gli intervalli di mancata esecuzione su una CPU. MEMjitter misura operazioni di memoria dichiarate. IRQjitter osserva eventi IRQ e softirq del kernel tramite tracefs. Usali separatamente per rispondere a una domanda di misurazione specifica.

ComponenteVersione trattataDomanda principale
CPUJitter3.2.2Quanto durano gli intervalli tra letture consecutive del contatore sulla CPU selezionata?
MEMjitter3.5.2Quanto durano accessi residenti, prime scritture o chiamate mmap riuscite?
IRQjitter1.3.0Quali handler IRQ/softirq e attese osservati hanno tempi trascorsi lunghi?
Flusso leggibile da macchinajitter.stream/0.6.0Come vengono registrate misurazioni, copertura, qualità e pulizia?
Da una directory contenente i tre eseguibili
./cpujitter --version
./memjitter --version
./irqjitter --version

Gli esempi seguenti vengono eseguiti da una distribuzione binaria estratta. Dopo una build dai sorgenti, gli stessi eseguibili si trovano in ./bin/. Se installati nel PATH, ometti il prefisso ./. I numeri CPU sono esempi, non raccomandazioni di collocazione per la produzione. Sostituiscili con ID CPU Linux consentiti e online sul tuo host.

Leggi i limiti CPU e dei nodi di memoria del processo corrente
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
Intervalli di esecuzione CPU, un riepilogo al secondo
./cpujitter -c 4 --duration 10
Letture di byte residenti, un riepilogo al secondo
./memjitter -c 4 --duration 10
Panoramica IRQ; la CPU 1 esegue il collector, vengono osservate tutte le CPU online
sudo ./irqjitter -c 1 --duration 10

Esegui questi esempi uno alla volta. I test CPU e memoria sono carichi di lavoro attivi. IRQjitter è passivo nel senso che non genera traffico di prova, ma tracciamento e raccolta comportano comunque overhead. CPU/MEM non richiedono root, SMT disabilitato, isolamento CPU, una CPU esclusiva o HFTKernel. La raccolta IRQ richiede accesso a un mount tracefs esistente e il permesso di creare una propria istanza; sudo è un modo per fornire questi permessi.

Jitter Tools 1.3.0

Compila e verifica

Mantieni separate le verifiche della build dai sorgenti e quelle della distribuzione binaria.

L'archivio 1.3.0 fornito contiene solo sorgenti. Non contiene eseguibili ELF pronti all'uso. La qualificazione registrata non attesta una build Rust completata o un'esecuzione IRQ reale. Il punto di ingresso supportato per i sorgenti è test.sh; compila e testa prima di pubblicare i binari.

Requisito di compilazioneAmbito
Linux GNU, x86_64 o aarch64Compila nativamente per l'architettura dell'host.
Rust 1.85 o successivo, rustfmt e clippyCompilatore e controlli di qualità Rust.
Compilatore C, ar, file di sviluppo della libc statica, readelfCodice ABI nativo, collegamento GNU-static e verifiche ELF.
Python 3.10 o successivo e i requisiti dei testTest dei sorgenti e orchestrazione della build. Python non è richiesto dagli eseguibili di misurazione risultanti.
Punto di ingresso supportato per compilazione e test dei sorgenti
cd jitter-tools-1.3.0
./test.sh

Cargo viene eseguito offline con un insieme di dipendenze bloccato e senza dipendenze da registry. Le dipendenze dei test Python possono essere predisposte in .test-env/ all'interno del progetto. Usa --offline quando l'ambiente è già pronto e i download dagli indici dei pacchetti devono essere disabilitati.

Esecuzione di accettazione dei sorgenti con dipendenze già disponibili
./test.sh --offline --acceptance

Dopo il superamento di tutti i controlli richiesti, il processo pubblica bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json e un archivio statico di rilascio con versione. I riferimenti pubblici all'archivio usano il nome canonico jitter-tools-1.3.0.tgz. Il bundle include BUILD.json, ELF.json, checksum, avvisi e documentazione. Non considerare una build dai sorgenti completata solo in parte come una distribuzione statica qualificata.

In una distribuzione binaria estratta, test.sh verifica i file consegnati
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

Il test.sh della distribuzione binaria richiede sh, readelf, sha256sum e grep. Non è il runner di compilazione dei sorgenti. Gli eseguibili GNU-static non richiedono Rust, Python, un interprete ELF o librerie condivise adiacenti durante l'esecuzione. Richiedono comunque un kernel Linux compatibile con l'architettura, le chiamate di sistema necessarie e /proc e /sys; IRQjitter richiede anche tracefs. Le verifiche ELF attestano il confezionamento, non garantiscono precisione delle misurazioni o supporto su ogni versione del kernel.

Jitter Tools 1.3.0

Controlli comuni

Seleziona una CPU, definisci un limite di esecuzione e scegli l'output a finestre o grezzo.

ControlloComportamento
-c CPURichiesto per tutte le misurazioni. Un singolo ID CPU Linux decimale, 0..65535. Non sono accettati elenchi o intervalli. Nessuna CPU alternativa automatica.
-n SECAmpiezza della finestra e intervallo di riepilogo; predefinito 1 secondo, intervallo 0.001..86400. Non imposta la frequenza di campionamento.
--duration SECDurata di osservazione limitata, 0.001..86400 secondi. Preparazione e calibrazione CPU/MEM precedono l'osservazione.
--samples NSolo CPU/MEM. Interrompe dopo un numero positivo di osservazioni completate. IRQjitter non ha l'opzione --samples.
--jsonJSON Lines. Mantiene le finestre predefinite di un secondo, a meno che non venga fornito anche --raw.
--rawOsservazioni individuali con record di protocollo completi. Non combinabile con -n o controlli riservati alle finestre.
--help, --version, --build-infoEsegui separatamente ogni opzione informativa. Non sono necessari -c, calibrazione o misurazione.

CPU/MEM accettano anche --cpu e --interval. IRQjitter 1.3.0 usa solo -c e -n per questi controlli. Tutti e tre accettano valori brevi uniti all'opzione come -c4 -n0.1. Usa secondi decimali semplici, per esempio 0.1, non 100ms, 1e-1 o .1. Le opzioni ripetute vengono rifiutate.

Finestre statistiche di 100 ms; il ciclo di acquisizione continua tra i riepiloghi
./cpujitter -c4 -n0.1 --duration 5
Acquisizione grezza limitata; nessuna opzione -n
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

I dati vanno a stdout e la diagnostica a stderr. Reindirizzare stdout non seleziona la modalità JSON o grezza. Usa una durata limitata o Ctrl+C per interrompere. Un SIGINT/SIGTERM gestito emette i record finali quando il canale di output rimane utilizzabile e la pulizia riesce. Una chiamata di sistema bloccata, SIGKILL, un guasto dell'host o una pipe chiusa impediscono qualsiasi garanzia di arresto immediato o output finale completo.

Jitter Tools 1.3.0

CPUJitter

Misura intervalli di esecuzione consecutivi su una CPU selezionata.

La metrica cpu_iteration_elapsed_ns è il tempo trascorso calibrato tra letture consecutive del contatore hardware in un batch di acquisizione. Include il ramo del ciclo, la memorizzazione del timestamp e l'overhead di lettura del contatore. Non è il numero di cicli del core CPU, una misura della consegna degli interrupt dei dispositivi o una classificazione diretta della causa di una pausa.

ordered è la modalità predefinita di lettura del contatore; relaxed è un'alternativa esplicita con un contesto distinto. La calibrazione usa sette segmenti di almeno 50 ms rispetto a CLOCK_MONOTONIC_RAW, con una scala fissa per l'esecuzione. Non vengono sottratti né il riferimento né il costo del contatore. Su x86 sono richiesti supporto invariant-TSC dichiarato e accesso utilizzabile al contatore; i contatori non supportati vengono rifiutati anziché sostituiti silenziosamente.

Separa le esecuzioni ordered e relaxed; mantieni separate le relative distribuzioni
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Conta gli intervalli strettamente superiori a 5 microsecondi, senza filtrare alcun campione
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Salva finestre, metadati e stato di terminazione
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
Controllo specifico della CPU o dell'acquisizioneValore predefinito e intervallo
--counter-read ordered|relaxedordered. Confronta contesti di lettura del contatore equivalenti.
--batch-records N4096; 1..65536. Capacità preallocata del batch di letture consecutive.
--buffer-bytes N8388608; 16384..8388608. Coda stdout limitata.
--write-timeout-ms N1000; 1..60000. Scadenza cooperativa per l'output, non una garanzia di tempo reale rigido.
--threshold cpu_iteration_elapsed_ns=NNanosecondi interi non negativi. Conta i valori > N nelle finestre.

Un batch contiene un timestamp iniziale e osservazioni completate. L'acquisizione è separata da ancoraggi temporali, validazione, aggregazione e output. Un budget cooperativo del contatore verifica circa 20 ms di lavoro di acquisizione ogni 256 record; non tronca un grande ritardo osservato. ACTIVE% descrive la porzione di acquisizione coperta, non l'utilizzo totale della CPU. Le pause al di fuori dell'acquisizione non vengono osservate da questa metrica.

I nanosecondi vengono calcolati con aritmetica intera verificata e arrotondamento al più vicino: (delta_ticks * 1000000000 + hz / 2) / hz. I timestamp degli eventi per l'assegnazione alle finestre usano la mappatura delimitata dal contatore a MONOTONIC. Il valore e il relativo intervallo iniziale/finale mappato hanno scopi diversi e non devono essere numericamente identici. La precisione fisica sconosciuta rimane null nel flusso.

Jitter Tools 1.3.0

MEMjitter

Scegli accessi residenti, first-touch o latency delle chiamate mmap.

ModalitàMetricaOperazione cronometrata
resident, predefinitomem_resident_operation_nsUna lettura di byte, una lettura/modifica/scrittura non atomica o un passo di pointer-chase.
first-touchmem_first_touch_nsUna scrittura volatile di un byte su un offset non toccato in un'epoca di mapping/reset verificata.
allocmem_alloc_call_nsUna chiamata API mmap privata anonima riuscita; nessun accesso alle pagine o munmap all'interno dell'intervallo cronometrato.

Letture residenti e lettura/modifica/scrittura

Le impostazioni predefinite sono resident, read, sequential, un mapping di 16777216 byte (16 MiB), un passo pari alla pagina di sistema, offset 0 e seed 1. La preparazione tocca ogni pagina base, riscalda il piano di accesso e controlla la residenza iniziale con mincore. Senza un blocco esplicito, questa istantanea non garantisce una residenza continua.

Test residenti separati: letture predefinite e RMW casuale non atomico di byte
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read misura un caricamento volatile di un byte. rmw misura caricamento di un byte, incremento con riavvolgimento e scrittura; non è atomico e non misura il completamento della scrittura visibile globalmente. L'intervallo cronometrato include l'overhead di timestamp/fence. Il risultato non è pura latency DRAM.

Pointer chase dipendente

Una catena dipendente attraverso gli offset selezionati
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase seleziona automaticamente pointer-chase se non viene esplicitato un pattern. Un pattern esplicito deve essere anch'esso pointer-chase. Gli altri pattern residenti sono sequential, random con reinserimento e permutation. Selezione degli indirizzi e contabilità sono esterne a ogni operazione misurata. Un mapping di 16 MiB con passo di una pagina su un host con pagine da 4096 byte ha 4096 posizioni campionate, non 16 MiB di dati letti a ogni passaggio.

Scritture first-touch

Mapping nuovi, con reset esterno alla scrittura cronometrata
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Scarto esplicito con MADV_DONTNEED e ordine di accesso ripetibile
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch consente sequential o permutation, senza reinserimento all'interno di un'epoca. write è l'unica operazione e non deve essere specificata. Dopo ogni remap/scarto riuscito, mincore deve confermare l'assenza di pagine residenti prima che inizi una nuova epoca. Il lavoro di reset è tempo di servizio escluso. La prima scrittura di un byte non corrisponde necessariamente a un page fault separato o a un'allocazione fisica di pagina, soprattutto quando THP copre più offset. Remap e madvise sono esperimenti diversi.

Chiamate API di allocazione

Semplice latency delle chiamate mmap; sono esecuzioni separate
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc crea al massimo un mapping di sua proprietà alla volta e lo smappa prima della chiamata successiva. Solo gli intervalli mmap riusciti entrano nell'istogramma. mmap stabilisce un mapping virtuale, non la popolazione fisica di ogni pagina. Il wrapper C ABI/libc e l'intervallo di timestamp rimangono parte del valore. Il precedente alloc-cycle, la latency malloc/calloc e la generazione automatica di pressione sulla memoria non sono implementati da questa modalità.

Opzioni di disposizione e modalità

OpzioneValori e vincoli
--moderesident | first-touch | alloc; predefinito resident.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NByte decimali, multiplo della pagina; predefinito 16777216, massimo 1073741824. Non una stringa con suffisso MiB.
--stride-bytes NAlmeno una pagina del sistema operativo, allineato alla pagina e divisore di --bytes; predefinito pari alla dimensione della pagina di sistema. Solo resident/first-touch.
--offset-bytes NOffset in byte all'interno di una pagina base campionata; predefinito 0. Chase richiede anche allineamento e spazio per usize.
--seed NIntero diverso da zero; predefinito 1. Solo resident/first-touch.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetSolo first-touch: remap (predefinito) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msStessi valori predefiniti e limiti di CPUJitter.
--threshold METRIC=NUsa la metrica precisa per la modalità selezionata; confronto stretto > nelle finestre.
Conta i valori first-touch superiori a 20 microsecondi
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc rifiuta le opzioni pattern, stride, offset, seed e reset, anche quando i valori assomigliano ai predefiniti. Nessuna modalità di memoria accetta --counter-read di CPUJitter. Mantieni la stessa operazione, pattern, byte, passo, offset, seed, reset e modalità di output quando confronti i risultati.

Jitter Tools 1.3.0

Politiche di memoria

Applica le politiche facoltative solo al mapping di proprietà dello strumento.

Le impostazioni predefinite sono --lock none, --thp system, politica NUMA ereditata e nessuna richiesta HugeTLB esplicita. Lo strumento non riconfigura il sistema, non aumenta i limiti di blocco, non modifica un pool di huge page e non riprova con una politica più debole. Una richiesta esplicita non supportata fallisce indicandone il motivo.

Politicaresidentfirst-touchalloc
--lock nonePredefinitoPredefinitoConsentito
--lock residentmlock prima della preparazioneRifiutatoRifiutato
--lock onfaultmlock2, seguito dalla preparazione residenteSolo con --reset remapRifiutato
--thp systemPredefinito, nessun suggerimentoPredefinito, nessun suggerimentoConsentito
--thp never o --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEConsentito e riapplicato dopo remapRifiutato
--numa-node NMPOL_BIND limitato all'intervalloMPOL_BIND limitato all'intervalloRifiutato
--hugetlb-bytes NMapping HugeTLB esplicitoRifiutatoRifiutato
Un piccolo insieme di lavoro residente bloccato, soggetto a RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Blocca al page fault preservando la preparazione first-touch
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Esperimenti separati di suggerimenti THP, non configurazione THP globale
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Associa il mapping di proprietà a un nodo NUMA fisico consentito
./memjitter -c 4 --numa-node 0 --duration 10
Pagine HugeTLB esplicite da 2 MiB, solo quando pool e supporto dell'host sono già disponibili
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

Il blocco impedisce lo swapping del mapping finché è mantenuto; non colloca permanentemente i dati nella cache CPU. Una chiamata di suggerimento THP accettata non dimostra il supporto tramite huge page. La rilettura della politica NUMA è distinta dalla collocazione fisica osservata delle pagine. Gli ID NUMA sono 0..4095 e devono essere consentiti dall'host.

Una dimensione HugeTLB esplicita deve essere una potenza di due maggiore della pagina base del sistema operativo, al massimo 1 GiB, e dividere la dimensione del mapping. È incompatibile con blocco esplicito o suggerimenti THP diversi da system. La preparazione residente richiede MADV_POPULATE_WRITE riuscito per quell'intervallo. Pool esistente, quote, permessi e operazione del kernel richiesta devono supportare la richiesta; non esiste un ripiego su pagine ordinarie.

Politica richiesta, operazioni riuscite e stato osservato del mapping vengono registrati separatamente. Le osservazioni iniziali compaiono in meta; quelle finali del mapping vengono scritte su stderr prima dello smappaggio. Le informazioni non disponibili o non attribuibili rimangono null. Istantanee dei file proc e verifiche delle politiche aggiungono lavoro di servizio; confronta quindi esecuzioni con politiche corrispondenti.

Jitter Tools 1.3.0

IRQjitter

Osserva le durate degli handler e le attese softirq senza modificare la collocazione IRQ.

IRQjitter usa un thread di lettura userspace e una propria istanza tracefs. I tracepoint IRQ richiesti sono irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry e softirq_exit. L'istanza deve supportare il clock di tracciamento mono. Non monta tracefs, non ne modifica i permessi con chmod, non cambia l'affinità IRQ/RSS, non arresta irqbalance e non abilita un backend alternativo.

Verifica un mount tracefs esistente; usa il suo punto di montaggio effettivo
grep " tracefs " /proc/mounts
Percorso esplicito del mount tracefs, con una riga di panoramica al secondo
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

CPU del collector e CPU osservate

Collector sulla CPU 1; osserva solo le CPU da 4 a 7
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Senza --target-cpus, vengono osservati gli eventi supportati su tutte le CPU online, inclusa la CPU del collector. Un elenco CPU come 2,4-7 limita la raccolta, non solo la presentazione. L'attività IRQ che si sposta fuori dall'insieme selezionato è fuori copertura. L'hotplug CPU viene monitorato entro l'insieme iniziale delle CPU possibili e le modifiche vengono segnalate con informazioni sulla copertura.

Tre metriche temporali distinte

MetricaChe cosa misuraInterpretazione
irq_handler_elapsed_nsUn ingresso/uscita corrispondente dell'action-handler sulla stessa CPUInclude attività interposte/annidate; non è la latency di consegna dell'interrupt dal dispositivo alla CPU.
softirq_elapsed_nsUn ingresso/uscita corrispondente del vettore softirq sulla stessa CPUNon è tempo CPU esclusivo né tempo di elaborazione per pacchetto.
softirq_observed_raise_to_entry_nsDal primo raise pendente osservato e salvato al successivo ingresso su quella CPU/vettoreUn'attesa osservata, potenzialmente aggregata; non il tempo di attesa di un singolo pacchetto.

Una sorgente IRQ è identificata da metrica, CPU effettiva, numero e nome della sorgente. I conteggi descrivono osservazioni di handler completate, non interrupt fisici o pacchetti. Coppie identiche di numero/nome della sorgente non dimostrano un'identità persistente del dispositivo attraverso le riconfigurazioni. Un tempo trascorso pari a zero può riflettere la risoluzione dei timestamp testuali delle tracce, comunemente a livello di microsecondi, anziché un tempo fisico nullo.

Panoramica, dettagli ed eventi grezzi

Esecuzioni separate: panoramica, tabella compatta per sorgente e finestre JSON dettagliate
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
Breve acquisizione grezza per una CPU osservata
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details è valido solo per finestre compatte e non può essere combinato con --json o --raw. JSON conserva già i record di finestra per CPU/sorgente. Questa versione non contiene una modalità timerlat o un backend eBPF. Il vero softirq TIMER rimane osservabile.

Osservazioni facoltative di lavoro/budget NAPI

NAPI aggiunge osservazioni di lavoro/budget a entrambe le viste compatte
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi richiede un tracepoint napi:napi_poll supportato. La metrica è napi_poll_work, unità work, non nanosecondi. Riporta il valore di lavoro restituito e il budget. at_budget richiede un budget positivo con lavoro uguale al budget; over_budget richiede lavoro superiore a un budget positivo. Nessuno dei due dimostra da solo un arretrato di pacchetti. Non vengono forniti durata NAPI, latency da IRQ a NAPI o un ID di coda hardware dedotto.

Controlli delle finestre e delle risorse

OpzioneValore predefinito e intervallo
--threshold NSIntero non negativo; si applica solo alle serie temporali. Diversamente da CPU/MEM, non viene fornito un nome di metrica.
--lateness SECPredefinito min(window / 10, 0.01 secondi). Intervallo 0..window, fino a nove cifre decimali. Solo finestre.
--max-series N256 per finestre, 4096 per dati grezzi; intervallo 1..4096.
--window-memory-mib N64; 1..512. Limite di memoria delle finestre.
--buffer-kb N256 per CPU possibile; 16..16384.
--max-trace-mib N256; 1..4096. Budget totale conservativo dei buffer di tracciamento del kernel, non la memoria totale del processo.
--output-bytes N8388608; 65536..8388608. Coda di output limitata.
--write-timeout-ms N1000; 1..60000. Scadenza cooperativa per l'output.
Osserva valori temporali superiori a 10 microsecondi nell'ambito CPU selezionato
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

I campioni completati in ritardo vengono segnalati come tardivi e non spostati in una finestra successiva né usati per riscrivere output precedente. Un output lento può ritardare la lettura delle tracce e causare perdite nei buffer del kernel. Il collector verifica controlli e statistiche dei buffer, ma né letture vuote né assenza di avvisi di perdita dimostrano una copertura completa. La strumentazione di tracciamento gira anche sulle CPU degli eventi, non solo sulla CPU del collector.

Jitter Tools 1.3.0

Leggi l'output

Separa valori misurati, copertura, limiti statistici e stato dell'esecuzione.

Colonne compatte CPU/MEM

Solo disposizione delle colonne, non risultati di misurazione
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
ColonnaSignificato
TIME(s)Fine della finestra rispetto all'inizio dell'osservazione, in secondi, non UTC.
COUNTNumero di osservazioni accettate in quella riga.
MIN / MAXEstremi esatti dei valori interi riportati, in ns per le metriche temporali. Non attesta la precisione fisica.
AVGVisualizzato a 0.1 ns usando aritmetica intera; JSON conserva somma/conteggio esatti.
P99<= / P99.9<=Limiti superiori delle classi corrispondenti dell'istogramma, limitati dagli estremi osservati. Non un percentile ordinato esatto né un intervallo di confidenza.
ACTIVE%Tempo di misurazione coperto diviso per la durata della finestra, non utilizzo della CPU.
LOSSseen indica che è stato osservato un avviso di perdita; il flag rimane impostato. Un trattino indica che non è stato visto alcun avviso, non completezza dimostrata.
QUALITYClassificazione della qualità dei dati conservata. partial può descrivere strumentazione non qualificata.
PARTyes indica che l'ultima finestra statistica è più breve dell'ampiezza richiesta. È indipendente da QUALITY.

Una soglia temporale aggiunge un suffisso come >5000=N, dove N è il conteggio strettamente superiore al limite. Una popolazione vuota ha COUNT=0 e statistiche NA, non latency zero. IRQ --details aggiunge METRIC, SOURCE, UNIT e i campi specifici NAPI BUDGET_MAX, AT_BUDGET e OVER_BUDGET; i valori non applicabili sono NA.

Colonne della panoramica IRQ

Panoramica IRQ predefinita; --napi aggiunge un gruppo lavoro/budget separato
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 e WAIT sono popolazioni separate. Ciascuna combina gli istogrammi compatibili delle sorgenti sulle CPU osservate per quella metrica e finestra; i percentili vengono ricalcolati dai conteggi delle classi raggruppate, non mediati tra i percentili delle sorgenti.

Colonna diagnosticaSignificato
PAIR_GAPSNumero di avvisi di abbinamento rilevati. Non è un conteggio di interrupt hardware o pacchetti persi.
LATECampioni completati rifiutati dopo la pubblicazione della loro finestra. I conteggi sconosciuti rimangono tali.
BUFFERnot-observed, loss-observed o unknown. not-observed non certifica l'assenza di perdite.
OTHERAltri avvisi diagnostici, non conteggi IRQ.
PARTUna finestra statistica finale più breve.

Per esempio, softirq_entry_without_observed_raise incrementa la diagnostica di abbinamento. Non dimostra un overflow del ring di tracciamento e una durata ingresso/uscita valida successiva può comunque essere conservata. Statistiche dei buffer e marcatori testuali di perdita possono sovrapporsi; non sommarli in un conteggio totale di perdite artificioso.

Riepiloghi di fine esecuzione

L'output compatto stampa # SUMMARY, righe # TOTAL e uno stato finale dopo l'ultima finestra, inclusa quella parziale finale. CPU/MEM e i dettagli IRQ riepilogano ogni serie; la panoramica IRQ produce totali temporali raggruppati separati e totali facoltativi del lavoro NAPI. Il riepilogo della panoramica IRQ include MAX_CPU e MAX_SOURCE, così l'evento massimo osservato mantiene la propria sorgente.

I totali usano conteggi e somme esatti delle finestre interamente riportate, media ponderata, estremi e classi di istogramma unite. Non sono medie delle medie o dei percentili delle finestre. scope=reported_windows esclude i campioni non riportati e tardivi. Una sorgente associata a un massimo è un'identità di osservazione, non una causa primaria dimostrata.

JSON Lines per l'automazione

Usa --json per conservare metadati, finestre per serie, motivi di qualità, record di perdite/interruzioni e record finale. Usa --raw --json per i singoli campioni. Il testo compatto dei riepiloghi non viene aggiunto a JSON. I valori interi ampi come nanosecondi, conteggi e somme sono stringhe decimali; interpretali come interi, non numeri in virgola mobile. Un valore null è sconosciuto, non zero.

Esempi jq facoltativi per esaminare un file JSONL salvato
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

Il record finale separa execution, qualità e cleanup.confirmed. observations_aggregated è importante per la modalità a finestre; observations_emitted uguale a zero non significa che non siano stati raccolti dati se i valori sono stati aggregati in finestre. Conserva il file completo e stderr, invece delle sole righe di finestra selezionate.

Jitter Tools 1.3.0

Automazione ed esecuzioni A/B

Salva esecuzioni complete e conserva il codice di uscita del produttore.

Codice di uscitaSignificato
0Esecuzione/dati completi secondo il contratto riportato. I produttori live attuali normalmente mantengono invece lo stato non qualificato.
2Errore di CLI, capacità, esecuzione, output o pulizia. Esamina stderr e ogni record finale disponibile.
3Dati parziali o non qualificati. Può essere un'esecuzione funzionalmente completata con pulizia confermata.
130SIGINT gestito, come Ctrl+C, quando la pulizia riesce.
143SIGTERM gestito quando la pulizia riesce.

Questi sono i codici documentati dello strumento, non una promessa per ogni shell, wrapper di timeout o segnale fatale. Conserva uno stato diverso da zero; evita di aggiungere || true per far apparire riuscito un risultato. Una pipe chiusa da head può impedire i record finali. --samples o --duration è il modo supportato per limitare un'acquisizione.

Esempio Bash che conserva output, diagnostica, identità della build e stato di uscita
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

Confronta esecuzioni equivalenti

Per un confronto tra kernel standard e HFTKernel, usa la stessa build eseguibile, ruolo CPU, modalità di memoria, operazione, pattern, dimensione, seed, politica di reset, politiche di memoria esplicite, modalità di lettura del contatore, batch, destinazione di output, dimensione della finestra e durata. Conserva i metadati di kernel, topologia e scheduler di ogni esecuzione. Modifica la variabile prevista invece di cambiare contemporaneamente la definizione della misurazione.

Esegui ogni esperimento separatamente. Questa versione consente di avviare due strumenti attivi sulla stessa CPU, ma le esecuzioni interferiscono e non costituiscono riferimenti indipendenti. Mantieni il tracciamento diagnostico separato dalla misurazione A/B principale quando l'obiettivo è evitare di introdurre un carico di tracciamento diverso su un solo lato.

Confronta insieme conteggi, distribuzioni, massimi, superamenti delle soglie, copertura e qualità. Non mediare i valori p99 tra esecuzioni o finestre. Un totale compatto dell'intera esecuzione raggruppa gli istogrammi riportati al suo interno; un'analisi precisa della popolazione tra esecuzioni richiede la conservazione di dati sottostanti compatibili. La CLI e le popolazioni di misurazione CPU/MEM 3.x non sono intercambiabili con i vecchi profili benchmark 2.x già pubblicati sul sito HFTKernel.

Jitter Tools 1.3.0

Risoluzione dei problemi

Individua la fase fallita senza modificare silenziosamente l'esperimento.

OsservazioneInterpretazione e controllo successivo
Nessuna riga subito dopo l'avvioCPU/MEM eseguono prima preparazione e calibrazione. Deve poi trascorrere un'intera finestra -n. Un'esecuzione limitata più breve emette la propria finestra parziale finale.
CPU rifiutata o errore di affinitàControlla ID CPU Linux richiesto, stato online e permessi cpuset. Seleziona esplicitamente una CPU valida; lo strumento non ne sceglierà silenziosamente un'altra.
Errore di accesso al contatore o di calibrazioneEsamina la diagnostica del contatore e del clock. CPU/MEM richiedono contatori specifici dell'architettura utilizzabili; questa CLI non prevede un clock alternativo di ripiego.
Uscita 3 / partial / producer_unqualifiedLeggi esecuzione e pulizia come fatti separati. Questo stato da solo non dimostra una gestione IRQ sovraccarica o una regolazione errata del kernel.
Valori IRQ zero o NAZero può riflettere la risoluzione dei timestamp delle tracce; NA può indicare l'assenza di campioni completati. Nessuno dei due dimostra un sistema privo di ritardi.
softirq_entry_without_observed_raiseUna coppia pendente osservata incompleta. Controlla PAIR_GAPS e JSON dettagliato; non definirlo perdita di pacchetti o overflow del ring.
Eventi tardivi o perdita nei bufferConserva le evidenze di perdita. Esamina ambito degli eventi, velocità di output e budget delle risorse. Finestre più brevi e output grezzo possono aggiungere carico. Una nuova esecuzione con impostazioni modificate è una configurazione diversa.
Impossibile aprire/creare l'istanza tracefsVerifica mount, permessi, clock mono e formati di evento supportati. Il programma non esegue mount, chmod o acquisizione di proprietà di un'altra sessione.
record-cmd o record-tgid mancanti in un'istanzaQueste cache globali sono facoltative per questo collector. Diagnostica il controllo effettivamente richiesto e errno; non modificare cache globali solo per soddisfare lo strumento.
NAPI richiesto ma non supportatoLa richiesta --napi fallisce esplicitamente. Esegui senza --napi solo come esperimento deliberatamente separato con soli IRQ.
Richiesta mlock / NUMA / HugeTLB rifiutataEsamina errno, limite di blocco, nodi consentiti, pool di huge page esistente e supporto dell'host. Non vengono eseguiti elevazione automatica, predisposizione del pool o ripiego di politica.
Timeout di output, EPIPE o record finale mancanteL'output è incompleto. Conserva stderr, usa esecuzioni limitate e una destinazione sufficientemente veloce. Non classificare come completa un'acquisizione troncata.
Errore di pulizia o istanza residuaEsamina cleanup.errors e recovery_required. Verifica l'istanza di proprietà riportata e l'assenza di un proprietario attivo prima di qualsiasi intervento amministrativo. Non eliminare ricorsivamente le istanze tracefs.

La chiusura IRQ ordinata arresta la registrazione, svuota entro limiti definiti, disabilita gli eventi propri, chiude i descrittori, rimuove solo la propria istanza e ripristina l'affinità. Un errore gestito rimane tale anche se la pulizia successiva libera le risorse. SIGKILL e un guasto dell'host non possono garantire la rimozione completa dell'istanza.

Riferimenti ai sorgenti

Riferimenti all'implementazione specifici per versione

Questa guida deriva dai sorgenti forniti di Jitter Tools 1.3.0, dai parser CLI e dai contratti di misurazione. Non certifica la precisione delle misurazioni temporali reali né la compatibilità con ogni distribuzione. I percorsi dei sorgenti seguenti sono relativi all'archivio dei sorgenti.

Archivio dei sorgenti: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Identità della versione e processo di compilazione
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Parser della riga di comando e validazione
  • 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. Acquisizione CPU, clock e collocazione
  • 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. Operazioni di memoria residente
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. Modalità first-touch e allocazione
  • 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. Politiche di memoria esplicite per mapping
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Raccolta IRQ passiva e ciclo di vita tracefs
  • 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. Finestre IRQ, panoramica e NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Output, istogrammi, riepilogo e schema del flusso
  • 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