Guía del usuario de las herramientas de medición

Mida el comportamiento de CPU, memoria e IRQ.

Comandos, límites de medición, campos de salida y comparaciones reproducibles para Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Empiece aquí

Elija una herramienta, compruebe su versión y ejecute una medición finita.

Jitter Tools 1.3.0 proporciona tres herramientas independientes de línea de comandos para Linux. CPUJitter observa intervalos sin ejecución en una CPU. MEMjitter mide operaciones de memoria declaradas. IRQjitter observa eventos de IRQ y softirq del kernel mediante tracefs. Utilícelas por separado para responder a una pregunta de medición específica.

ComponenteVersión documentadaPregunta principal
CPUJitter3.2.2¿Cuánto duran los intervalos entre lecturas consecutivas del contador en la CPU seleccionada?
MEMjitter3.5.2¿Cuánto tardan los accesos a memoria residente, las primeras escrituras o las llamadas mmap exitosas?
IRQjitter1.3.0¿Qué manejadores y esperas de IRQ/softirq observados tienen tiempos transcurridos largos?
Flujo legible por máquinasjitter.stream/0.6.0¿Cómo se registran las mediciones, la cobertura, la calidad y la limpieza?
Desde un directorio que contenga los tres ejecutables
./cpujitter --version
./memjitter --version
./irqjitter --version

Los ejemplos siguientes se ejecutan desde una distribución binaria descomprimida. Tras compilar el código fuente, los mismos ejecutables están en ./bin/. Si están instalados en PATH, omita el prefijo ./. Los números de CPU son ejemplos, no una recomendación de ubicación para producción. Sustitúyalos por ID de CPU Linux permitidos y en línea en su host.

Consultar los límites de CPU y nodos de memoria del proceso actual
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
Intervalos de ejecución de CPU, un resumen por segundo
./cpujitter -c 4 --duration 10
Lecturas de bytes residentes, un resumen por segundo
./memjitter -c 4 --duration 10
Vista general de IRQ; la CPU 1 ejecuta el recolector y se observan todas las CPU en línea
sudo ./irqjitter -c 1 --duration 10

Ejecute estos ejemplos uno por uno. Las pruebas de CPU y memoria son cargas de trabajo activas. IRQjitter es pasivo en el sentido de que no genera tráfico de prueba, pero el trazado y la recolección siguen teniendo sobrecarga. CPU/MEM no requieren root, SMT desactivado, aislamiento de CPU, una CPU exclusiva ni HFTKernel. La recolección de IRQ requiere acceso a un montaje tracefs existente y permiso para crear su propia instancia; sudo es una forma de proporcionar esos permisos.

Jitter Tools 1.3.0

Compilar y verificar

Mantenga separadas las comprobaciones de compilación del código fuente y las de la distribución binaria.

El archivo 1.3.0 suministrado contiene únicamente código fuente. No contiene ejecutables ELF listos para usar. Su calificación registrada no acredita una compilación Rust completada ni una ejecución real de IRQ. El punto de entrada admitido para el código fuente es test.sh; compila y prueba antes de publicar los binarios.

Requisito de compilaciónAlcance
Linux GNU, x86_64 o aarch64Compilar de forma nativa para la arquitectura del host.
Rust 1.85 o posterior, rustfmt y clippyCompilador y controles de calidad de Rust.
Compilador C, ar, archivos de desarrollo de libc estática, readelfCódigo ABI nativo, enlace estático GNU y comprobaciones ELF.
Python 3.10 o posterior y los requisitos de las pruebasPruebas del código fuente y orquestación de la compilación. Los ejecutables de medición resultantes no requieren Python.
Punto de entrada admitido para compilar y probar el código fuente
cd jitter-tools-1.3.0
./test.sh

Cargo se ejecuta sin conexión, con un conjunto fijo de dependencias y sin dependencias de registro. Las dependencias de prueba de Python pueden aprovisionarse en .test-env/ dentro del proyecto. Utilice --offline cuando el entorno ya esté preparado y deban desactivarse las descargas desde índices de paquetes.

Ejecución de aceptación del código fuente, con las dependencias ya disponibles
./test.sh --offline --acceptance

