Guia do usuário das ferramentas de medição

Meça o comportamento de CPU, memória e IRQ.

Comandos, limites de medição, campos de saída e comparações reproduzíveis para Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Comece aqui

Escolha uma ferramenta, confira sua versão e execute uma medição finita.

O Jitter Tools 1.3.0 fornece três ferramentas independentes de linha de comando para Linux. O CPUJitter observa intervalos sem execução em uma CPU. O MEMjitter mede operações de memória declaradas. O IRQjitter observa eventos de IRQ e softirq do kernel por meio de tracefs. Use cada uma separadamente para responder a uma pergunta de medição específica.

ComponenteVersão documentadaPergunta principal
CPUJitter3.2.2Quanto duram os intervalos entre leituras consecutivas do contador na CPU selecionada?
MEMjitter3.5.2Quanto tempo levam os acessos à memória residente, as primeiras gravações ou as chamadas mmap bem-sucedidas?
IRQjitter1.3.0Quais manipuladores e esperas de IRQ/softirq observados têm tempos decorridos longos?
Fluxo legível por máquinajitter.stream/0.6.0Como as medições, a cobertura, a qualidade e a limpeza são registradas?
A partir de um diretório que contenha os três executáveis
./cpujitter --version
./memjitter --version
./irqjitter --version

Os exemplos abaixo são executados a partir de uma distribuição binária descompactada. Após a compilação do código-fonte, os mesmos executáveis estão em ./bin/. Se estiverem instalados em PATH, omita o prefixo ./. Os números de CPU são exemplos, não uma recomendação de posicionamento para produção. Substitua-os por IDs de CPU Linux permitidos e on-line no seu host.

Consultar os limites de CPU e nós de memória do processo atual
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
Intervalos de execução de CPU, um resumo por segundo
./cpujitter -c 4 --duration 10
Leituras de bytes residentes, um resumo por segundo
./memjitter -c 4 --duration 10
Visão geral de IRQ; a CPU 1 executa o coletor e todas as CPUs on-line são observadas
sudo ./irqjitter -c 1 --duration 10

Execute estes exemplos um de cada vez. Os testes de CPU e memória são cargas de trabalho ativas. O IRQjitter é passivo no sentido de não gerar tráfego de teste, mas o rastreamento e a coleta ainda têm sobrecarga. CPU/MEM não exigem root, SMT desativado, isolamento de CPU, uma CPU exclusiva nem HFTKernel. A coleta de IRQ exige acesso a uma montagem tracefs existente e permissão para criar sua própria instância; sudo é uma forma de fornecer essas permissões.

Jitter Tools 1.3.0

Compilar e verificar

Mantenha separadas as verificações de compilação do código-fonte e as da distribuição binária.

O arquivo 1.3.0 fornecido contém somente código-fonte. Ele não contém executáveis ELF prontos para uso. Sua qualificação registrada não comprova uma compilação Rust concluída nem uma execução real de IRQ. O ponto de entrada aceito para o código-fonte é test.sh; ele compila e testa antes de publicar os binários.

Requisito de compilaçãoEscopo
Linux GNU, x86_64 ou aarch64Compilar de forma nativa para a arquitetura do host.
Rust 1.85 ou posterior, rustfmt e clippyCompilador e controles de qualidade do Rust.
Compilador C, ar, arquivos de desenvolvimento de libc estática, readelfCódigo ABI nativo, vinculação estática GNU e verificações ELF.
Python 3.10 ou posterior e os requisitos dos testesTestes do código-fonte e orquestração da compilação. Os executáveis de medição resultantes não exigem Python.
Ponto de entrada aceito para compilar e testar o código-fonte
cd jitter-tools-1.3.0
./test.sh

O Cargo é executado off-line, com um conjunto fixo de dependências e sem dependências de registro. As dependências de teste do Python podem ser provisionadas em .test-env/ dentro do projeto. Use --offline quando o ambiente já estiver preparado e os downloads de índices de pacotes precisarem ser desativados.

Execução de aceitação do código-fonte, com as dependências já disponíveis
./test.sh --offline --acceptance

