Notas da versão

Notas da versão do HFTKernel 7.3.x.

Explore a série 7.3.x do kernel, da versão mais recente à mais antiga, com as alterações upstream mais relevantes para execução previsível de CPU, redes estáveis, manutenção precisa do tempo, virtualização, comportamento da memória e caudas de latency mensuráveis.

Histórico público de alterações

Notas da versão

Cada entrada se concentra nas alterações upstream que apoiam os objetivos principais do HFTKernel: jitter mínimo, tail latency controlada, caminho de dados estável, manutenção precisa do tempo e comportamento mensurável sob pressão.

HFTKernel 7.3.3

Melhor ordenação de pacotes, progresso de I/O mais confiável e polling mais enxuto

Entrada mais recente da série 7.3.x

Base upstream: Linux 7.3.3. Mudanças acumuladas: Linux 7.3.2 e 7.3.3, em relação à versão 7.3.1. Data de lançamento upstream: 6 de novembro de 2026, para ambas as versões.

Transmissão ordenada sob pressão nas filas

O networking scheduler preserva a ordem dos pacotes quando um driver retorna NETDEV_TX_BUSY. Os pacotes recolocados na fila retornam ao início da lista de pendentes na ordem original.

No teste upstream de quatro streams TCP sobre um par veth com um pfifo qdisc, o throughput aumentou de aproximadamente 40 para 76 Gbps. A mudança eliminou cerca de 1.3 milhão de segmentos fora de ordem e 15,000 a 37,000 retransmissões por intervalo de teste de 15 segundos.

VLAN hardware offload consistente

Com reorder_hdr=off, os frames elegíveis passam sua VLAN tag aos metadados de inserção da NIC e mantêm a disposição esperada no egress do dispositivo VLAN. Isso mantém a inserção VLAN por hardware compatível com os offloads de checksum e segmentação, incluindo os caminhos pertinentes de packet-socket e de AF_XDP em copy mode.

NAPI busy polling que respeita o deadline

io_uring limita o busy polling ao intervalo de espera restante. Quando um deadline absoluto já passou, o orçamento de polling se torna zero, permitindo que a espera retorne prontamente.

As entradas NAPI acompanhadas dinamicamente agora expiram após 60 segundos de inatividade. Rings de longa duração deixam de consultar novamente identificadores de fila obsoletos, mantendo o polling focado no tráfego recente.

Wakeups confiáveis para trabalho adiado e progresso das completions

IORING_SETUP_DEFER_TASKRUN publica o estado de sleep da tarefa em espera antes de expor seu wakeup credit. Os produtores podem notificar o consumidor de forma confiável quando chega novo task work local. O loop de espera orientado por BPF segue a mesma ordem.

Quando as overflow completions pendentes não cabem na completion queue, io_uring devolve o controle ao userspace para que a aplicação possa esvaziá-la. Isso oferece um caminho explícito de progresso para completion queues de tamanho misto.

Progresso mais sólido para consumidores em tempo real

A fila lockless de task work protege a publicação do produtor em duas etapas com uma seção curta com preemption desabilitada. Um consumidor SCHED_FIFO que compartilha uma CPU com um produtor de prioridade menor observa uma publicação concluída, em vez de interromper o produtor no meio da atualização por preemption.

As esperas assíncronas de private-futex preparam o hash privado do processo antes de registrar o waiter. Os wakeups permanecem alinhados com o hash ativo durante a criação posterior de threads e as mudanças de configuração do hash.

Menos atividade desnecessária de SQPOLL

SQPOLL pode permanecer em sleep enquanto um ring está desabilitado, mesmo quando submission entries já foram preparadas. Habilitar o ring desperta a thread de polling. As aplicações podem preparar sua configuração de inicialização sem ocupar uma CPU verificando repetidamente trabalho que ainda não está habilitado.

Workers de I/O assíncrona com limites mais bem definidos

io_uring resolve o arquivo de destino antes de atribuir trabalho ao io-wq. As operações forced-async sobre regular files e block devices seguem os limites de bounded workers, incluindo os limites configurados por IORING_REGISTER_IOWQ_MAX_WORKERS.

As buffered writes no mesmo regular file são coordenadas por hashing baseado em inode, reduzindo a competição dos workers pelo mesmo inode lock. A identidade do arquivo é fixada quando a solicitação entra na work queue.