Una vez superados todos los controles obligatorios, el flujo de trabajo publica bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json y un archivo de distribución estática versionado. Las referencias públicas al archivo utilizan el nombre canónico jitter-tools-1.3.0.tgz. El conjunto de la versión incluye BUILD.json, ELF.json, sumas de verificación, avisos y documentación. No trate una compilación del código fuente parcialmente completada como una distribución estática calificada.

En una distribución binaria descomprimida, test.sh comprueba los archivos entregados
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

El test.sh de la distribución binaria requiere sh, readelf, sha256sum y grep. No es el ejecutor de compilación del código fuente. Los ejecutables estáticos GNU no necesitan Rust, Python, un intérprete ELF ni bibliotecas compartidas adyacentes en tiempo de ejecución. Siguen necesitando un kernel Linux compatible con la arquitectura, las llamadas al sistema requeridas y /proc y /sys; IRQjitter también necesita tracefs. Las comprobaciones ELF son pruebas del empaquetado, no una garantía de precisión de medición ni de compatibilidad con todas las versiones del kernel.

Jitter Tools 1.3.0

Controles comunes

Seleccione una CPU, defina un límite de ejecución y elija salida por ventanas o sin procesar.

ControlComportamiento
-c CPUObligatorio para todas las ejecuciones de medición. Un único ID decimal de CPU Linux, 0..65535. Aquí no se aceptan listas ni rangos. No se selecciona automáticamente una CPU alternativa.
-n SECAncho de ventana e intervalo de resumen; 1 segundo de forma predeterminada, rango 0.001..86400. No establece la frecuencia de muestreo.
--duration SECDuración finita de observación, 0.001..86400 segundos. La preparación y calibración de CPU/MEM preceden a la observación.
--samples NSolo CPU/MEM. Detener tras un número positivo de observaciones completadas. IRQjitter no tiene la opción --samples.
--jsonJSON Lines. Mantiene las ventanas predeterminadas de un segundo salvo que también se indique --raw.
--rawObservaciones individuales con registros completos del protocolo. No se puede combinar con -n ni con controles exclusivos de ventanas.
--help, --version, --build-infoEjecute cada opción informativa por separado. No se necesitan -c, calibración ni medición.

CPU/MEM también aceptan --cpu y --interval. IRQjitter 1.3.0 utiliza únicamente -c y -n para estos controles. Las tres herramientas aceptan valores cortos adjuntos como -c4 -n0.1. Utilice segundos decimales simples, por ejemplo 0.1, no 100ms, 1e-1 ni .1. Se rechazan las opciones repetidas.

Ventanas estadísticas de 100 ms; el bucle de captura continúa entre resúmenes
./cpujitter -c4 -n0.1 --duration 5
Captura sin procesar limitada; sin la opción -n
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

Los datos se envían a stdout y los diagnósticos a stderr. Redirigir stdout no selecciona el modo JSON ni el modo sin procesar. Utilice una duración finita o Ctrl+C para detener la ejecución. Un SIGINT/SIGTERM gestionado emite registros finales cuando el canal de salida sigue siendo utilizable y la limpieza tiene éxito. Una llamada al sistema bloqueada, SIGKILL, un host que ha fallado o una tubería cerrada impiden garantizar una detención inmediata o una salida final completa.

Jitter Tools 1.3.0

CPUJitter

Mida intervalos consecutivos de ejecución en una CPU seleccionada.

La métrica cpu_iteration_elapsed_ns es el tiempo transcurrido calibrado entre lecturas consecutivas del contador de hardware dentro de un lote de captura. Incluye la bifurcación del bucle, el almacenamiento de marcas de tiempo y la sobrecarga de lectura del contador. No es el recuento de ciclos del núcleo de CPU, una medición de entrega de interrupciones de dispositivos ni una clasificación directa de la causa de una pausa.

ordered es el modo predeterminado de lectura del contador; relaxed es una alternativa explícita con un contexto distinto. La calibración utiliza siete segmentos de al menos 50 ms frente a CLOCK_MONOTONIC_RAW, con una escala fija para la ejecución. No se resta ningún valor de referencia ni costo del contador. En x86, se requieren compatibilidad declarada con TSC invariable y acceso utilizable al contador; los contadores no compatibles se rechazan en lugar de sustituirse silenciosamente.