Após a aprovação de todos os controles obrigatórios, o fluxo de trabalho publica bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json e um arquivo de distribuição estática com versão. As referências públicas ao arquivo usam o nome canônico jitter-tools-1.3.0.tgz. O conjunto da versão inclui BUILD.json, ELF.json, somas de verificação, avisos e documentação. Não trate uma compilação do código-fonte parcialmente concluída como uma distribuição estática qualificada.

Em uma distribuição binária descompactada, test.sh verifica os arquivos entregues
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

O test.sh da distribuição binária exige sh, readelf, sha256sum e grep. Ele não é o executor de compilação do código-fonte. Os executáveis estáticos GNU não precisam de Rust, Python, um interpretador ELF nem bibliotecas compartilhadas adjacentes em tempo de execução. Ainda precisam de um kernel Linux compatível com a arquitetura, das chamadas de sistema necessárias e de /proc e /sys; o IRQjitter também precisa de tracefs. As verificações ELF são evidências do empacotamento, não uma garantia de precisão de medição ou de suporte em todas as versões do kernel.

Jitter Tools 1.3.0

Controles comuns

Selecione uma CPU, defina um limite de execução e escolha saída por janelas ou sem processamento.

ControleComportamento
-c CPUObrigatório em todas as execuções de medição. Um único ID decimal de CPU Linux, 0..65535. Listas e intervalos não são aceitos aqui. Nenhuma CPU alternativa é selecionada automaticamente.
-n SECLargura da janela e intervalo de resumo; padrão de 1 segundo, intervalo 0.001..86400. Não define a frequência de amostragem.
--duration SECDuração finita da observação, 0.001..86400 segundos. A preparação e a calibração de CPU/MEM precedem a observação.
--samples NSomente CPU/MEM. Parar após um número positivo de observações concluídas. O IRQjitter não tem a opção --samples.
--jsonJSON Lines. Mantém as janelas padrão de um segundo, a menos que --raw também seja informado.
--rawObservações individuais com registros completos do protocolo. Não pode ser combinado com -n nem com controles exclusivos de janelas.
--help, --version, --build-infoExecute cada opção informativa separadamente. Não é necessário usar -c, calibrar ou medir.

CPU/MEM também aceitam --cpu e --interval. O IRQjitter 1.3.0 usa somente -c e -n para esses controles. As três ferramentas aceitam valores curtos anexados, como -c4 -n0.1. Use segundos decimais simples, por exemplo 0.1, não 100ms, 1e-1 ou .1. Opções repetidas são rejeitadas.

Janelas estatísticas de 100 ms; o laço de captura continua entre os resumos
./cpujitter -c4 -n0.1 --duration 5
Captura sem processamento limitada; sem a opção -n
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

Os dados vão para stdout e os diagnósticos para stderr. Redirecionar stdout não seleciona o modo JSON nem o modo sem processamento. Use uma duração finita ou Ctrl+C para parar. Um SIGINT/SIGTERM tratado emite registros finais quando o canal de saída permanece utilizável e a limpeza é bem-sucedida. Uma chamada de sistema bloqueada, SIGKILL, um host com falha ou um pipe fechado impedem qualquer garantia de parada imediata ou saída final completa.

Jitter Tools 1.3.0

CPUJitter

Meça intervalos consecutivos de execução em uma CPU selecionada.

A métrica cpu_iteration_elapsed_ns é o tempo decorrido calibrado entre leituras consecutivas do contador de hardware dentro de um lote de captura. Ela inclui a ramificação do laço, o armazenamento de marcas de tempo e a sobrecarga de leitura do contador. Não é a contagem de ciclos do núcleo da CPU, uma medição da entrega de interrupções de dispositivos nem uma classificação direta da causa de uma pausa.

ordered é o modo padrão de leitura do contador; relaxed é uma alternativa explícita com contexto distinto. A calibração usa sete segmentos de pelo menos 50 ms em relação a CLOCK_MONOTONIC_RAW, com escala fixa durante a execução. Nenhum valor de referência nem custo do contador é subtraído. Em x86, são necessários suporte declarado a TSC invariável e acesso utilizável ao contador; contadores incompatíveis são rejeitados em vez de substituídos silenciosamente.

