Guide utilisateur des outils de mesure

Mesurez le comportement du CPU, de la mémoire et des IRQ.

Commandes, périmètres de mesure, champs de sortie et comparaisons reproductibles pour Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Commencez ici

Choisissez un outil, vérifiez sa version et lancez une mesure limitée.

Jitter Tools 1.3.0 fournit trois outils Linux autonomes en ligne de commande. CPUJitter observe les interruptions d'exécution sur un CPU. MEMjitter mesure des opérations mémoire déclarées. IRQjitter observe les événements IRQ et softirq du noyau via tracefs. Utilisez-les séparément pour répondre à une question de mesure précise.

ComposantVersion couverteQuestion principale
CPUJitter3.2.2Quelle est la durée des intervalles entre lectures successives du compteur sur le CPU choisi ?
MEMjitter3.5.2Combien de temps prennent les accès résidents, les premières écritures ou les appels mmap réussis ?
IRQjitter1.3.0Quels gestionnaires et attentes IRQ/softirq observés présentent des durées élevées ?
Flux lisible par machinejitter.stream/0.6.0Comment les mesures, la couverture, la qualité et le nettoyage sont-ils enregistrés ?
Depuis un répertoire contenant les trois exécutables
./cpujitter --version
./memjitter --version
./irqjitter --version

Les exemples ci-dessous s'exécutent depuis une distribution binaire décompressée. Après compilation des sources, les mêmes exécutables se trouvent dans ./bin/. S'ils sont installés dans PATH, omettez le préfixe ./. Les numéros de CPU sont des exemples, pas une recommandation de placement en production. Remplacez-les par des identifiants CPU Linux autorisés et actifs sur votre hôte.

Lire les limites CPU et des nœuds mémoire du processus actuel
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
Intervalles d'exécution CPU, un résumé par seconde
./cpujitter -c 4 --duration 10
Lectures d'octets résidents, un résumé par seconde
./memjitter -c 4 --duration 10
Aperçu IRQ ; le CPU 1 exécute le collecteur, tous les CPU actifs sont observés
sudo ./irqjitter -c 1 --duration 10

Exécutez ces exemples un à la fois. Les tests CPU et mémoire sont des charges actives. IRQjitter est passif au sens où il ne génère pas de trafic de test, mais le traçage et la collecte ont un coût. CPU/MEM ne nécessitent ni root, ni SMT désactivé, ni isolation CPU, ni CPU exclusif, ni HFTKernel. La collecte IRQ nécessite l'accès à un montage tracefs existant et l'autorisation de créer sa propre instance ; sudo est une manière d'obtenir ces droits.

Jitter Tools 1.3.0

Compiler et vérifier

Séparez les contrôles de compilation des sources de ceux de la distribution binaire.

L'archive 1.3.0 fournie contient uniquement les sources, sans exécutables ELF prêts à l'emploi. Sa qualification consignée ne prouve pas une compilation Rust achevée ni une exécution IRQ réelle. Le point d'entrée source pris en charge est test.sh ; il compile et teste avant de publier les binaires.

Prérequis de compilationPérimètre
Linux GNU, x86_64 ou aarch64Compilez nativement pour l'architecture de l'hôte.
Rust 1.85 ou ultérieur, rustfmt et clippyCompilateur et contrôles de qualité Rust.
Compilateur C, ar, fichiers de développement de libc statique, readelfCode ABI natif, édition de liens GNU statique et contrôles ELF.
Python 3.10 ou ultérieur et dépendances de testTests des sources et orchestration de compilation. Python n'est pas requis par les exécutables de mesure produits.
Point d'entrée pris en charge pour compiler et tester les sources
cd jitter-tools-1.3.0
./test.sh

Cargo s'exécute hors ligne avec un jeu de dépendances verrouillé et sans dépendances de registre. Les dépendances de test Python peuvent être installées dans le répertoire local du projet .test-env/. Utilisez --offline lorsque l'environnement est déjà préparé et que les téléchargements depuis l'index de paquets doivent être désactivés.

Validation des sources avec les dépendances déjà disponibles
./test.sh --offline --acceptance