Separe las ejecuciones ordered y relaxed; mantenga separadas sus distribuciones
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Contar intervalos estrictamente superiores a 5 microsegundos, sin filtrar ninguna muestra
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Guardar ventanas, metadatos y estado de terminación
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
Control específico de CPU o de capturaValor predeterminado y rango
--counter-read ordered|relaxedordered. Compare contextos equivalentes de lectura del contador.
--batch-records N4096; 1..65536. Capacidad preasignada del lote de lecturas consecutivas.
--buffer-bytes N8388608; 16384..8388608. Cola de stdout limitada.
--write-timeout-ms N1000; 1..60000. Plazo cooperativo de salida, no una garantía estricta de tiempo real.
--threshold cpu_iteration_elapsed_ns=NNanosegundos enteros no negativos. Cuenta los valores > N en las ventanas.

Un lote tiene una marca de tiempo inicial y observaciones completadas. La captura está separada de los anclajes del reloj, la validación, la agregación y la salida. Un presupuesto cooperativo del contador comprueba aproximadamente 20 ms de trabajo de captura cada 256 registros; no recorta un retraso observado grande. ACTIVE% describe la parte de captura cubierta, no la utilización total de CPU. Las pausas que ocurren fuera de la captura no se observan para esta métrica.

Los nanosegundos se calculan con aritmética entera comprobada y redondeo al entero más cercano: (delta_ticks * 1000000000 + hz / 2) / hz. Las marcas de tiempo de los eventos para asignarlos a ventanas utilizan el mapeo acotado del contador a MONOTONIC. El valor y su intervalo de inicio/fin mapeado tienen propósitos distintos y no tienen por qué ser numéricamente idénticos. La precisión física desconocida permanece como null en el flujo.

Jitter Tools 1.3.0

MEMjitter

Elija acceso a memoria residente, first-touch o latency de llamadas mmap.

ModoMétricaOperación cronometrada
resident, predeterminadomem_resident_operation_nsUna lectura de byte, lectura/modificación/escritura no atómica o paso de seguimiento de punteros.
first-touchmem_first_touch_nsUna escritura volátil de byte en un desplazamiento aún no tocado dentro de una época verificada de mapeo/restablecimiento.
allocmem_alloc_call_nsUna llamada exitosa a la API mmap privada anónima; sin acceso a páginas ni munmap dentro del intervalo cronometrado.

Lecturas y lecturas/modificaciones/escrituras en memoria residente

Los valores predeterminados son resident, read, sequential, un mapeo de 16777216 bytes (16 MiB), un paso del tamaño de página del sistema, desplazamiento 0 y semilla 1. La preparación toca cada página base, precalienta el plan de acceso y comprueba la residencia inicial con mincore. Sin un bloqueo explícito, esa instantánea no garantiza una residencia continua.

Pruebas de memoria residente separadas: lecturas predeterminadas y RMW aleatoria no atómica de bytes
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read cronometra una carga volátil de byte. rmw cronometra una carga de byte, un incremento con desbordamiento modular y un almacenamiento; no es atómico ni mide la finalización globalmente visible del almacenamiento. El intervalo cronometrado incluye la sobrecarga de marcas de tiempo y barreras. El resultado no es la latency pura de DRAM.

Seguimiento dependiente de punteros

Una cadena dependiente a través de los desplazamientos seleccionados
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase selecciona pointer-chase automáticamente salvo que el patrón sea explícito. Un patrón explícito también debe ser pointer-chase. Otros patrones de memoria residente son sequential, random con reemplazo y permutation. La selección de direcciones y la gestión de registros quedan fuera de cada operación medida. Un mapeo de 16 MiB con pasos de una página en un host con páginas de 4096 bytes tiene 4096 posiciones muestreadas, no 16 MiB de datos leídos en cada pasada.

Escrituras de first-touch

Mapeos nuevos, con el restablecimiento fuera de la escritura cronometrada
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Descarte explícito con MADV_DONTNEED y un orden de acceso repetible
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch permite sequential o permutation, sin reemplazo dentro de una época. write es la única operación y no necesita especificarse. Tras cada remapeo/descarte exitoso, mincore debe confirmar que no hay páginas residentes antes de iniciar una nueva época. El trabajo de restablecimiento es tiempo de servicio excluido. La primera escritura de un byte no implica necesariamente un fallo de página independiente ni una asignación de página física, especialmente cuando THP respalda varios desplazamientos. Remap y madvise son experimentos diferentes.