Separe as execuções ordered e relaxed; mantenha suas distribuições separadas
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Contar intervalos estritamente maiores que 5 microssegundos, sem filtrar nenhuma amostra
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Salvar janelas, metadados e estado de encerramento
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
Controle específico de CPU ou de capturaPadrão e intervalo
--counter-read ordered|relaxedordered. Compare contextos equivalentes de leitura do contador.
--batch-records N4096; 1..65536. Capacidade pré-alocada do lote de leituras consecutivas.
--buffer-bytes N8388608; 16384..8388608. Fila limitada de stdout.
--write-timeout-ms N1000; 1..60000. Prazo cooperativo de saída, não uma garantia rígida de tempo real.
--threshold cpu_iteration_elapsed_ns=NNanossegundos inteiros não negativos. Conta os valores > N nas janelas.

Um lote tem uma marca de tempo inicial e observações concluídas. A captura é separada das âncoras do relógio, da validação, da agregação e da saída. Um orçamento cooperativo do contador verifica aproximadamente 20 ms de trabalho de captura a cada 256 registros; ele não corta um atraso observado grande. ACTIVE% descreve a parte de captura coberta, não a utilização total da CPU. Pausas que ocorrem fora da captura não são observadas para esta métrica.

Os nanossegundos são calculados com aritmética inteira verificada e arredondamento para o inteiro mais próximo: (delta_ticks * 1000000000 + hz / 2) / hz. As marcas de tempo dos eventos para atribuição a janelas usam o mapeamento delimitado do contador para MONOTONIC. O valor e seu intervalo mapeado de início/fim têm finalidades diferentes e não precisam ser numericamente idênticos. A precisão física desconhecida permanece como null no fluxo.

Jitter Tools 1.3.0

MEMjitter

Escolha acesso à memória residente, first-touch ou latency de chamadas mmap.

ModoMétricaOperação cronometrada
resident, padrãomem_resident_operation_nsUma leitura de byte, leitura/modificação/gravação não atômica ou etapa de seguimento de ponteiros.
first-touchmem_first_touch_nsUma gravação volátil de byte em um deslocamento ainda não tocado dentro de uma época verificada de mapeamento/redefinição.
allocmem_alloc_call_nsUma chamada bem-sucedida à API mmap privada anônima; sem acesso a páginas nem munmap dentro do intervalo cronometrado.

Leituras e leituras/modificações/gravações em memória residente

Os padrões são resident, read, sequential, um mapeamento de 16777216 bytes (16 MiB), um passo do tamanho de página do sistema, deslocamento 0 e semente 1. A preparação toca cada página base, aquece o plano de acesso e verifica a residência inicial com mincore. Sem um bloqueio explícito, essa captura do estado não garante residência contínua.

Testes separados de memória residente: leituras padrão e RMW aleatória não atômica de bytes
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read cronometra uma carga volátil de byte. rmw cronometra uma carga de byte, um incremento com estouro modular e uma gravação; não é atômico nem mede a conclusão globalmente visível da gravação. O intervalo cronometrado inclui a sobrecarga de marcas de tempo e barreiras. O resultado não é a latency pura da DRAM.

Seguimento dependente de ponteiros

Uma cadeia dependente pelos deslocamentos selecionados
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase seleciona pointer-chase automaticamente, a menos que um padrão seja explícito. Um padrão explícito também deve ser pointer-chase. Outros padrões de memória residente são sequential, random com reposição e permutation. A seleção de endereços e a manutenção dos registros ficam fora de cada operação medida. Um mapeamento de 16 MiB com passos de uma página em um host com páginas de 4096 bytes tem 4096 posições amostradas, não 16 MiB de dados lidos a cada passagem.

Gravações de first-touch

Mapeamentos novos, com redefinição fora da gravação cronometrada
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Descarte explícito com MADV_DONTNEED e ordem de acesso repetível
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch permite sequential ou permutation, sem reposição dentro de uma época. write é a única operação e não precisa ser especificada. Após cada remapeamento/descarte bem-sucedido, mincore deve confirmar que não há páginas residentes antes de uma nova época começar. O trabalho de redefinição é tempo de serviço excluído. A primeira gravação de um byte não é necessariamente uma falha de página separada nem uma alocação de página física, especialmente quando THP cobre vários deslocamentos. Remap e madvise são experimentos diferentes.