Après réussite de tous les contrôles obligatoires, le processus publie bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json et une archive statique versionnée. Les références publiques de l'archive utilisent le nom canonique jitter-tools-1.3.0.tgz. L'ensemble inclut BUILD.json, ELF.json, les sommes de contrôle, les mentions et la documentation. Ne considérez pas une compilation partielle des sources comme une distribution statique qualifiée.

Dans une distribution binaire décompressée, test.sh vérifie les fichiers livrés
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

Le test.sh de la distribution binaire nécessite sh, readelf, sha256sum et grep. Ce n'est pas l'outil de compilation des sources. Les exécutables GNU statiques ne nécessitent ni Rust, ni Python, ni interpréteur ELF, ni bibliothèques partagées voisines à l'exécution. Ils requièrent toujours un noyau Linux d'architecture compatible, les appels système nécessaires, /proc et /sys ; IRQjitter requiert aussi tracefs. Les contrôles ELF prouvent la conformité des paquets, pas la précision des mesures ni la prise en charge de chaque version du noyau.

Jitter Tools 1.3.0

Paramètres communs

Choisissez un CPU, définissez une limite d'exécution et sélectionnez une sortie par fenêtres ou brute.

ParamètreComportement
-c CPUObligatoire pour toutes les mesures. Un seul identifiant CPU Linux décimal, 0..65535. Les listes et plages ne sont pas acceptées ici. Aucun CPU de repli automatique.
-n SECLargeur de fenêtre et intervalle de résumé ; valeur par défaut de 1 seconde, plage 0.001..86400. Ne définit pas la fréquence d'échantillonnage.
--duration SECDurée d'observation limitée, 0.001..86400 secondes. La préparation et la calibration CPU/MEM précèdent l'observation.
--samples NCPU/MEM uniquement. Arrêter après un nombre positif d'observations terminées. IRQjitter ne possède pas d'option --samples.
--jsonJSON Lines. Conserve les fenêtres par défaut d'une seconde, sauf si --raw est également fourni.
--rawObservations individuelles avec les enregistrements complets du protocole. Incompatible avec -n ou les paramètres réservés aux fenêtres.
--help, --version, --build-infoExécutez chaque option d'information séparément. Aucun -c, calibration ou mesure n'est nécessaire.

CPU/MEM acceptent aussi --cpu et --interval. IRQjitter 1.3.0 utilise uniquement -c et -n pour ces paramètres. Les trois acceptent les valeurs courtes attachées comme -c4 -n0.1. Utilisez des secondes décimales simples, par exemple 0.1, et non 100ms, 1e-1 ou .1. Les options répétées sont refusées.

Fenêtres statistiques de 100 ms ; la boucle de capture continue entre les résumés
./cpujitter -c4 -n0.1 --duration 5
Capture brute limitée ; sans option -n
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

Les données vont vers stdout et les diagnostics vers stderr. Rediriger stdout ne sélectionne ni JSON ni le mode brut. Utilisez une durée limitée ou Ctrl+C pour arrêter. Un SIGINT/SIGTERM traité émet les enregistrements finaux si le canal de sortie reste utilisable et si le nettoyage réussit. Un appel système bloqué, SIGKILL, une panne de l'hôte ou un tube fermé empêchent toute garantie d'arrêt immédiat ou de sortie finale complète.

Jitter Tools 1.3.0

CPUJitter

Mesurez les intervalles d'exécution successifs sur un CPU choisi.

La métrique cpu_iteration_elapsed_ns est le temps écoulé calibré entre des lectures successives du compteur matériel dans un lot de capture. Elle inclut le branchement de boucle, le stockage des horodatages et le coût de lecture du compteur. Ce n'est ni le nombre de cycles du cœur CPU, ni une mesure de livraison des interruptions d'un périphérique, ni une classification directe de la cause d'une pause.

ordered est le mode de lecture du compteur par défaut ; relaxed est une alternative explicite avec un contexte distinct. La calibration utilise sept segments d'au moins 50 ms par rapport à CLOCK_MONOTONIC_RAW, avec une échelle fixe pour l'exécution. Aucune référence ni coût du compteur n'est soustrait. Sur x86, la prise en charge déclarée d'invariant-TSC et un accès utilisable au compteur sont requis ; les compteurs non pris en charge sont refusés sans remplacement silencieux.