Buffers de recepção confiáveis em escalas maiores

Zero-copy receive calcula os offsets dos buffers com aritmética de 64 bits antes do deslocamento. As completion entries identificam o buffer correto além dos primeiros 4 GiB de uma área de recepção registrada, mantendo o consumo e o refill alinhados.

Para incremental provided buffers e multi-buffer receive bundles, o progresso parcial é concluído antes que outra solicitação possa reutilizar a memória restante. As aplicações recebem o comprimento efetivamente transferido e continuam a partir desse limite; essas operações MSG_WAITALL podem retornar um resultado curto.

Clock domains corretos para atualizações de timeouts absolutos

As atualizações de timeouts absolutos usam o relógio associado ao timer existente ao converter o time namespace do chamador para o horário do host. CLOCK_MONOTONIC, CLOCK_BOOTTIME e CLOCK_REALTIME mantêm suas respectivas semânticas.

Isso mantém os deadlines assíncronos consistentes para serviços que usam time namespaces e diferentes clock domains de timeout.

Contabilização de memória mais completa

Os metadados task-to-ring e os XArrays de personality são contabilizados nos memory cgroups. Os metadados de registered buffers e os resource nodes também participam da contabilização de memcg, mantendo a memória de I/O do kernel representada nos orçamentos dos serviços.

O teardown de XArray libera os nós internos vazios deixados por tentativas de inserção malsucedidas. A criação e a limpeza repetidas de rings liberam essas alocações de metadados e seus encargos associados.

Ciclo de vida mais sólido para páginas HugeTLB

O caminho de fault anônimo de HugeTLB conclui as atualizações de estado do folio e seu desbloqueio antes de liberar o page-table lock. A inicialização permanece coordenada com as operações concorrentes de unmapping e recuperação de páginas, fortalecendo os mappings privados de huge pages usados para grandes buffers de aplicações.

Teardown coordenado de IRQ e dispositivos de temporização

A limpeza de threaded-IRQ mantém irqaction até que o exit task work pendente tenha terminado, preservando o tempo de vida do recurso durante o caminho de saída anormal da thread.

As operações de controle do gerador PPS são sincronizadas com o unregister da fonte. As operações existentes terminam com um estado válido do driver, e as operações seguintes recebem ENODEV após a remoção. Isso oferece ao software de serviços de temporização um limite claro no ciclo de vida do dispositivo.

Estado do host KVM mais consistente

Em hosts Intel VMX, as mudanças de userspace que tornam uma vCPU executável também removem um halt registrado pelo hardware quando necessário. Isso mantém o estado de execução do hardware alinhado com o virtual-machine monitor durante os fluxos de reset e reinicialização.

AMD SVM atualiza a geração ASID em ambos os blocos de controle de nested virtualization após uma mudança de CPU física. Os identificadores de espaço de endereçamento permanecem coordenados à medida que as vCPUs aninhadas se movem entre processadores.

Melhorias de Xen backend adicionadas no Linux 7.3.3

A atualização acumulada final adiciona três melhorias para implantações de Xen backend. As leituras de estatísticas do block backend são sincronizadas com o teardown do frontend. As estatísticas do network backend permanecem protegidas durante a limpeza das filas. A limpeza da multicast list ocorre depois que o processamento de transmissão e recepção é encerrado.

Juntas, essas mudanças mantêm o monitoramento, o estado da rede virtual e a liberação de recursos do backend coordenados durante a desconexão e a reconfiguração de dispositivos.

Sistemas operacionais compatíveis

O catálogo de pacotes do HFTKernel abrange 24 OS targets:

  • Ubuntu 20.04 / 22.04 / 24.04 / 26.04 LTS
  • Debian 11 / 12 / 13
  • Plataformas compatíveis com RHEL, AlmaLinux, Rocky Linux 8 / 9 / 10
  • CentOS Stream 9 / 10
  • Fedora Linux 44
  • Amazon Linux 2023, perfil Cloud
  • ALT Linux p11 / Simply Linux 11
  • Astra Linux 1.8
  • Arch Linux base-devel
  • Base compatível com NixOS.

Instalação com um único comando

curl -fsSL https://hftkernel.com/install.sh | sudo bash

O instalador detecta o sistema operacional e o perfil de implantação, verifica o pacote correspondente e o instala. Uma reinicialização manual ativa o kernel instalado.