Llamadas a la API de asignación

Latency simple de llamadas mmap; son ejecuciones separadas
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc crea como máximo un mapeo propio a la vez y lo desmapea antes de la siguiente llamada. Solo los intervalos mmap exitosos entran en el histograma. mmap establece un mapeo virtual, no la materialización física de todas las páginas. La envoltura C ABI/libc y el intervalo de marcas de tiempo siguen formando parte del valor. Este modo no implementa el antiguo alloc-cycle, la latency de malloc/calloc ni la generación automática de presión de memoria.

Opciones de distribución y modo

OpciónValores y restricciones
--moderesident | first-touch | alloc; resident de forma predeterminada.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NBytes decimales, múltiplo de página; 16777216 de forma predeterminada, máximo 1073741824. No es una cadena con sufijo MiB.
--stride-bytes NAl menos una página del sistema operativo, alineado a página y divisor de --bytes; tamaño de página del sistema de forma predeterminada. Solo resident/first-touch.
--offset-bytes NDesplazamiento en bytes dentro de una página base muestreada; 0 de forma predeterminada. Chase también requiere alineación a usize y espacio suficiente.
--seed NEntero distinto de cero; 1 de forma predeterminada. Solo resident/first-touch.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetSolo first-touch: remap (predeterminado) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msLos mismos valores predeterminados y límites que CPUJitter.
--threshold METRIC=NUtilice la métrica exacta del modo seleccionado; comparación estricta > en las ventanas.
Contar valores de first-touch superiores a 20 microsegundos
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc rechaza las opciones de patrón, paso, desplazamiento, semilla y restablecimiento, incluso cuando sus valores se parecen a los predeterminados. Ningún modo de memoria acepta --counter-read de CPUJitter. Mantenga la misma operación, patrón, bytes, paso, desplazamiento, semilla, restablecimiento y modo de salida al comparar resultados.

Jitter Tools 1.3.0

Políticas de memoria

Aplique las políticas opcionales únicamente al mapeo propio de la herramienta.

Los valores predeterminados son --lock none, --thp system, la política NUMA heredada y ninguna solicitud explícita de HugeTLB. La herramienta no reconfigura el sistema, amplía los límites de bloqueo, cambia la reserva de páginas enormes ni reintenta con una política menos estricta. Una solicitud explícita no compatible falla e indica el motivo.

Políticaresidentfirst-touchalloc
--lock nonePredeterminadoPredeterminadoPermitido
--lock residentmlock antes de la preparaciónRechazadoRechazado
--lock onfaultmlock2, seguido de la preparación de memoria residenteSolo con --reset remapRechazado
--thp systemPredeterminado, sin indicaciónPredeterminado, sin indicaciónPermitido
--thp never o --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEPermitido y reaplicado tras el remapeoRechazado
--numa-node NMPOL_BIND limitado al rangoMPOL_BIND limitado al rangoRechazado
--hugetlb-bytes NMapeo HugeTLB explícitoRechazadoRechazado
Un pequeño conjunto de trabajo residente bloqueado, sujeto a RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Bloquear en el fallo de página conservando la preparación de first-touch
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Experimentos separados de indicaciones THP, no una configuración global de THP
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Vincular el mapeo propio a un nodo NUMA físico permitido
./memjitter -c 4 --numa-node 0 --duration 10
Páginas HugeTLB explícitas de 2 MiB, solo cuando la reserva y la compatibilidad del host ya estén disponibles
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

El bloqueo impide el intercambio a swap del mapeo mientras se mantiene; no coloca los datos permanentemente en la caché de CPU. Una llamada aceptada de indicación THP no demuestra que se usen páginas enormes. Leer la política NUMA configurada es distinto de observar la ubicación física de las páginas. Los ID NUMA son 0..4095 y deben estar permitidos por el host.

Un tamaño HugeTLB explícito debe ser una potencia de dos mayor que la página base del sistema operativo, de hasta 1 GiB, y dividir el tamaño del mapeo. Es incompatible con el bloqueo explícito o con indicaciones THP distintas de system. La preparación de memoria residente requiere que MADV_POPULATE_WRITE tenga éxito para ese rango. La reserva existente, las cuotas, los permisos y la operación necesaria del kernel deben admitir la solicitud; no se recurre a páginas ordinarias como alternativa.