Exécutez ordered et relaxed séparément ; conservez leurs distributions distinctes
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Compter les intervalles strictement supérieurs à 5 microsecondes, sans filtrer d'échantillon
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Enregistrer les fenêtres, les métadonnées et l'état final
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
Paramètre propre au CPU ou à la captureValeur par défaut et plage
--counter-read ordered|relaxedordered. Comparez des contextes identiques de lecture du compteur.
--batch-records N4096 ; 1..65536. Capacité préallouée du lot de lectures successives.
--buffer-bytes N8388608 ; 16384..8388608. File stdout limitée.
--write-timeout-ms N1000 ; 1..60000. Échéance de sortie coopérative, pas une garantie temps réel stricte.
--threshold cpu_iteration_elapsed_ns=NNanosecondes entières non négatives. Compte les valeurs > N dans les fenêtres.

Un lot contient un horodatage initial et des observations terminées. La capture est séparée des points d'ancrage temporels, de la validation, de l'agrégation et de la sortie. Un budget coopératif du compteur vérifie environ 20 ms de capture toutes les 256 observations ; il ne tronque pas un long délai observé. ACTIVE% décrit la portion de capture couverte, pas l'utilisation totale du CPU. Les pauses hors capture ne sont pas observées par cette métrique.

Les nanosecondes sont calculées par arithmétique entière vérifiée avec arrondi au plus proche : (delta_ticks * 1000000000 + hz / 2) / hz. Les horodatages affectant les événements aux fenêtres utilisent le mappage compteur-MONOTONIC encadré par les points d'ancrage. La valeur et son intervalle début/fin mappé ont des fonctions différentes et ne sont pas nécessairement identiques numériquement. La précision physique inconnue reste null dans le flux.

Jitter Tools 1.3.0

MEMjitter

Choisissez l'accès résident, first-touch ou la latency d'appel mmap.

ModeMétriqueOpération chronométrée
resident, par défautmem_resident_operation_nsUne lecture d'octet, une lecture/modification/écriture non atomique ou une étape de parcours de pointeurs.
first-touchmem_first_touch_nsUne écriture volatile d'un octet à un déplacement encore inutilisé dans une époque de mappage/réinitialisation vérifiée.
allocmem_alloc_call_nsUn appel API mmap anonyme privé réussi ; aucun accès aux pages ni munmap dans l'intervalle chronométré.

Lectures résidentes et lecture/modification/écriture

Les valeurs par défaut sont resident, read, sequential, un mappage de 16777216 octets (16 MiB), un pas de la taille d'une page système, un déplacement de 0 et une graine de 1. La préparation touche chaque page de base, réchauffe le plan d'accès et vérifie la résidence initiale avec mincore. Sans verrouillage explicite, cet instantané ne garantit pas le maintien de la résidence.

Tests résidents séparés : lectures par défaut et RMW aléatoire d'octets non atomique
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read chronomètre un chargement volatile d'un octet. rmw chronomètre un chargement d'octet, un incrément avec retour à zéro et une écriture ; il n'est pas atomique et ne mesure pas l'achèvement de l'écriture visible globalement. L'intervalle inclut le coût des horodatages/barrières. Le résultat n'est pas une latency DRAM pure.

Parcours dépendant de pointeurs

Une chaîne dépendante à travers les déplacements choisis
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase sélectionne automatiquement pointer-chase, sauf si un motif est explicite. Un motif explicite doit également être pointer-chase. Les autres motifs résidents sont sequential, random avec remise et permutation. La sélection d'adresse et la gestion sont hors de chaque opération mesurée. Un mappage de 16 MiB avec un pas d'une page sur un hôte à pages de 4096 octets contient 4096 positions échantillonnées, pas 16 MiB de données lues à chaque passage.

Écritures first-touch

Nouveaux mappages, réinitialisation hors de l'écriture chronométrée
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Abandon explicite MADV_DONTNEED avec un ordre d'accès reproductible
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch autorise sequential ou permutation, sans remise dans une époque. write est la seule opération et peut être omis. Après chaque remappage/abandon réussi, mincore doit confirmer l'absence de pages résidentes avant une nouvelle époque. La réinitialisation est du temps de service exclu. La première écriture d'un octet ne correspond pas nécessairement à un défaut de page ou à une allocation physique distincte, notamment lorsque THP couvre plusieurs déplacements. Remap et madvise sont des expériences différentes.