Foco da versão

Preservar a ordem de transmissão, manter o trabalho assíncrono avançando, eliminar o polling desnecessário e manter clara a propriedade da memória e dos recursos dos dispositivos.

HFTKernel 7.3.1

I/O assíncrona mais previsível, wakeups RT precisos e diagnósticos confiáveis do host

Base upstream: Linux 7.3.1. Mudanças desde o Linux 7.3. Data de lançamento upstream: 30 de outubro de 2026.

Progresso oportuno após as barreiras drain do io_uring

Uma solicitação drain independente agora limpa o estado drain quando o flush de sua completion é realizado e não resta outro trabalho adiado. Na execução do io-wq, essa transição ocorre sob o ring lock antes de a completion ficar visível para userspace.

As solicitações enviadas após a barreira concluída podem prosseguir sem esperar que o worker libere sua última referência à solicitação. As solicitações drain encadeadas mantêm seus requisitos de ordenação.

Isso torna os pipelines de I/O orientados a completions mais previsíveis para aplicações que usam barreiras drain.

Wakeups de poll confiáveis e completion multishot

Uma operação atômica compare-and-exchange agora coordena a liberação da propriedade de poll com notificações concorrentes de nova tentativa. Os wakeups pendentes permanecem visíveis, permitindo que o processamento continue sem depender de um evento não relacionado.

Multishot poll também atualiza corretamente o contador de referências compartilhado quando ocorre um hangup. A última passagem de processamento de eventos pode terminar sem repetir o loop desnecessariamente, melhorando o gerenciamento do ciclo de vida das conexões em aplicações assíncronas.

Timeouts precisos da completion queue no PREEMPT_RT

Para tarefas RT e deadline no PREEMPT_RT, os callbacks de timeout da completion queue do io_uring são executados em contexto hard-interrupt. A entrega de wakeups deixa de depender do escalonamento do timer thread de menor prioridade.

No teste upstream com Jetson Orin Nano, com o backport da mudança para o Linux 6.18.39-rt, o atraso máximo caiu de 1,040 µs para 18 µs ao longo de 40,000 deadlines sob carga SCHED_FIFO concorrente. Após a mudança, o atraso de todos os wakeups permaneceu dentro de 100 µs.

Tratamento consistente de provided buffers de recepção grandes

Nas operações de recepção non-bundled que obtêm seu comprimento de um provided buffer, o io_uring limita o comprimento de transferência selecionado a MAX_RW_COUNT.

Isso mantém o comprimento válido ao longo do caminho de retorno com sinal, incluindo provided buffers de 2 GiB ou mais, respeitando o limite existente de tamanho de transferência. Fortalece o tratamento dos buffers de recepção para aplicações que usam regiões reutilizáveis grandes.

Encerramento de workers assíncronos mais bem coordenado

O caminho de saída do io-wq aplica uma memory barrier após publicar seu flag de saída. O encerramento e o task work concorrente de criação de workers respeitam a ordenação necessária, inclusive em arquiteturas fracamente ordenadas.

Isso fortalece a desmontagem ordenada e a reinicialização de serviços que usam pools de workers do io_uring.

O cancelamento de solicitações IORING_OP_WAITID também é idempotente: tentativas repetidas reconhecem o estado de cancelamento existente sem acumular referências adicionais. Isso mantém a consistência das solicitações assíncronas de supervisão de processos durante o cancelamento.

Menos trabalho desnecessário durante a desmontagem de namespaces PID

Durante a limpeza do namespace, o process reaper mascara os wakeups de notificação de task work enquanto aguarda o término dos processos filhos e a liberação dos PIDs.

Ele pode permanecer em espera até que o evento relevante do ciclo de vida ocorra, em vez de retornar repetidamente ao caminho de espera. Isso reduz a atividade evitável de CPU nas interações afetadas entre o encerramento de contêineres e livepatch.

Visibilidade confiável de IRQ por CPU em hosts grandes

/proc/interrupts agora emite seu cabeçalho de CPU sempre que o primeiro registro é renderizado, incluindo novas tentativas após o crescimento do sequence buffer.

A correspondência entre CPU e contadores permanece intacta em sistemas com muitos núcleos. Isso permite uma análise confiável de IRQ, a verificação de sua alocação e o monitoramento das CPUs isoladas e de housekeeping.