Chamadas à API de alocação

Latency simples de chamadas mmap; são execuções separadas
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc cria no máximo um mapeamento próprio por vez e o desmapeia antes da próxima chamada. Somente intervalos mmap bem-sucedidos entram no histograma. mmap estabelece um mapeamento virtual, não a materialização física de todas as páginas. A camada C ABI/libc e o intervalo de marcas de tempo continuam fazendo parte do valor. Este modo não implementa o antigo alloc-cycle, a latency de malloc/calloc nem a geração automática de pressão de memória.

Opções de distribuição e modo

OpçãoValores e restrições
--moderesident | first-touch | alloc; resident por padrão.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NBytes decimais, múltiplo de página; padrão de 16777216, máximo de 1073741824. Não é uma string com sufixo MiB.
--stride-bytes NPelo menos uma página do sistema operacional, alinhado à página e divisor de --bytes; tamanho de página do sistema por padrão. Somente resident/first-touch.
--offset-bytes NDeslocamento em bytes dentro de uma página base amostrada; padrão de 0. Chase também exige alinhamento a usize e espaço suficiente.
--seed NInteiro diferente de zero; padrão de 1. Somente resident/first-touch.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetSomente first-touch: remap (padrão) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msOs mesmos padrões e limites do CPUJitter.
--threshold METRIC=NUse a métrica exata do modo selecionado; comparação estrita > nas janelas.
Contar valores de first-touch acima de 20 microssegundos
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc rejeita opções de padrão, passo, deslocamento, semente e redefinição, mesmo quando seus valores se parecem com os padrões. Nenhum modo de memória aceita --counter-read do CPUJitter. Mantenha a mesma operação, padrão, bytes, passo, deslocamento, semente, redefinição e modo de saída ao comparar resultados.

Jitter Tools 1.3.0

Políticas de memória

Aplique políticas opcionais somente ao mapeamento próprio da ferramenta.

Os padrões são --lock none, --thp system, política NUMA herdada e nenhuma solicitação explícita de HugeTLB. A ferramenta não reconfigura o sistema, amplia limites de bloqueio, altera a reserva de páginas enormes nem tenta novamente com uma política menos restritiva. Uma solicitação explícita incompatível falha e informa o motivo.

Políticaresidentfirst-touchalloc
--lock nonePadrãoPadrãoPermitido
--lock residentmlock antes da preparaçãoRejeitadoRejeitado
--lock onfaultmlock2, seguido da preparação de memória residenteSomente com --reset remapRejeitado
--thp systemPadrão, sem orientaçãoPadrão, sem orientaçãoPermitido
--thp never ou --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEPermitido e reaplicado após o remapeamentoRejeitado
--numa-node NMPOL_BIND limitado ao intervaloMPOL_BIND limitado ao intervaloRejeitado
--hugetlb-bytes NMapeamento HugeTLB explícitoRejeitadoRejeitado
Um pequeno conjunto de trabalho residente bloqueado, sujeito a RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Bloquear na falha de página preservando a preparação de first-touch
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Experimentos separados de orientações THP, não uma configuração global de THP
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Vincular o mapeamento próprio a um nó NUMA físico permitido
./memjitter -c 4 --numa-node 0 --duration 10
Páginas HugeTLB explícitas de 2 MiB, somente quando a reserva e o suporte do host já estiverem disponíveis
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

O bloqueio impede a troca para swap do mapeamento enquanto mantido; ele não coloca os dados permanentemente no cache da CPU. Uma chamada aceita de orientação THP não comprova o uso de páginas enormes. A leitura da política NUMA configurada é diferente da observação do posicionamento físico das páginas. Os IDs NUMA são 0..4095 e devem ser permitidos pelo host.

Um tamanho HugeTLB explícito deve ser uma potência de dois maior que a página base do sistema operacional, de no máximo 1 GiB, e dividir o tamanho do mapeamento. Ele é incompatível com bloqueio explícito ou orientações THP diferentes de system. A preparação de memória residente exige sucesso de MADV_POPULATE_WRITE nesse intervalo. A reserva existente, as cotas, as permissões e a operação necessária do kernel devem dar suporte à solicitação; não há recurso alternativo a páginas comuns.