Appels API d'allocation

Latency simple d'appel mmap ; il s'agit d'exécutions distinctes
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc crée au plus un mappage lui appartenant à la fois et le supprime avant l'appel suivant. Seuls les intervalles mmap réussis entrent dans l'histogramme. mmap établit un mappage virtuel, sans peupler physiquement chaque page. L'enveloppe C ABI/libc et l'encadrement temporel restent inclus dans la valeur. L'ancien alloc-cycle, la latency malloc/calloc et la génération automatique de pression mémoire ne sont pas implémentés dans ce mode.

Options de disposition et de mode

OptionValeurs et contraintes
--moderesident | first-touch | alloc ; resident par défaut.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NOctets décimaux, multiple de page ; valeur par défaut 16777216, maximum 1073741824. Pas de chaîne avec suffixe MiB.
--stride-bytes NAu moins une page de l'OS, aligné sur une page et divisant --bytes ; taille de page système par défaut. Resident/first-touch uniquement.
--offset-bytes NDéplacement en octets dans une page de base échantillonnée ; 0 par défaut. Chase nécessite aussi un alignement usize et un emplacement suffisant.
--seed NEntier non nul ; 1 par défaut. Resident/first-touch uniquement.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetFirst-touch uniquement : remap (par défaut) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msMêmes valeurs par défaut et limites que CPUJitter.
--threshold METRIC=NUtilisez la métrique exacte du mode choisi ; comparaison stricte > dans les fenêtres.
Compter les valeurs first-touch supérieures à 20 microsecondes
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc refuse les options pattern, stride, offset, seed et reset, même si leurs valeurs ressemblent aux valeurs par défaut. Aucun mode mémoire n'accepte --counter-read de CPUJitter. Conservez les mêmes operation, pattern, bytes, stride, offset, seed, reset et mode de sortie pour comparer les résultats.

Jitter Tools 1.3.0

Politiques mémoire

Appliquez les politiques facultatives uniquement au mappage de l'outil.

Les valeurs par défaut sont --lock none, --thp system, la politique NUMA héritée et aucune demande HugeTLB explicite. L'outil ne reconfigure pas le système, n'augmente pas les limites de verrouillage, ne modifie pas un pool de grandes pages et ne réessaie pas avec une politique moins stricte. Une demande explicite non prise en charge échoue avec sa raison.

Politiqueresidentfirst-touchalloc
--lock nonePar défautPar défautAutorisé
--lock residentmlock avant la préparationRefuséRefusé
--lock onfaultmlock2, suivi de la préparation résidenteUniquement avec --reset remapRefusé
--thp systemPar défaut, sans conseilPar défaut, sans conseilAutorisé
--thp never ou --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEAutorisé et réappliqué après remapRefusé
--numa-node NMPOL_BIND limité à la plageMPOL_BIND limité à la plageRefusé
--hugetlb-bytes NMappage HugeTLB expliciteRefuséRefusé
Petit jeu de travail résident verrouillé, soumis à RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Verrouillage au défaut tout en préservant la préparation first-touch
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Expériences distinctes de conseil THP, pas de configuration THP globale
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Lier le mappage de l'outil à un nœud NUMA physique autorisé
./memjitter -c 4 --numa-node 0 --duration 10
Pages HugeTLB explicites de 2 MiB, uniquement si le pool et la prise en charge par l'hôte sont déjà disponibles
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

Le verrouillage empêche le passage du mappage en swap tant qu'il est maintenu ; il ne garde pas définitivement les données dans le cache CPU. Un appel de conseil THP accepté ne prouve pas l'utilisation de grandes pages. La relecture de la politique NUMA diffère du placement physique observé. Les identifiants NUMA vont de 0..4095 et doivent être autorisés par l'hôte.

Une taille HugeTLB explicite doit être une puissance de deux supérieure à la page de base de l'OS, au plus 1 GiB, et diviser la taille du mappage. Elle est incompatible avec un verrouillage explicite ou un conseil THP autre que system. La préparation résidente nécessite un MADV_POPULATE_WRITE réussi sur cette plage. Le pool existant, les quotas, les autorisations et l'opération requise du noyau doivent permettre la demande ; aucun repli vers les pages ordinaires n'est effectué.

