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.
| Componente | Versão documentada | Pergunta principal |
|---|---|---|
| CPUJitter | 3.2.2 | Quanto duram os intervalos entre leituras consecutivas do contador na CPU selecionada? |
| MEMjitter | 3.5.2 | Quanto tempo levam os acessos à memória residente, as primeiras gravações ou as chamadas mmap bem-sucedidas? |
| IRQjitter | 1.3.0 | Quais manipuladores e esperas de IRQ/softirq observados têm tempos decorridos longos? |
| Fluxo legível por máquina | jitter.stream/0.6.0 | Como as medições, a cobertura, a qualidade e a limpeza são registradas? |
./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.
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
./cpujitter -c 4 --duration 10
./memjitter -c 4 --duration 10
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ção | Escopo |
|---|---|
| Linux GNU, x86_64 ou aarch64 | Compilar de forma nativa para a arquitetura do host. |
| Rust 1.85 ou posterior, rustfmt e clippy | Compilador e controles de qualidade do Rust. |
| Compilador C, ar, arquivos de desenvolvimento de libc estática, readelf | Código ABI nativo, vinculação estática GNU e verificações ELF. |
| Python 3.10 ou posterior e os requisitos dos testes | Testes do código-fonte e orquestração da compilação. Os executáveis de medição resultantes não exigem Python. |
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.
./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.
./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.
| Controle | Comportamento |
|---|---|
-c CPU | Obrigató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 SEC | Largura da janela e intervalo de resumo; padrão de 1 segundo, intervalo 0.001..86400. Não define a frequência de amostragem. |
--duration SEC | Duração finita da observação, 0.001..86400 segundos. A preparação e a calibração de CPU/MEM precedem a observação. |
--samples N | Somente CPU/MEM. Parar após um número positivo de observações concluídas. O IRQjitter não tem a opção --samples. |
--json | JSON Lines. Mantém as janelas padrão de um segundo, a menos que --raw também seja informado. |
--raw | Observações individuais com registros completos do protocolo. Não pode ser combinado com -n nem com controles exclusivos de janelas. |
--help, --version, --build-info | Execute 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.
./cpujitter -c4 -n0.1 --duration 5
./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.
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
./cpujitter -c 4 -n 1 --duration 30 \
--threshold cpu_iteration_elapsed_ns=5000
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
| Controle específico de CPU ou de captura | Padrão e intervalo |
|---|---|
--counter-read ordered|relaxed | ordered. Compare contextos equivalentes de leitura do contador. |
--batch-records N | 4096; 1..65536. Capacidade pré-alocada do lote de leituras consecutivas. |
--buffer-bytes N | 8388608; 16384..8388608. Fila limitada de stdout. |
--write-timeout-ms N | 1000; 1..60000. Prazo cooperativo de saída, não uma garantia rígida de tempo real. |
--threshold cpu_iteration_elapsed_ns=N | Nanossegundos 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.
| Modo | Métrica | Operação cronometrada |
|---|---|---|
| resident, padrão | mem_resident_operation_ns | Uma leitura de byte, leitura/modificação/gravação não atômica ou etapa de seguimento de ponteiros. |
| first-touch | mem_first_touch_ns | Uma gravação volátil de byte em um deslocamento ainda não tocado dentro de uma época verificada de mapeamento/redefinição. |
| alloc | mem_alloc_call_ns | Uma 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.
./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
./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
./memjitter -c 4 --mode first-touch --reset remap \
--bytes 16777216 --duration 30
./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
./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ção | Valores e restrições |
|---|---|
--mode | resident | first-touch | alloc; resident por padrão. |
--operation | resident: read | rmw | chase. first-touch: write. alloc: mmap. |
--bytes N | Bytes decimais, múltiplo de página; padrão de 16777216, máximo de 1073741824. Não é uma string com sufixo MiB. |
--stride-bytes N | Pelo 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 N | Deslocamento 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 N | Inteiro diferente de zero; padrão de 1. Somente resident/first-touch. |
--pattern | Resident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation. |
--reset | Somente first-touch: remap (padrão) | madvise. |
--batch-records, --buffer-bytes, --write-timeout-ms | Os mesmos padrões e limites do CPUJitter. |
--threshold METRIC=N | Use a métrica exata do modo selecionado; comparação estrita > nas janelas. |
./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ítica | resident | first-touch | alloc |
|---|---|---|---|
--lock none | Padrão | Padrão | Permitido |
--lock resident | mlock antes da preparação | Rejeitado | Rejeitado |
--lock onfault | mlock2, seguido da preparação de memória residente | Somente com --reset remap | Rejeitado |
--thp system | Padrão, sem orientação | Padrão, sem orientação | Permitido |
--thp never ou --thp prefer | MADV_NOHUGEPAGE / MADV_HUGEPAGE | Permitido e reaplicado após o remapeamento | Rejeitado |
--numa-node N | MPOL_BIND limitado ao intervalo | MPOL_BIND limitado ao intervalo | Rejeitado |
--hugetlb-bytes N | Mapeamento HugeTLB explícito | Rejeitado | Rejeitado |
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
./memjitter -c 4 --mode first-touch --lock onfault \
--reset remap --bytes 65536 --duration 10
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
./memjitter -c 4 --numa-node 0 --duration 10
./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.
grep " tracefs " /proc/mounts
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15
CPU do coletor versus CPUs observadas
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étrica | O que mede | Interpretação |
|---|---|---|
irq_handler_elapsed_ns | Uma entrada/saída correspondente de um manipulador de ação na mesma CPU | Inclui trabalho intermediário/aninhado; não é a latency de entrega de interrupções do dispositivo à CPU. |
softirq_elapsed_ns | Uma entrada/saída correspondente de um vetor softirq na mesma CPU | Não é tempo exclusivo de CPU nem tempo de processamento por pacote. |
softirq_observed_raise_to_entry_ns | Da primeira ativação pendente observada e salva até a próxima entrada nessa CPU/vetor | Uma 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
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
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
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ção | Padrão e intervalo |
|---|---|
--threshold NS | Inteiro não negativo; aplica-se somente às séries de tempo. Diferentemente de CPU/MEM, nenhum nome de métrica é informado. |
--lateness SEC | Padrão: min(window / 10, 0.01 segundos). Intervalo 0..window, até nove casas decimais. Somente janelas. |
--max-series N | 256 para janelas, 4096 para dados sem processamento; intervalo 1..4096. |
--window-memory-mib N | 64; 1..512. Limite de memória das janelas. |
--buffer-kb N | 256 por CPU possível; 16..16384. |
--max-trace-mib N | 256; 1..4096. Orçamento total conservador de buffers de rastreamento do kernel, não a memória total do processo. |
--output-bytes N | 8388608; 65536..8388608. Fila de saída limitada. |
--write-timeout-ms N | 1000; 1..60000. Prazo cooperativo de saída. |
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
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
| Coluna | Significado |
|---|---|
| TIME(s) | Fim da janela relativo ao início da observação, em segundos, não UTC. |
| COUNT | Número de observações aceitas nessa linha. |
| MIN / MAX | Extremos exatos dos valores inteiros informados, em ns para métricas de tempo. Isso não afirma precisão física. |
| AVG | Exibido 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. |
| LOSS | seen 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. |
| QUALITY | Classificação preservada da qualidade dos dados. partial pode descrever instrumentação não qualificada. |
| PART | yes 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
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óstico | Significado |
|---|---|
| PAIR_GAPS | Número de avisos de pareamento detectados. Não é uma contagem de interrupções de hardware nem de pacotes perdidos. |
| LATE | Amostras concluídas rejeitadas depois que sua janela já foi publicada. Contagens desconhecidas continuam desconhecidas. |
| BUFFER | not-observed, loss-observed ou unknown. not-observed não certifica ausência de perdas. |
| OTHER | Outros avisos de diagnóstico, não contagens de IRQ. |
| PART | Uma 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.
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ída | Significado |
|---|---|
| 0 | Execução/dados completos segundo o contrato informado. Em vez disso, os produtores atuais em execução normalmente mantêm o status não qualificado. |
| 2 | Falha de CLI, capacidade, execução, saída ou limpeza. Examine stderr e qualquer registro de encerramento disponível. |
| 3 | Dados parciais ou não qualificados. Pode ser uma execução funcionalmente concluída com limpeza confirmada. |
| 130 | SIGINT tratado, como Ctrl+C, quando a limpeza é bem-sucedida. |
| 143 | SIGTERM 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.
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ção | Interpretação e próxima verificação |
|---|---|
| Nenhuma linha imediatamente após o início | CPU/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 afinidade | Verifique 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ção | Examine 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_unqualified | Interprete 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 NA | Zero 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_raise | Um 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 buffer | Preserve 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 tracefs | Verifique 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ância | Esses 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ível | A solicitação --napi falha explicitamente. Execute sem --napi somente como um experimento deliberadamente separado de apenas IRQ. |
| Solicitação mlock / NUMA / HugeTLB rejeitada | Examine 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 encerramento | A 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 remanescente | Examine 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.jsonREADME.mddocs/BINARY_README.mdscripts/run-tests.pyscripts/static_release.pyvalidation/qualification.json
S2. Analisadores de linha de comando e validação
tools/cpujitter/src/cli.rstools/memjitter/src/cli.rstools/irqjitter/src/cli.rsvendor/jitter-common/src/interval.rsdocs/CLI_TRACEFS.md
S3. Captura de CPU, relógios e posicionamento
tools/cpujitter/src/counter.rstools/cpujitter/src/model.rstools/cpujitter/src/runtime.rsvendor/jitter-common/src/observed_placement.rsdocs/CPUJITTER.mddocs/LAUNCH.md
S4. Operações de memória residente
tools/memjitter/src/resident.rstools/memjitter/src/counter.rstools/memjitter/src/runtime.rsdocs/MEMJITTER.md
S5. Modos first-touch e de alocação
tools/memjitter/src/first_touch.rstools/memjitter/src/first_touch_runtime.rstools/memjitter/src/alloc.rstools/memjitter/src/alloc_runtime.rstools/memjitter/native/allocation.cdocs/FIRST_TOUCH.mddocs/ALLOC.md
S6. Políticas de memória explícitas por mapeamento
tools/memjitter/src/policy.rstools/memjitter/native/policy.cdocs/MEMORY_POLICIES.md
S7. Coleta passiva de IRQ e ciclo de vida de tracefs
tools/irqjitter/src/engine.rstools/irqjitter/src/parser.rstools/irqjitter/src/runtime.rstools/irqjitter/src/session.rstools/irqjitter/src/native.rsdocs/IRQJITTER.mddocs/CLI_TRACEFS.md
S8. Janelas de IRQ, visão geral e NAPI
tools/irqjitter/src/windows.rsvendor/jitter-common/src/irq_overview.rsdocs/IRQ_OVERVIEW.mddocs/IRQ_WINDOWS_NAPI.md
S9. Saída, histogramas, resumo e esquema do fluxo
vendor/jitter-common/src/compact.rsvendor/jitter-common/src/run_summary.rsvendor/jitter-common/src/histogram.rsvendor/jitter-common/src/record.rsvendor/jitter-common/src/lifecycle.rsdocs/OUTPUT.mdcontracts/stream/schemas/stream.schema.jsoncontracts/stream/contracts/metrics.json