A política solicitada, as operações bem-sucedidas e o estado observado do mapeamento são registrados separadamente. As observações iniciais aparecem em meta; as observações finais do mapeamento são gravadas em stderr antes do desmapeamento. Informações indisponíveis ou não atribuíveis permanecem como null. As capturas de arquivos proc e as verificações de políticas acrescentam trabalho de serviço, portanto compare execuções com políticas equivalentes.

Jitter Tools 1.3.0

IRQjitter

Observe as durações dos manipuladores e as esperas de softirq sem alterar o posicionamento de IRQ.

O IRQjitter usa uma thread leitora no espaço de usuário e sua própria instância tracefs. Os tracepoints de IRQ necessários são irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry e softirq_exit. A instância deve aceitar o relógio de rastreamento mono. Ele não monta tracefs, altera suas permissões com chmod, muda a afinidade de IRQ/RSS, para irqbalance nem ativa um backend alternativo.

Verificar se existe uma montagem tracefs; usar seu ponto de montagem real
grep " tracefs " /proc/mounts
Caminho de montagem tracefs explícito, com uma linha de visão geral por segundo
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

CPU do coletor versus CPUs observadas

Coletor na CPU 1; observar somente as CPUs 4 a 7
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Sem --target-cpus, são observados os eventos compatíveis de todas as CPUs on-line, incluindo a CPU do coletor. Uma lista de CPUs como 2,4-7 restringe a coleta, não apenas a apresentação. A atividade de IRQ que se desloca para fora do conjunto selecionado fica fora da cobertura. A conexão a quente de CPU é monitorada dentro do conjunto inicial de CPUs possíveis, e as alterações são informadas com dados de cobertura.

Três métricas de tempo distintas

MétricaO que medeInterpretação
irq_handler_elapsed_nsUma entrada/saída correspondente de um manipulador de ação na mesma CPUInclui trabalho intermediário/aninhado; não é a latency de entrega de interrupções do dispositivo à CPU.
softirq_elapsed_nsUma entrada/saída correspondente de um vetor softirq na mesma CPUNão é tempo exclusivo de CPU nem tempo de processamento por pacote.
softirq_observed_raise_to_entry_nsDa primeira ativação pendente observada e salva até a próxima entrada nessa CPU/vetorUma espera observada, potencialmente agrupada; não é o tempo de espera de um pacote individual.

Uma fonte de IRQ é identificada pela métrica, pela CPU real, pelo número e pelo nome da fonte. As contagens descrevem observações concluídas de manipuladores, não interrupções físicas nem pacotes. Pares idênticos de número/nome de fonte não comprovam uma identidade persistente do dispositivo após reconfiguração. Um valor decorrido de zero pode refletir a resolução das marcas de tempo textuais da trilha, geralmente na ordem de microssegundos, em vez de tempo físico zero.

Visão geral, detalhes e eventos sem processamento

Execuções separadas: visão geral, tabela compacta por fonte e janelas JSON detalhadas
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 curta sem processamento para uma CPU observada
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details é válido somente para janelas compactas e não pode ser combinado com --json nem --raw. JSON já preserva os registros de janelas por CPU/fonte. Esta versão não tem modo timerlat nem backend eBPF. A softirq TIMER real continua observável.

Observações opcionais de trabalho/orçamento de NAPI

NAPI adiciona observações de trabalho/orçamento a qualquer uma das visualizações compactas
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi exige um tracepoint napi:napi_poll compatível. A métrica é napi_poll_work, com unidade work, não nanossegundos. Ela informa o valor de trabalho retornado e o orçamento. at_budget exige orçamento positivo com trabalho igual ao orçamento; over_budget exige trabalho maior que um orçamento positivo. Nenhum dos dois comprova, por si só, um acúmulo de pacotes pendentes. Não são fornecidos a duração de NAPI, a latency de IRQ a NAPI nem um ID inferido de fila de hardware.

Controles de janelas e recursos