La política solicitada, las operaciones exitosas y el estado observado del mapeo se registran por separado. Las observaciones iniciales aparecen en meta; las observaciones finales del mapeo se escriben en stderr antes de desmapear. La información no disponible o no atribuible permanece como null. Las instantáneas de archivos proc y las comprobaciones de políticas añaden trabajo de servicio, por lo que deben compararse ejecuciones con políticas equivalentes.

Jitter Tools 1.3.0

IRQjitter

Observe las duraciones de los manejadores y las esperas de softirq sin cambiar la ubicación de IRQ.

IRQjitter utiliza un hilo lector en el espacio de usuario y su propia instancia tracefs. Los tracepoints de IRQ requeridos son irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry y softirq_exit. La instancia debe admitir el reloj de trazado mono. No monta tracefs, cambia sus permisos con chmod, modifica la afinidad IRQ/RSS, detiene irqbalance ni activa un backend alternativo.

Comprobar si existe un montaje tracefs; utilizar su punto de montaje real
grep " tracefs " /proc/mounts
Ruta de montaje tracefs explícita, con una fila de vista general por segundo
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

CPU del recolector frente a CPU observadas

Recolector en la CPU 1; observar solo las CPU 4 a 7
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Sin --target-cpus, se observan los eventos compatibles de todas las CPU en línea, incluida la CPU del recolector. Una lista de CPU como 2,4-7 restringe la recolección, no solo la presentación. La actividad de IRQ que se desplaza fuera del conjunto seleccionado queda fuera de la cobertura. La conexión en caliente de CPU se supervisa dentro del conjunto inicial de CPU posibles, y los cambios se notifican con información de cobertura.

Tres métricas de tiempo distintas

MétricaQué mideInterpretación
irq_handler_elapsed_nsUna entrada/salida coincidente de un manejador de acción en la misma CPUIncluye el trabajo intermedio/anidado; no es la latency de entrega de interrupciones del dispositivo a la CPU.
softirq_elapsed_nsUna entrada/salida coincidente de un vector softirq en la misma CPUNo es tiempo exclusivo de CPU ni tiempo de procesamiento por paquete.
softirq_observed_raise_to_entry_nsDesde la primera activación pendiente observada y guardada hasta la siguiente entrada en esa CPU/vectorUna espera observada, posiblemente fusionada; no es el tiempo de espera de un paquete individual.

Una fuente de IRQ se identifica mediante la métrica, la CPU real, el número y el nombre de la fuente. Los recuentos describen observaciones completadas de manejadores, no interrupciones físicas ni paquetes. Los pares idénticos de número/nombre de fuente no demuestran una identidad persistente del dispositivo tras una reconfiguración. Un valor transcurrido de cero puede reflejar la resolución de las marcas de tiempo textuales de la traza, habitualmente del orden de microsegundos, y no un tiempo físico nulo.

Vista general, detalles y eventos sin procesar

Ejecuciones separadas: vista general, tabla compacta por fuente y ventanas JSON detalladas
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
Captura breve sin procesar para una CPU observada
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details solo es válido para ventanas compactas y no puede combinarse con --json ni --raw. JSON ya conserva los registros de ventanas por CPU/fuente. Esta versión no incluye un modo timerlat ni un backend eBPF. La softirq TIMER real sigue siendo observable.

Observaciones opcionales de trabajo/presupuesto de NAPI

NAPI añade observaciones de trabajo/presupuesto a cualquiera de las vistas compactas
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi requiere un tracepoint napi:napi_poll compatible. La métrica es napi_poll_work, con unidad work, no nanosegundos. Informa del valor de trabajo devuelto y del presupuesto. at_budget requiere un presupuesto positivo y un trabajo igual al presupuesto; over_budget requiere un trabajo mayor que un presupuesto positivo. Ninguno demuestra por sí solo una acumulación de paquetes pendientes. No se proporcionan la duración de NAPI, la latency de IRQ a NAPI ni un ID de cola de hardware inferido.

Controles de ventanas y recursos