Configuração e desmontagem de tracing mais limpas

A configuração de histogramas agora remove os triggers field-variable criados automaticamente quando o comando completo falha. O tracing ativo corresponde à configuração aceita, com a instrumentação temporária removida em vez de continuar contando eventos.

A limpeza de histogramas field-variable mantém a referência estável ao event-file em vez de depender do tempo de vida de outro histograma. Isso melhora a criação, a modificação e a remoção repetidas de sessões de diagnóstico.

A análise de event filters também rejeita expressões lógicas incompletas antes de sua execução. Isso fortalece a configuração automatizada de tracefs e de tracepoints do perf.

Diagnósticos postmortem mais completos

A coleta de core dumps fica protegida contra interrupções por TIF_NOTIFY_SIGNAL durante a transferência de dados por pipes e sockets. As notificações do io_uring e de outros produtores de task work deixam de interromper esses caminhos de coleta.

Isso preserva os dados de diagnóstico para uma análise detalhada do estado da aplicação, dos mappings e da I/O pendente.

Validação consistente de cotas DAMON

As metas de cota do DAMOS são validadas no núcleo do DAMON antes de serem aplicadas. Valores de meta iguais a zero são rejeitados pelo caminho comum de commit, e o erro é propagado aos chamadores.

Para implantações que usam gerenciamento de memória baseado em DAMON, isso oferece um ponto de validação consistente para configurar as políticas de cotas.

Compilações out-of-tree confiáveis do benchmark de DMA

dma_map_benchmark agora é compilado no diretório de saída selecionado quando O= é especificado.

O benchmark se integra a pipelines de compilação que separam as árvores de código-fonte das ferramentas geradas, permitindo preparar os diagnósticos de DMA de forma reproduzível.

Sistemas operacionais compatíveis e instalação

O HFTKernel oferece suporte a 24 OS targets que abrangem Ubuntu, Debian, plataformas compatíveis com RHEL, AlmaLinux, Rocky Linux, CentOS Stream, Fedora, Amazon Linux, Arch Linux, implantações compatíveis com NixOS, ALT Linux p11 / Simply Linux 11 e Astra Linux 1.8. O Amazon Linux 2023 usa o perfil Cloud.

Instale com um único comando:

curl -fsSL https://hftkernel.com/install.sh | sudo bash

O instalador seleciona o pacote correspondente ao sistema operacional e o perfil de implantação, e verifica a integridade do pacote.

Foco da versão

A base Linux 7.3.1 fortalece o progresso de I/O, a entrega de timeouts em tempo real, o gerenciamento do ciclo de vida dos processos e a consistência dos diagnósticos. Essas mudanças apoiam o objetivo do HFTKernel de oferecer um host previsível e mensurável para aplicações sensíveis à latency.

HFTKernel 7.3

Leituras de tempo preparadas, gerenciamento de memória mais leve e novos recursos de rede CXL

Base upstream: Linux 7.3. Data de lançamento upstream: 18 de outubro de 2026.

Foco: recursos introduzidos com a base Linux 7.3 para implantações sensíveis à latency.

Dados vDSO com páginas pré-carregadas para início previsível das aplicações

O mapeamento genérico de dados vDSO agora pode ser materializado por mlockall(). A remoção de seu indicador VM_IO permite que a fase de preparação da memória estabeleça as entradas correspondentes da tabela de páginas antes do início do processamento sensível à latency.

Para aplicações que usam leituras de tempo assistidas por vDSO, isso transfere uma falha de página evitável de first-touch para a preparação inicial. O autor upstream observou aproximadamente 20 µs para o caminho completo da exceção de falha de página na máquina de teste.

Isso fortalece a preparação de motores de negociação, consumidores de marcas de tempo e processos de medição que pré-carregam explicitamente as páginas de seus conjuntos de trabalho.

Menor contenção do bloqueio LRU durante a recuperação de memória

A recuperação LRU clássica agora obtém os custos de balanceamento da varredura anônima e de arquivos a partir dos contadores vmstat. A amostragem e a redução dos custos usam um bloqueio dedicado por lruvec em vez de adquirir repetidamente o bloqueio que protege as operações das listas LRU. A agregação de hierarquias também substitui atualizações repetidas de custos nos níveis superiores.