OpçãoPadrão e intervalo
--threshold NSInteiro não negativo; aplica-se somente às séries de tempo. Diferentemente de CPU/MEM, nenhum nome de métrica é informado.
--lateness SECPadrão: min(window / 10, 0.01 segundos). Intervalo 0..window, até nove casas decimais. Somente janelas.
--max-series N256 para janelas, 4096 para dados sem processamento; intervalo 1..4096.
--window-memory-mib N64; 1..512. Limite de memória das janelas.
--buffer-kb N256 por CPU possível; 16..16384.
--max-trace-mib N256; 1..4096. Orçamento total conservador de buffers de rastreamento do kernel, não a memória total do processo.
--output-bytes N8388608; 65536..8388608. Fila de saída limitada.
--write-timeout-ms N1000; 1..60000. Prazo cooperativo de saída.
Observar valores de tempo acima de 10 microssegundos no conjunto de CPUs selecionado
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

Amostras concluídas com atraso são informadas como atrasadas e não são movidas para uma janela posterior nem usadas para reescrever saídas antigas. Uma saída lenta pode atrasar a leitura das trilhas e causar perda nos buffers do kernel. O coletor verifica os controles e as estatísticas dos buffers, mas nem leituras vazias nem a ausência de avisos de perda comprovam cobertura completa. A instrumentação de rastreamento também é executada nas CPUs dos eventos, não apenas na CPU do coletor.

Jitter Tools 1.3.0

Interpretar a saída

Separe os valores medidos, a cobertura, os limites estatísticos e o status da execução.

Colunas compactas de CPU/MEM

Somente a disposição das colunas, não resultados de medição
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
ColunaSignificado
TIME(s)Fim da janela relativo ao início da observação, em segundos, não UTC.
COUNTNúmero de observações aceitas nessa linha.
MIN / MAXExtremos exatos dos valores inteiros informados, em ns para métricas de tempo. Isso não afirma precisão física.
AVGExibido com resolução de 0.1 ns usando aritmética inteira; JSON preserva a soma e a contagem exatas.
P99<= / P99.9<=Limites superiores dos intervalos correspondentes do histograma, limitados pelos extremos observados. Não são um percentil exato de dados ordenados nem um intervalo de confiança.
ACTIVE%Tempo de medição coberto dividido pela duração da janela, não utilização da CPU.
LOSSseen significa que um aviso de perda foi observado; o indicador permanece ativado. Um traço significa que nenhum aviso foi observado, não que a cobertura completa foi comprovada.
QUALITYClassificação preservada da qualidade dos dados. partial pode descrever instrumentação não qualificada.
PARTyes significa que a janela estatística final é menor que a largura solicitada. É independente de QUALITY.

Um limiar de tempo adiciona um sufixo como >5000=N, em que N é a contagem estritamente acima do limite. Uma população vazia tem COUNT=0 e estatísticas NA, não latency zero. O --details de IRQ adiciona METRIC, SOURCE, UNIT e os campos específicos de NAPI BUDGET_MAX, AT_BUDGET e OVER_BUDGET; os valores não aplicáveis são NA.

Colunas da visão geral de IRQ

Visão geral padrão de IRQ; --napi adiciona um grupo separado de trabalho/orçamento
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 são populações separadas. Cada uma combina histogramas de fontes compatíveis das CPUs observadas para essa métrica e janela; os percentis são recalculados a partir das contagens agrupadas dos intervalos, não pela média dos percentis das fontes.

Coluna de diagnósticoSignificado
PAIR_GAPSNúmero de avisos de pareamento detectados. Não é uma contagem de interrupções de hardware nem de pacotes perdidos.
LATEAmostras concluídas rejeitadas depois que sua janela já foi publicada. Contagens desconhecidas continuam desconhecidas.
BUFFERnot-observed, loss-observed ou unknown. not-observed não certifica ausência de perdas.
OTHEROutros avisos de diagnóstico, não contagens de IRQ.
PARTUma janela estatística final mais curta.

Por exemplo, softirq_entry_without_observed_raise incrementa os diagnósticos de pareamento. Ele não comprova estouro do buffer circular de rastreamento, e uma duração válida de entrada/saída posterior ainda pode ser mantida. As estatísticas dos buffers e os marcadores textuais de perda podem se sobrepor; não os some para inventar uma contagem total de perdas.