OpciónValor predeterminado y rango
--threshold NSEntero no negativo; se aplica únicamente a las series de tiempo. A diferencia de CPU/MEM, no se indica el nombre de una métrica.
--lateness SECPredeterminado: min(window / 10, 0.01 segundos). Rango 0..window, hasta nueve cifras decimales. Solo ventanas.
--max-series N256 para ventanas, 4096 para datos sin procesar; rango 1..4096.
--window-memory-mib N64; 1..512. Límite de memoria de ventanas.
--buffer-kb N256 por CPU posible; 16..16384.
--max-trace-mib N256; 1..4096. Presupuesto total conservador de búferes de traza del kernel, no memoria total del proceso.
--output-bytes N8388608; 65536..8388608. Cola de salida limitada.
--write-timeout-ms N1000; 1..60000. Plazo cooperativo de salida.
Observar valores de tiempo superiores a 10 microsegundos en el conjunto de CPU seleccionado
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

Las muestras completadas tardíamente se notifican como tardías y no se trasladan a una ventana posterior ni se utilizan para reescribir la salida anterior. Una salida lenta puede retrasar la lectura de trazas y provocar pérdidas en los búferes del kernel. El recolector comprueba los controles y las estadísticas de los búferes, pero ni las lecturas vacías ni la ausencia de avisos de pérdida demuestran una cobertura completa. La instrumentación de trazas también se ejecuta en las CPU de los eventos, no solo en la CPU del recolector.

Jitter Tools 1.3.0

Interpretar la salida

Separe los valores medidos, la cobertura, los límites estadísticos y el estado de ejecución.

Columnas compactas de CPU/MEM

Solo distribución de columnas, no resultados de medición
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
ColumnaSignificado
TIME(s)Final de la ventana relativo al inicio de la observación, en segundos, no UTC.
COUNTNúmero de observaciones aceptadas en esa fila.
MIN / MAXExtremos exactos de los valores enteros comunicados, en ns para las métricas de tiempo. Esto no afirma precisión física.
AVGSe muestra con una resolución de 0.1 ns utilizando aritmética entera; JSON conserva la suma y el recuento exactos.
P99<= / P99.9<=Límites superiores de los intervalos correspondientes del histograma, acotados por los extremos observados. No son un percentil exacto de datos ordenados ni un intervalo de confianza.
ACTIVE%Tiempo de medición cubierto dividido por la duración de la ventana, no utilización de CPU.
LOSSseen significa que se ha observado un aviso de pérdida; el indicador permanece activado. Un guion significa que no se observó ningún aviso, no que se haya demostrado la integridad de la cobertura.
QUALITYClasificación conservada de la calidad de los datos. partial puede describir instrumentación no calificada.
PARTyes significa que la ventana estadística final es más corta que el ancho solicitado. Es independiente de QUALITY.

Un umbral de tiempo añade un sufijo como >5000=N, donde N es el recuento estrictamente superior al límite. Una población vacía tiene COUNT=0 y estadísticas NA, no latency cero. --details de IRQ añade METRIC, SOURCE, UNIT y los campos específicos de NAPI BUDGET_MAX, AT_BUDGET y OVER_BUDGET; los valores no aplicables son NA.

Columnas de la vista general de IRQ

Vista general predeterminada de IRQ; --napi añade un grupo independiente de trabajo/presupuesto
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 y WAIT son poblaciones separadas. Cada una combina histogramas de fuentes compatibles de las CPU observadas para esa métrica y ventana; los percentiles se recalculan a partir de los recuentos agrupados de los intervalos, no mediante el promedio de percentiles de las fuentes.

Columna de diagnósticoSignificado
PAIR_GAPSNúmero de avisos de emparejamiento detectados. No es un recuento de interrupciones de hardware ni paquetes perdidos.
LATEMuestras completadas rechazadas después de que su ventana ya se hubiera publicado. Los recuentos desconocidos siguen siendo desconocidos.
BUFFERnot-observed, loss-observed o unknown. not-observed no certifica la ausencia de pérdidas.
OTHEROtros avisos de diagnóstico, no recuentos de IRQ.
PARTUna ventana estadística final más corta.

Por ejemplo, softirq_entry_without_observed_raise incrementa los diagnósticos de emparejamiento. No demuestra un desbordamiento del búfer circular de trazas, y todavía puede conservarse una duración válida de entrada/salida posterior. Las estadísticas de los búferes y los marcadores textuales de pérdida pueden solaparse; no los sume para inventar un recuento total de pérdidas.