No teste upstream de pressão de memória com 176 núcleos e 256 GB, a espera agregada pelo bloqueio LRU caiu de aproximadamente 4.23 segundos para 1.66 segundos durante uma janela de registro de 30 segundos, uma redução de 61%, com taxas semelhantes de varredura e recuperação.

Para implantações com LRU clássica, isso reduz a contenção entre a contabilização da recuperação e as operações que realmente gerenciam as páginas.

Maior retenção do código executável com MGLRU

O MGLRU promove folios de arquivos executáveis mapeados após o primeiro uso observado. Tanto o envelhecimento de tabelas de páginas quanto a verificação de referências reconhecem mapeamentos executáveis ao atualizar o estado das páginas.

Isso oferece maior proteção contra recuperação ao código de aplicações e de bibliotecas compartilhadas usado recentemente. Favorece uma residência mais consistente do código para serviços executados com MGLRU sob pressão de memória.

Menos trabalho desnecessário de contabilização de pressão em cgroup v2

O subsistema vmpressure ignora o caminho de notificação ao espaço de usuário de cgroup-v1 quando executado sob cgroup v2. A recuperação evita contabilização, bloqueios, envios a filas de trabalho e percursos de ancestrais que não são utilizados.

O caminho de pressão de sockets TCP/SCTP dentro do kernel permanece ativo, e o monitoramento de pressão no espaço de usuário de cgroup-v2 continua por meio de PSI. Isso remove trabalho redundante de infraestrutura e mantém os sinais de pressão usados pela rede e pelo gerenciamento de serviços.

Seções críticas mais curtas nas filas de trabalho

O processamento de filas de trabalho seleciona o trabalhador a ser ativado enquanto mantém pool->lock e realiza a ativação depois de liberá-lo. As operações de ativação do escalonador deixam de prolongar a seção crítica do grupo compartilhado nos caminhos afetados de enfileiramento e trabalho encadeado.

Em um microteste upstream de NVIDIA Grace ARM64 com filas de trabalho não vinculadas e escopo NUMA, o throughput aumentou de 719,794 para 794,049 itens de trabalho por segundo, com latency de enfileiramento P95 10.3% menor.

Isso melhora o tratamento de trabalho em segundo plano com contenção nas CPUs de manutenção e na infraestrutura de apoio.

Serviços gerenciados pelo escalonador mais responsivos

O escalonamento de cgroups da classe justa passa a usar uma única fila de execução de seleção de tarefas por CPU, mantendo a distribuição de pesos dos grupos. O EEVDF também melhora o escalonamento de tarefas com fatias curtas, e o balanceamento NOHZ prefere núcleos totalmente ociosos.

Essas alterações são relevantes para gateways, monitoramento, orquestração e serviços de manutenção gerenciados pelo escalonador. CPU affinity explícita continua sendo o mecanismo de posicionamento para threads dedicadas de negociação.

Recepção zero-copy do io_uring mais escalável

O subsistema de recepção zero-copy do io_uring ganha provisionamento dinâmico de áreas de memória e melhorias coordenadas de reposição. A reposição de páginas grandes escala com a alocação subjacente, entradas de reposição compatíveis são agrupadas, e a cabeça e a cauda do anel de reposição ocupam linhas de cache separadas. O armazenamento em cache da cauda reduz ainda mais os acessos ao estado compartilhado.

Essas alterações melhoram o gerenciamento da memória de recepção e reduzem a sobrecarga de reposição para aplicações que usam io_uring ZCRX, incluindo cargas de dados de mercado de alta frequência e processamento de rede.

Suporte à transmissão Solarflare assistida por CXL na base upstream

O Linux 7.3 reúne a infraestrutura CXL Type-2 e a integração do driver Solarflare para dispositivos compatíveis da família SFC9100. CONFIG_SFC_CXL habilita o caminho do driver para CTPIO sobre CXL.mem, com hardware CXL compatível e firmware com suporte a CXL.

O driver verifica os recursos do dispositivo CXL, cria uma região de memória CTPIO de 256 MiB e a mapeia com semântica de combinação de gravações. Isso habilita no kernel um caminho de transmissão do host para a NIC assistido por CXL.