Resumos ao final da execução

A saída compacta imprime # SUMMARY, linhas # TOTAL e um status de encerramento após a última janela, incluindo a janela parcial final. CPU/MEM e os detalhes de IRQ resumem cada série; a visão geral de IRQ produz totais de tempo agrupados separados e totais opcionais de trabalho NAPI. O resumo da visão geral de IRQ inclui MAX_CPU e MAX_SOURCE, para que o maior evento observado mantenha sua fonte.

Os totais usam contagens e somas exatas de janelas totalmente informadas, média ponderada, extremos e intervalos de histograma mesclados. Não são médias de médias nem de percentis das janelas. scope=reported_windows exclui amostras não informadas e atrasadas. Uma fonte associada a um máximo é uma identidade de observação, não uma causa raiz comprovada.

JSON Lines para automação

Use --json para preservar metadados, janelas por série, motivos de qualidade, registros de perdas/intervalos sem cobertura e o registro terminal de encerramento. Use --raw --json para amostras individuais. O texto de resumo compacto não é acrescentado ao JSON. Valores inteiros grandes, como nanossegundos, contagens e somas, são strings decimais; interprete-os como inteiros, não como números de ponto flutuante. Um valor null é desconhecido, não zero.

Exemplos opcionais de jq para examinar um arquivo JSONL salvo
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

O registro de encerramento separa execution, a qualidade e cleanup.confirmed. observations_aggregated é importante para o modo de janelas; um observations_emitted igual a zero não significa que nenhum dado foi coletado se os valores foram agregados em janelas. Preserve o arquivo completo e stderr, em vez de apenas linhas de janelas selecionadas.

Jitter Tools 1.3.0

Automação e execuções A/B

Salve execuções completas e preserve o código de saída do produtor.

Código de saídaSignificado
0Execução/dados completos segundo o contrato informado. Em vez disso, os produtores atuais em execução normalmente mantêm o status não qualificado.
2Falha de CLI, capacidade, execução, saída ou limpeza. Examine stderr e qualquer registro de encerramento disponível.
3Dados parciais ou não qualificados. Pode ser uma execução funcionalmente concluída com limpeza confirmada.
130SIGINT tratado, como Ctrl+C, quando a limpeza é bem-sucedida.
143SIGTERM tratado quando a limpeza é bem-sucedida.

Estes são os códigos documentados da ferramenta, não uma garantia sobre cada shell, camada de tempo limite ou sinal fatal. Preserve status diferentes de zero; evite acrescentar || true para fazer um resultado parecer bem-sucedido. Um pipe fechado por head pode impedir os registros finais. --samples ou --duration é a forma aceita de limitar uma captura.

Exemplo Bash que preserva a saída, os diagnósticos, a identidade da compilação e o status de saída
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 execuções equivalentes

Para comparar o kernel padrão com o HFTKernel, use a mesma compilação do executável, função de CPU, modo de memória, operação, padrão, tamanho, semente, política de redefinição, políticas explícitas de memória, modo de leitura do contador, lote, destino de saída, tamanho de janela e duração. Preserve os metadados do kernel, da topologia e do escalonador de cada execução. Altere a variável pretendida em vez de mudar a definição da medição ao mesmo tempo.

Execute cada experimento separadamente. Esta versão permite iniciar duas ferramentas ativas na mesma CPU, mas então as execuções interferem entre si e não são referências independentes. Mantenha o rastreamento de diagnóstico separado da medição A/B principal quando o objetivo for evitar introduzir uma carga de rastreamento diferente em apenas um dos lados.

Compare contagens, distribuições, máximos, excedências de limiares, cobertura e qualidade em conjunto. Não calcule a média de valores p99 entre execuções ou janelas. Um total compacto de toda a execução agrupa os histogramas informados dentro dessa execução; uma análise exata de populações entre execuções exige preservar dados subjacentes compatíveis. A CLI 3.x de CPU/MEM e suas populações de medição não são intercambiáveis com os perfis de testes 2.x anteriores já publicados no site do HFTKernel.

Jitter Tools 1.3.0

Solução de problemas