Resúmenes al final de la ejecución

La salida compacta imprime # SUMMARY, filas # TOTAL y un estado de finalización después de la última ventana, incluida la ventana parcial final. CPU/MEM y los detalles de IRQ resumen cada serie; la vista general de IRQ genera totales de tiempo agrupados separados y totales opcionales de trabajo NAPI. El resumen de la vista general de IRQ incluye MAX_CPU y MAX_SOURCE, de modo que el mayor evento observado conserva su fuente.

Los totales utilizan recuentos y sumas exactos de ventanas comunicadas por completo, media ponderada, extremos e intervalos del histograma combinados. No son promedios de medias ni de percentiles de ventanas. scope=reported_windows excluye las muestras no comunicadas y tardías. Una fuente asociada a un máximo es una identidad de observación, no una causa raíz demostrada.

JSON Lines para automatización

Utilice --json para conservar los metadatos, las ventanas por serie, los motivos de calidad, los registros de pérdidas/intervalos sin cobertura y el registro terminal de finalización. Utilice --raw --json para muestras individuales. El texto de resumen compacto no se añade a JSON. Los valores enteros grandes, como nanosegundos, recuentos y sumas, son cadenas decimales; analícelos como enteros, no como números de coma flotante. Un valor null es desconocido, no cero.

Ejemplos opcionales de jq para examinar un archivo JSONL guardado
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

El registro de finalización separa execution, la calidad y cleanup.confirmed. observations_aggregated es importante para el modo de ventanas; un observations_emitted de cero no significa que no se hayan recopilado datos si los valores se agregaron en ventanas. Conserve el archivo completo y stderr, en lugar de solo líneas de ventanas seleccionadas.

Jitter Tools 1.3.0

Automatización y ejecuciones A/B

Guarde las ejecuciones completas y conserve el código de salida del productor.

Código de salidaSignificado
0Ejecución/datos completos según el contrato informado. En cambio, los productores actuales en ejecución normalmente conservan el estado no calificado.
2Fallo de CLI, capacidad, ejecución, salida o limpieza. Examine stderr y cualquier registro de finalización disponible.
3Datos parciales o no calificados. Puede ser una ejecución completada funcionalmente con limpieza confirmada.
130SIGINT gestionado, como Ctrl+C, cuando la limpieza tiene éxito.
143SIGTERM gestionado cuando la limpieza tiene éxito.

Estos son los códigos documentados de la herramienta, no una garantía sobre cada shell, envoltura de tiempo de espera o señal fatal. Conserve los estados distintos de cero; evite añadir || true para que un resultado parezca exitoso. Una tubería cerrada por head puede impedir los registros finales. --samples o --duration es la forma admitida de limitar una captura.

Ejemplo Bash que conserva la salida, los diagnósticos, la identidad de la compilación y el estado de salida
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

Compare ejecuciones equivalentes

Para comparar el kernel estándar con HFTKernel, utilice la misma compilación del ejecutable, función de CPU, modo de memoria, operación, patrón, tamaño, semilla, política de restablecimiento, políticas explícitas de memoria, modo de lectura del contador, lote, destino de salida, tamaño de ventana y duración. Conserve los metadatos del kernel, la topología y el planificador de cada ejecución. Cambie la variable prevista en lugar de cambiar al mismo tiempo la definición de la medición.

Ejecute cada experimento por separado. Esta versión permite lanzar dos herramientas activas en la misma CPU, pero entonces las ejecuciones interfieren entre sí y no constituyen referencias independientes. Mantenga el trazado de diagnóstico separado de la medición A/B principal cuando el objetivo sea evitar introducir una carga de trazado diferente en solo una de las partes.

Compare conjuntamente los recuentos, las distribuciones, los máximos, las superaciones de umbral, la cobertura y la calidad. No promedie valores p99 entre ejecuciones o ventanas. Un total compacto de toda la ejecución agrupa los histogramas comunicados dentro de esa ejecución; un análisis exacto de poblaciones entre ejecuciones requiere conservar datos subyacentes compatibles. La CLI 3.x de CPU/MEM y sus poblaciones de medición no son intercambiables con los perfiles de pruebas 2.x anteriores ya publicados en el sitio de HFTKernel.

Jitter Tools 1.3.0

Solución de problemas