Para uma configuração HFTKernel Hardware correspondente, a integração combina CONFIG_SFC, CONFIG_CXL_BUS e CONFIG_SFC_CXL com um servidor, adaptador e firmware compatíveis. Isso cria uma opção específica de otimização de hardware para transmissão sensível à latency.

Controle ampliado do relógio de hardware

O driver DPLL ZL3073x ganha suporte ao relógio de hardware PTP, expondo leituras de tempo, ajuste de tempo, ajuste de frequência e ajuste de fase pelos callbacks apropriados. As operações disponíveis seguem o estado atual do canal, incluindo operação NCO e rastreamento de referências.

Isso amplia as opções de temporização de hardware disponíveis pelas interfaces padrão do Linux e facilita a integração de dispositivos de temporização compatíveis à infraestrutura de gerenciamento de relógios.

Gerenciamento de rede na nuvem mais escalável

Determinados drivers de rede de software, incluindo veth, ipvlan e túneis, passam a permitir a remoção do registro de dispositivos por namespace de rede. As atualizações de regras de roteamento também deixam de depender do bloqueio RTNL global. Essas alterações reduzem a serialização compartilhada durante as operações do ciclo de vida da rede e das políticas de roteamento.

O suporte a BIG TCP se estende a túneis UDP como VXLAN e Geneve. Lotes internos maiores de segmentação oferecem uma opção adicional de eficiência para distribuição e reprodução em massa de dados sobre redes sobrepostas compatíveis, preservando a MTU configurada na rede física.

Diagnósticos multicast mais úteis

RTM_GETMULTICAST informa uma contagem de usuários por grupo. O software de monitoramento pode examinar o uso de grupos multicast por netlink, melhorando a visibilidade do estado de inscrição em hosts que recebem dados de mercado multicast.

Análise de alocações mais eficiente

A análise de alocações de memória ganha uma interface ioctl binária para /proc/allocinfo. Filtros de módulo, função, arquivo e linha podem ser aplicados antes da agregação dos contadores por CPU, para que as consultas de diagnóstico processem apenas os pontos de alocação correspondentes.

No teste upstream com Intel Xeon Platinum 8481C e 224 CPUs lógicas, uma consulta a um arquivo específico reduziu o tempo de CPU do sistema de 22 ms para 1 ms. Isso torna as investigações específicas de memória mais leves e adequadas à coleta automatizada.

Os novos contadores pgrotate_anon e pgrotate_file acrescentam visibilidade sobre o trabalho de recuperação que não libera páginas imediatamente. Eles dão suporte a diagnósticos tanto de LRU clássica quanto de MGLRU.

Ferramentas de medição incluídas

O HFTKernel inclui cpujitter para intervalos sem execução de CPU e caudas de latency, memjitter para alocação, first-touch e comportamento do conjunto de trabalho, e irqjitter para análise da atividade de IRQ e softIRQ.

Junto com a latency da aplicação, os contadores de rede, o estado do relógio de hardware e a telemetria de memória, essas ferramentas tornam toda a infraestrutura observável.

Foco da versão

A base Linux 7.3 avança em três prioridades do HFTKernel: preparar mais estado antes do início da carga de trabalho, reduzir a contenção nos caminhos compartilhados do kernel e oferecer maior controle sobre rede, memória e temporização.

Filosofia das versões

Estabilidade upstream, políticas específicas da carga de trabalho e resultados mensuráveis

O HFTKernel parte de uma versão estável exata do Linux, registra o conjunto de ferramentas e a identidade da compilação, aplica o perfil Cloud ou Hardware selecionado, empacota cpujitter e memjitter com o ambiente de execução e valida o resultado como uma versão imutável.

Base exataCódigo-fonte estável do Linux verificado e versão do kernel fixada.
Perfil controladoPolíticas de CPU, memória, rede, manutenção do tempo e isolamento adaptadas à plataforma.
Pacotes nativosConjuntos DEB, RPM ou TGZ para a matriz de produção compatível.
Entrega com mediçõescpujitter e memjitter fornecem evidências repetíveis na cauda de latency.

Planejamento da implantação

Avalie a versão de acordo com sua topologia de CPU, NIC, memória e temporização.

A seleção do pacote é apenas o primeiro passo. O resultado em produção depende dos parâmetros de inicialização, da afinidade em tempo de execução, do posicionamento das filas, do projeto PTP/PHC, da política de memória e de um plano de medição controlado.