La politique demandée, les opérations réussies et l'état observé du mappage sont enregistrés séparément. Les observations initiales figurent dans meta ; les observations finales sont écrites sur stderr avant unmap. Les informations indisponibles ou non attribuables restent null. Les instantanés des fichiers proc et les vérifications de politique ajoutent du travail de service ; comparez donc des politiques identiques.

Jitter Tools 1.3.0

IRQjitter

Observez les durées des gestionnaires et les attentes softirq sans modifier le placement IRQ.

IRQjitter utilise un thread lecteur en espace utilisateur et sa propre instance tracefs. Les points de trace IRQ requis sont irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry et softirq_exit. L'instance doit prendre en charge l'horloge de trace mono. L'outil ne monte pas tracefs, ne change pas ses droits par chmod, ne modifie pas l'affinité IRQ/RSS, n'arrête pas irqbalance et n'active pas de moteur alternatif.

Vérifier le montage tracefs existant ; utiliser son point de montage réel
grep " tracefs " /proc/mounts
Chemin de montage tracefs explicite, avec une ligne d'aperçu par seconde
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

CPU du collecteur et CPU observés

Collecteur sur le CPU 1 ; observer uniquement les CPU 4 à 7
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Sans --target-cpus, les événements pris en charge sont observés sur tous les CPU actifs, y compris celui du collecteur. Une liste telle que 2,4-7 restreint la collecte, pas seulement l'affichage. L'activité IRQ déplacée hors de cet ensemble sort de la couverture. Le branchement à chaud des CPU est surveillé dans l'ensemble initial des CPU possibles, et ses changements sont signalés avec les informations de couverture.

Trois métriques temporelles distinctes

MétriqueCe qui est mesuréInterprétation
irq_handler_elapsed_nsUne paire entrée/sortie correspondante d'un gestionnaire d'action sur le même CPUInclut le travail intermédiaire/imbriqué ; ce n'est pas la latency de livraison d'une interruption du périphérique au CPU.
softirq_elapsed_nsUne paire entrée/sortie correspondante d'un vecteur softirq sur le même CPUCe n'est ni du temps CPU exclusif ni du temps de traitement par paquet.
softirq_observed_raise_to_entry_nsDu premier déclenchement en attente observé et sauvegardé à l'entrée suivante sur ce CPU/vecteurUne attente observée, potentiellement regroupée ; pas le temps d'attente d'un paquet individuel.

Une source IRQ est identifiée par la métrique, le CPU réel, le numéro et le nom de source. Les comptes décrivent les observations terminées des gestionnaires, pas les interruptions physiques ou les paquets. Des paires numéro/nom identiques ne prouvent pas une identité persistante du périphérique après reconfiguration. Une durée nulle peut refléter la résolution des horodatages textuels de trace, souvent à la microseconde, plutôt qu'un temps physique nul.

Aperçu, détails et événements bruts

Exécutions distinctes : aperçu, tableau compact par source et fenêtres JSON détaillées
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
Courte capture brute pour un CPU observé
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details est valable uniquement pour les fenêtres compactes et est incompatible avec --json ou --raw. JSON conserve déjà les fenêtres par CPU/source. Cette version ne contient ni mode timerlat ni moteur eBPF. Le véritable softirq TIMER reste observable.

Observations facultatives du travail/budget NAPI

NAPI ajoute les observations travail/budget aux deux vues compactes
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi requiert un point de trace napi:napi_poll pris en charge. La métrique est napi_poll_work, unité work, pas des nanosecondes. Elle indique la valeur de travail retournée et le budget. at_budget exige un budget positif avec un travail égal au budget ; over_budget exige un travail supérieur à un budget positif. Aucun ne prouve à lui seul une accumulation de paquets. La durée NAPI, la latency IRQ-to-NAPI et un identifiant supposé de file matérielle ne sont pas fournis.

Paramètres des fenêtres et des ressources