Localice la fase que ha fallado sin cambiar silenciosamente el experimento.

ObservaciónInterpretación y siguiente comprobación
No aparece ninguna fila inmediatamente después del inicioCPU/MEM primero se preparan y calibran. Después debe transcurrir una ventana -n completa. Una ejecución finita más corta emite su ventana parcial final.
CPU rechazada o error de afinidadCompruebe el ID de CPU Linux solicitado, su estado en línea y los permisos de cpuset. Seleccione explícitamente una CPU válida; la herramienta no elegirá otra de forma silenciosa.
Fallo de acceso al contador o de calibraciónExamine los diagnósticos del contador y del reloj. CPU/MEM requieren contadores específicos de la arquitectura utilizables; esta CLI no recurre a un reloj alternativo.
Salida 3 / partial / producer_unqualifiedInterprete la ejecución y la limpieza como hechos separados. Este estado por sí solo no demuestra una gestión de IRQ sobrecargada ni un ajuste incorrecto del kernel.
Valores de IRQ cero o NACero puede reflejar la resolución de las marcas de tiempo de la traza; NA puede significar que no hay ninguna muestra completada. Ninguno demuestra un sistema sin retrasos.
softirq_entry_without_observed_raiseUn par pendiente observado incompleto. Compruebe PAIR_GAPS y el JSON detallado; no lo denomine pérdida de paquetes ni desbordamiento del búfer circular.
Eventos tardíos o pérdida de búferConserve las pruebas de pérdida. Revise el alcance de los eventos, la velocidad de salida y los presupuestos de recursos. Las ventanas más cortas y la salida sin procesar pueden añadir carga. Una nueva ejecución con ajustes modificados es una configuración diferente.
No se puede abrir/crear una instancia tracefsVerifique el montaje, los permisos, el reloj mono y los formatos de eventos compatibles. El programa no monta, cambia permisos con chmod ni toma posesión de otra sesión.
Falta record-cmd o record-tgid en una instanciaEstas cachés globales son opcionales para este recolector. Diagnostique el control realmente necesario y errno; no cambie las cachés globales solo para satisfacer a la herramienta.
NAPI solicitado pero no compatibleLa solicitud --napi falla explícitamente. Ejecute sin --napi únicamente como un experimento deliberadamente separado de solo IRQ.
Solicitud mlock / NUMA / HugeTLB rechazadaExamine errno, el límite de bloqueo, los nodos permitidos, la reserva existente de páginas enormes y la compatibilidad del host. No se realiza elevación automática, aprovisionamiento de la reserva ni cambio a una política alternativa.
Tiempo de espera de salida agotado, EPIPE o falta del registro de finalizaciónLa salida está incompleta. Conserve stderr, utilice ejecuciones limitadas y un destino capaz de mantener el ritmo. No clasifique una captura truncada como completa.
Fallo de limpieza o instancia residualExamine cleanup.errors y recovery_required. Verifique la instancia propia comunicada y la ausencia de un propietario activo antes de cualquier acción de administración. No elimine instancias tracefs de forma recursiva.

El cierre ordenado de IRQ detiene el registro, vacía los datos dentro de límites definidos, desactiva los eventos propios, cierra los descriptores, elimina únicamente su propia instancia y restaura la afinidad. Un fallo gestionado sigue siendo un fallo aunque la limpieza posterior libere los recursos. SIGKILL y los fallos del host no permiten garantizar la eliminación completa de la instancia.

Referencias del código fuente

Referencias de implementación específicas de la versión

Esta guía se deriva del código fuente, los analizadores de CLI y los contratos de medición suministrados con Jitter Tools 1.3.0. No certifica la precisión de las mediciones de tiempo en ejecución ni la compatibilidad con todas las distribuciones. Las rutas de archivos de código fuente que se indican a continuación son relativas al archivo de código fuente.

Archivo de código fuente: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Identidad de la versión y flujo de trabajo de compilación
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Analizadores de línea de comandos y validación
  • 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. Captura de CPU, relojes y ubicación
  • 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. Operaciones de memoria residente
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. Modos first-touch y de asignación
  • 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. Políticas de memoria explícitas por mapeo
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Recolección pasiva de IRQ y ciclo de vida de 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. Ventanas de IRQ, vista general y NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Salida, histogramas, resumen y esquema del flujo
  • 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