Localize a fase que falhou sem alterar o experimento silenciosamente.

ObservaçãoInterpretação e próxima verificação
Nenhuma linha imediatamente após o inícioCPU/MEM primeiro preparam e calibram. Depois, uma janela -n completa precisa decorrer. Uma execução finita mais curta emite sua janela parcial final.
CPU rejeitada ou erro de afinidadeVerifique o ID de CPU Linux solicitado, o estado on-line e as permissões de cpuset. Selecione explicitamente uma CPU válida; a ferramenta não escolherá outra silenciosamente.
Falha de acesso ao contador ou de calibraçãoExamine os diagnósticos do contador e do relógio. CPU/MEM exigem contadores específicos da arquitetura utilizáveis; esta CLI não recorre a um relógio alternativo.
Saída 3 / partial / producer_unqualifiedInterprete execução e limpeza como fatos separados. Esse status sozinho não é evidência de tratamento de IRQ sobrecarregado nem de ajuste ruim do kernel.
Valores de IRQ zero ou NAZero pode refletir a resolução das marcas de tempo da trilha; NA pode significar que não há amostra concluída. Nenhum deles comprova um sistema sem atrasos.
softirq_entry_without_observed_raiseUm par pendente observado incompleto. Verifique PAIR_GAPS e o JSON detalhado; não o chame de perda de pacotes nem de estouro do buffer circular.
Eventos atrasados ou perda de bufferPreserve as evidências de perda. Revise o escopo dos eventos, a velocidade de saída e os orçamentos de recursos. Janelas mais curtas e saída sem processamento podem acrescentar carga. Uma nova execução com configurações alteradas é uma configuração diferente.
Não é possível abrir/criar uma instância tracefsVerifique a montagem, as permissões, o relógio mono e os formatos de eventos compatíveis. O programa não monta, altera permissões com chmod nem assume a propriedade de outra sessão.
Falta record-cmd ou record-tgid em uma instânciaEsses caches globais são opcionais para este coletor. Diagnostique o controle realmente necessário e errno; não altere caches globais apenas para satisfazer a ferramenta.
NAPI solicitado, mas incompatívelA solicitação --napi falha explicitamente. Execute sem --napi somente como um experimento deliberadamente separado de apenas IRQ.
Solicitação mlock / NUMA / HugeTLB rejeitadaExamine errno, o limite de bloqueio, os nós permitidos, a reserva existente de páginas enormes e o suporte do host. Não há elevação automática, provisionamento da reserva nem recurso a uma política alternativa.
Tempo limite de saída esgotado, EPIPE ou ausência do registro de encerramentoA saída está incompleta. Preserve stderr, use execuções limitadas e um destino capaz de acompanhar o ritmo. Não classifique uma captura truncada como completa.
Falha de limpeza ou instância remanescenteExamine cleanup.errors e recovery_required. Verifique a instância própria informada e a ausência de um proprietário ativo antes de qualquer ação administrativa. Não exclua instâncias tracefs recursivamente.

O encerramento ordenado de IRQ interrompe o registro, drena os dados dentro de limites definidos, desativa os eventos próprios, fecha os descritores, remove somente sua própria instância e restaura a afinidade. Uma falha tratada continua sendo uma falha mesmo que a limpeza posterior libere os recursos. SIGKILL e falhas do host não permitem garantir a remoção completa da instância.

Referências do código-fonte

Referências de implementação específicas da versão

Este guia é derivado do código-fonte, dos analisadores de CLI e dos contratos de medição fornecidos com Jitter Tools 1.3.0. Ele não certifica a precisão das medições de tempo em execução nem a compatibilidade com todas as distribuições. Os caminhos de arquivos de código-fonte abaixo são relativos ao arquivo de código-fonte.

Arquivo de código-fonte: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Identidade da versão e fluxo de trabalho de compilação
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Analisadores de linha de comando e validação
  • 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, relógios e posicionamento
  • 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. Operações de memória residente
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. Modos first-touch e de alocação
  • 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 memória explícitas por mapeamento
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Coleta passiva de IRQ e 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. Janelas de IRQ, visão geral e NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Saída, histogramas, resumo e esquema do fluxo
  • 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