OptionValeur par défaut et plage
--threshold NSEntier non négatif ; s'applique uniquement aux séries temporelles. Contrairement à CPU/MEM, aucun nom de métrique n'est fourni.
--lateness SECPar défaut min(window / 10, 0.01 seconde). Plage 0..window, jusqu'à neuf décimales. Fenêtres uniquement.
--max-series N256 pour les fenêtres, 4096 pour le brut ; plage 1..4096.
--window-memory-mib N64 ; 1..512. Plafond de mémoire des fenêtres.
--buffer-kb N256 par CPU possible ; 16..16384.
--max-trace-mib N256 ; 1..4096. Budget total prudent des tampons de trace du noyau, pas de toute la mémoire du processus.
--output-bytes N8388608 ; 65536..8388608. File de sortie limitée.
--write-timeout-ms N1000 ; 1..60000. Échéance de sortie coopérative.
Observer les durées supérieures à 10 microsecondes dans le périmètre CPU choisi
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

Les échantillons terminés tardivement sont signalés comme tardifs, sans déplacement dans une fenêtre ultérieure ni réécriture des anciennes sorties. Une sortie lente peut retarder la lecture de trace et provoquer des pertes dans les tampons du noyau. Le collecteur vérifie les paramètres et statistiques des tampons, mais des lectures vides ou l'absence d'avis de perte ne prouvent pas une couverture complète. L'instrumentation s'exécute aussi sur les CPU des événements, pas seulement sur celui du collecteur.

Jitter Tools 1.3.0

Lire les résultats

Distinguez valeurs mesurées, couverture, bornes statistiques et état de l'exécution.

Colonnes compactes CPU/MEM

Disposition des colonnes uniquement, pas des résultats de mesure
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
ColonneSignification
TIME(s)Fin de la fenêtre par rapport au début de l'observation, en secondes, pas en UTC.
COUNTNombre d'observations acceptées dans la ligne.
MIN / MAXExtrema exacts des valeurs entières rapportées, en ns pour les métriques temporelles. Cela n'affirme pas une précision physique.
AVGAffiché à 0.1 ns par arithmétique entière ; JSON conserve la somme et le compte exacts.
P99<= / P99.9<=Bornes supérieures des classes d'histogramme correspondantes, limitées par les extrema observés. Ni percentile trié exact ni intervalle de confiance.
ACTIVE%Temps de mesure couvert divisé par la durée de fenêtre, pas l'utilisation CPU.
LOSSseen signifie qu'un avis de perte a été observé ; l'indicateur reste actif. Un tiret signifie qu'aucun avis n'a été vu, sans prouver l'exhaustivité.
QUALITYClassification de qualité des données conservée. partial peut décrire une instrumentation non qualifiée.
PARTyes signifie que la dernière fenêtre statistique est plus courte que la largeur demandée. Ce champ est indépendant de QUALITY.

Un seuil temporel ajoute un suffixe comme >5000=N, où N est le nombre de valeurs strictement supérieures à la limite. Une population vide a COUNT=0 et des statistiques NA, pas une latency nulle. IRQ --details ajoute METRIC, SOURCE, UNIT et les champs NAPI BUDGET_MAX, AT_BUDGET et OVER_BUDGET ; les valeurs non applicables sont NA.

Colonnes de l'aperçu IRQ

Aperçu IRQ par défaut ; --napi ajoute un groupe distinct travail/budget
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 et WAIT sont des populations distinctes. Chacune regroupe les histogrammes compatibles des sources sur les CPU observés pour cette métrique et cette fenêtre ; les percentiles sont recalculés à partir des comptes de classes regroupés, pas moyennés à partir des percentiles des sources.

Colonne de diagnosticSignification
PAIR_GAPSNombre d'avis d'appariement détectés. Ce n'est pas un nombre d'interruptions matérielles ou de paquets perdus.
LATEÉchantillons terminés refusés après publication de leur fenêtre. Les comptes inconnus restent inconnus.
BUFFERnot-observed, loss-observed ou unknown. not-observed ne certifie pas l'absence de perte.
OTHERAutres avis de diagnostic, pas des comptes IRQ.
PARTUne dernière fenêtre statistique plus courte.

Par exemple, softirq_entry_without_observed_raise incrémente les diagnostics d'appariement. Cela ne prouve pas un débordement de l'anneau de trace, et une durée entrée/sortie valide ultérieure peut être conservée. Les statistiques des tampons et les marqueurs textuels de perte peuvent se chevaucher ; ne les additionnez pas pour inventer un total de pertes.

Résumés de fin d'exécution

La sortie compacte affiche # SUMMARY, des lignes # TOTAL et un état final après la dernière fenêtre, y compris la fenêtre partielle finale. Les détails CPU/MEM et IRQ résument chaque série ; l'aperçu IRQ produit des totaux temporels regroupés distincts et, en option, des totaux de travail NAPI. Le résumé d'aperçu IRQ inclut MAX_CPU et MAX_SOURCE pour préserver la source du plus grand événement observé.

Les totaux utilisent les comptes et sommes exacts des fenêtres intégralement rapportées, une moyenne pondérée, les extrema et les classes d'histogramme fusionnées. Ce ne sont pas des moyennes de moyennes ou de percentiles de fenêtres. scope=reported_windows exclut les échantillons non rapportés et tardifs. La source liée à un maximum identifie une observation, pas une cause racine prouvée.

JSON Lines pour l'automatisation

Utilisez --json pour conserver les métadonnées, les fenêtres par série, les raisons de qualité, les enregistrements de pertes/ruptures et l'enregistrement final end. Utilisez --raw --json pour les échantillons individuels. Le texte du résumé compact n'est pas ajouté au JSON. Les grands entiers comme les nanosecondes, comptes et sommes sont des chaînes décimales ; analysez-les comme entiers, pas comme nombres flottants. Une valeur null est inconnue, pas nulle au sens numérique.

Exemples jq facultatifs pour examiner un fichier JSONL enregistré
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

L'enregistrement final sépare execution, la qualité et cleanup.confirmed. observations_aggregated est important en mode fenêtres ; un observations_emitted nul ne signifie pas qu'aucune donnée n'a été collectée si les valeurs ont été agrégées en fenêtres. Conservez le fichier complet et stderr, pas seulement certaines lignes de fenêtres.

Jitter Tools 1.3.0

Automatisation et exécutions A/B

Enregistrez les exécutions complètes et conservez le code de sortie du producteur.

Code de sortieSignification
0Exécution/données complètes selon le contrat annoncé. Les producteurs actifs actuels conservent normalement un statut non qualifié à la place.
2Échec CLI, de capacité, d'exécution, de sortie ou de nettoyage. Examinez stderr et tout enregistrement final disponible.
3Données partielles ou non qualifiées. Peut correspondre à une exécution fonctionnellement achevée avec nettoyage confirmé.
130SIGINT traité, comme Ctrl+C, avec nettoyage réussi.
143SIGTERM traité avec nettoyage réussi.

Ce sont les codes documentés de l'outil, pas une garantie pour chaque shell, enveloppe de délai ou signal fatal. Conservez les statuts non nuls ; n'ajoutez pas || true pour faire paraître un résultat réussi. Un tube fermé par head peut empêcher les enregistrements finaux. --samples ou --duration est la manière prise en charge de limiter une capture.

Exemple Bash conservant sortie, diagnostics, identité de compilation et code de sortie
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

Comparez des exécutions équivalentes

Pour comparer un noyau standard à HFTKernel, utilisez la même compilation de l'exécutable, le même rôle CPU, mode mémoire, opération, motif, taille, graine, politique de réinitialisation, politiques mémoire explicites, mode de lecture du compteur, lot, destination de sortie, taille de fenêtre et durée. Conservez les métadonnées du noyau, de la topologie et de l'ordonnanceur de chaque exécution. Modifiez la variable visée sans changer simultanément la définition de la mesure.

Exécutez chaque expérience séparément. Cette version autorise deux outils actifs sur le même CPU, mais leurs exécutions interfèrent et ne constituent pas des références indépendantes. Séparez le traçage diagnostique de la mesure A/B principale lorsque l'objectif est d'éviter d'ajouter une charge de traçage différente d'un seul côté.

Comparez ensemble les comptes, distributions, maxima, dépassements de seuils, couverture et qualité. Ne moyennez pas les p99 entre exécutions ou fenêtres. Le total compact d'une exécution regroupe les histogrammes rapportés dans cette exécution ; une analyse exacte des populations entre exécutions exige de conserver des données sous-jacentes compatibles. Le CLI CPU/MEM 3.x et ses populations de mesure ne sont pas interchangeables avec les anciens profils de référence 2.x déjà publiés sur le site HFTKernel.

Jitter Tools 1.3.0

Dépannage

Repérez la phase en échec sans modifier silencieusement l'expérience.

ObservationInterprétation et prochaine vérification
Aucune ligne immédiatement après le lancementCPU/MEM préparent et calibrent d'abord. Une fenêtre -n complète doit ensuite s'écouler. Une exécution limitée plus courte émet sa dernière fenêtre partielle.
CPU refusé ou erreur d'affinitéVérifiez l'identifiant CPU Linux demandé, son état actif et les droits cpuset. Choisissez explicitement un CPU valide ; l'outil n'en sélectionnera pas un autre silencieusement.
Échec d'accès au compteur ou de calibrationExaminez les diagnostics du compteur et de l'horloge. CPU/MEM requièrent des compteurs utilisables propres à l'architecture ; ce CLI ne propose aucun repli vers une autre horloge.
Code 3 / partial / producer_unqualifiedConsidérez l'exécution et le nettoyage comme des faits distincts. Ce statut seul ne prouve ni surcharge des IRQ ni mauvais réglage du noyau.
Valeurs IRQ nulles ou NAZéro peut refléter la résolution des horodatages de trace ; NA peut signifier l'absence d'échantillon terminé. Aucun ne prouve un système sans délai.
softirq_entry_without_observed_raiseUne paire observée en attente incomplète. Vérifiez PAIR_GAPS et le JSON détaillé ; ne l'assimilez pas à une perte de paquets ou à un débordement d'anneau.
Événements tardifs ou pertes de tamponConservez les preuves de perte. Examinez le périmètre des événements, la vitesse de sortie et les budgets de ressources. Des fenêtres plus courtes et une sortie brute peuvent accroître la charge. Une nouvelle exécution avec des réglages modifiés est une configuration différente.
Impossible d'ouvrir/créer l'instance tracefsVérifiez le montage, les droits, l'horloge mono et les formats d'événements pris en charge. Le programme ne monte rien, n'applique pas chmod et ne s'approprie pas une autre session.
record-cmd ou record-tgid absent d'une instanceCes caches globaux sont facultatifs pour ce collecteur. Diagnostiquez le contrôle réellement requis et errno ; ne modifiez pas les caches globaux uniquement pour satisfaire l'outil.
NAPI demandé mais non pris en chargeLa demande --napi échoue explicitement. Exécutez sans --napi uniquement comme une expérience IRQ seule volontairement distincte.
Demande mlock / NUMA / HugeTLB refuséeExaminez errno, la limite de verrouillage, les nœuds autorisés, le pool de grandes pages existant et la prise en charge de l'hôte. Aucune élévation automatique, création de pool ou politique de repli n'est effectuée.
Délai de sortie dépassé, EPIPE ou enregistrement final manquantLa sortie est incomplète. Conservez stderr, utilisez des exécutions limitées et une destination capable de suivre. Ne classez pas une capture tronquée comme complète.
Échec du nettoyage ou instance restanteExaminez cleanup.errors et recovery_required. Vérifiez l'instance appartenant à l'outil et l'absence de propriétaire actif avant toute action administrative. Ne supprimez pas récursivement des instances tracefs.

Un arrêt IRQ normal arrête l'enregistrement, vide dans des limites définies, désactive les événements de l'outil, ferme les descripteurs, supprime uniquement sa propre instance et rétablit l'affinité. Un échec traité reste un échec même si le nettoyage ultérieur libère les ressources. SIGKILL et une panne de l'hôte ne permettent pas de garantir la suppression complète de l'instance.

Références du code source

Références d'implémentation propres à la version

Ce guide repose sur le code source fourni de Jitter Tools 1.3.0, les analyseurs CLI et les contrats de mesure. Il ne certifie ni la précision temporelle en conditions réelles ni la compatibilité avec toutes les distributions. Les chemins ci-dessous sont relatifs à l'archive source.

Archive source: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Identité de version et processus de compilation
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Analyseurs de ligne de commande et validation
  • 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. Capture CPU, horloges et placement
  • 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. Opérations de mémoire résidente
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. Modes first-touch et allocation
  • 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. Politiques mémoire explicites par mappage
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Collecte IRQ passive et cycle de vie 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. Fenêtres IRQ, aperçu et NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Sortie, histogrammes, résumé et schéma du flux
  • 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