Contate-Nos

info@serverion.com

Ligue para nós

+1 (302) 380 3902

PREEMPT_RT explicado: Recursos do kernel em tempo real

PREEMPT_RT explicado: Recursos do kernel em tempo real

O PREEMPT_RT transforma o kernel do Linux em um sistema operacional de tempo real, garantindo a precisão de tempo para tarefas críticas. Totalmente integrado ao Linux 6.12 (lançado em 20 de setembro de 2024), ele habilita recursos de tempo real para arquiteturas como x86, ARM64 e RISC-V. Veja o que você precisa saber:

  • Principais características:
    • Substitui os tradicionais fechos de rosca por fechos de segurança preemptíveis.
    • Converte manipuladores de interrupção em threads, tornando-os agendáveis e preemptíveis.
    • Implementa herança de prioridade para resolver problemas de inversão de prioridade.
    • Torna as operações RCU (Read-Copy-Update) totalmente preemptíveis.
  • Aplicações:
    • Utilizado em setores como o automotivo, robótica, telecomunicações e dispositivos médicos, onde a precisão temporal é fundamental.
    • Alimenta sistemas como ferramentas de automação industrial, controles de voo e ambientes de hospedagem que exigem servidores virtuais privados de baixa latência.
  • Configurar:
    • Habilitar CONFIG_PREEMPT_RT na configuração do kernel.
    • Ajuste fino de configurações como CONFIG_NO_HZ_FULL e CONFIG_RCU_BOOST Para um desempenho ideal.
    • Use ferramentas como teste cíclico Para medir a latência e validar o desempenho.

O PREEMPT_RT prioriza o tempo em detrimento da taxa de transferência, tornando o Linux adequado para aplicações onde os prazos são inegociáveis. É uma solução revolucionária para setores que exigem desempenho determinístico.

Principais funcionalidades do PREEMPT_RT: Como o Linux alcança desempenho em tempo real

Principais funcionalidades do PREEMPT_RT: Como o Linux alcança desempenho em tempo real

PREEMPT_RT explicado: Compile e otimize o kernel do Linux para tempo real e latência ultrabaixa.

Recursos principais do PREEMPT_RT

O PREEMPT_RT concentra-se em quatro funcionalidades principais, concebidas para reduzir o código não preemptível e melhorar o controlo sobre o agendamento de tarefas. Vejamos aqui uma análise mais detalhada de cada uma delas.

Preempção completa do kernel

Uma das maiores atualizações é a transformação dos spinlocks padrão (spinlock_t) e bloqueios de leitor-escritor (rwlock_t) em spinlocks de repouso baseados em mutex. Os spinlocks tradicionais podem causar atrasos porque desabilitam a preempção, forçando as tarefas a ficarem em espera ocupada. O PREEMPT_RT muda isso introduzindo locks que permitem que as tarefas entrem em estado de espera e sejam preemptadas, mesmo quando estão utilizando um recurso.

Isso significa que tarefas de alta prioridade podem interromper tarefas de baixa prioridade, mesmo que as tarefas de baixa prioridade estejam mantendo bloqueios. No entanto, para certas operações críticas – como o agendador ou os pontos de entrada de hardware – PREEMPT_RT mantém o bloqueio. raw_spinlock_t, que se comporta como as fechaduras não preemptíveis originais. Como afirma Paul McKenney, um Engenheiro Distinto:

""O objetivo principal do patch PREEMPT_RT é minimizar a quantidade de código do kernel que não é preemptível, ao mesmo tempo que minimiza a quantidade de código que precisa ser alterada para fornecer essa preemptibilidade adicional.""

Em seguida, vejamos como o tratamento de interrupções se beneficia dessa abordagem.

Interrupções encadeadas

PREEMPT_RT transfere a maioria dos manipuladores de interrupção de hardware do contexto de "IRQ rígido" para o contexto de "interrupção de hardware". threads do kernel Executando no contexto do processo. Esse ajuste permite que os manipuladores de interrupção sejam priorizados, preemptados ou até mesmo bloqueados.

Em um kernel Linux padrão, um manipulador de interrupção de longa duração pode levar a uma latência ilimitada, pois interrompe toda a execução subsequente. Interrupções em threads resolvem esse problema. Por padrão, essas threads de interrupção são executadas com um nível de prioridade alto. SCHED_FIFO prioridade de 50, mas os administradores podem ajustar suas prioridades usando ferramentas como chrt. Por exemplo, você pode priorizar a interrupção de uma placa de rede para controle industrial, enquanto diminui a prioridade para E/S de disco. Como essas threads usam spinlocks em modo de espera em vez de spinlocks brutos, elas evitam a necessidade de desabilitar interrupções de hardware enquanto mantêm um bloqueio.

Agora, vamos explorar como o PREEMPT_RT lida com desafios relacionados à prioridade.

Herança prioritária e Rtmutex

Inversão de prioridade Um problema grave ocorre quando uma tarefa de alta prioridade fica presa aguardando um recurso que está sendo usado por uma tarefa de baixa prioridade, enquanto uma tarefa de prioridade média (que não precisa do recurso) interrompe a tarefa de baixa prioridade. O PREEMPT_RT resolve esse problema com herança prioritária, aumentando temporariamente a prioridade da tarefa de baixa prioridade para corresponder à tarefa de maior prioridade que aguarda o recurso.

O rtmutex O `primitive` é a ferramenta que torna isso possível. Ele garante que, quando surge um conflito, a tarefa de baixa prioridade receba um aumento de prioridade para concluir sua seção crítica sem interferência de tarefas de prioridade média. Se a tarefa com prioridade aumentada for bloqueada em outro bloqueio, o aumento de prioridade se propaga pela cadeia de dependências. Como explica a documentação do kernel do Linux:

""A herança de prioridade permite que aplicações bem projetadas usem bloqueios de espaço do usuário em partes críticas de uma thread de alta prioridade, sem perder o determinismo.""

Para alcançar isso, rtmutex Utiliza um indicador e uma árvore ordenada por prioridade para gerenciar tarefas em espera, mantendo a sobrecarga baixa nas arquiteturas suportadas.

Por fim, vejamos como o PREEMPT_RT melhora as operações da RCU.

RCU preemptível (Leitura-Cópia-Atualização)

RCU

Read-Copy-Update (RCU) é uma técnica de sincronização amplamente utilizada no kernel do Linux. Em kernels padrão, as seções de leitura RCU não são preemptíveis, o que pode levar a atrasos imprevisíveis. PREEMPT_RT altera isso tornando as seções de leitura RCU preemptíveis. totalmente preemptível, garantindo que os prazos das tarefas em tempo real não sejam comprometidos. Esse ajuste é fundamental para alcançar o comportamento previsível exigido em sistemas de tempo real.

Como configurar e usar o PREEMPT_RT

O PREEMPT_RT está totalmente integrado aos kernels Linux principais, o que significa que patches externos não são mais necessários. No entanto, aplicar a fila de patches mais recente ainda é uma boa prática para melhor suporte à arquitetura e gráficos aprimorados. Assim que o kernel estiver pronto, você precisará ajustar suas configurações para aproveitar ao máximo seus recursos.

Configurações do Kernel

Para habilitar um kernel totalmente preemptível, ative a opção CONFIG_PREEMPT_RT. Em kernels mais recentes, essa configuração está localizada em "Configurações Gerais", mas talvez seja necessário habilitá-la. CONFIG_ESPERT Primeiro, é preciso torná-lo visível no menu de configuração.

Para produção servidores dedicados e em outros ambientes de alto desempenho, opções adicionais podem otimizar ainda mais o desempenho:

  • CONFIG_NO_HZ_FULLReduz as interrupções do relógio de agendamento em CPUs ocupadas, o que ajuda a minimizar a instabilidade (jitter).
  • CONFIG_RCU_BOOSTImpede que leitores RCU preemptados atrasem os períodos de tolerância.
  • CONFIG_RCU_NOCB_CPUDescarrega o processamento de retornos de chamada RCU para CPUs específicas, reduzindo a interferência com tarefas em tempo real.

Também é fundamental desativar opções de depuração que podem causar alta latência. Desative configurações como CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_OBJECTS, e CONFIG_SLUB_DEBUG. Embora essas ferramentas sejam úteis para o desenvolvimento, elas podem prejudicar significativamente as metas de latência. Como explica o kernelconfig.io:

""Essa opção transforma o kernel em um kernel de tempo real, substituindo várias primitivas de bloqueio (spinlocks, rwlocks, etc.) por variantes preemptíveis com reconhecimento de herança de prioridade.""

Após a compilação e inicialização do kernel, confirme se PREEMPT_RT está ativo executando o seguinte comando: cat /sys/kernel/realtime. Um valor de retorno de 1 indica sucesso. Você também pode verificar procurando por "PREEMPT_RT" na saída de uname -a.

Depuração e Otimização de Desempenho

O ajuste fino do kernel é essencial para alcançar o desempenho ideal em cargas de trabalho em tempo real. Uma área fundamental a ser abordada é a mecanismo de controle de aceleração em tempo real, que reserva 50 ms por segundo para tarefas que não sejam em tempo real por padrão. Se sua carga de trabalho for puramente em tempo real, você pode desativar esse mecanismo escrevendo -1 para /proc/sys/kernel/sched_rt_runtime_us. Como destaca Jan Altenberg, Consultor Sênior de Código Aberto da OSADL:

""Uma tarefa em tempo real 'descontrolada' pode sobrecarregar o sistema. Como mecanismo de proteção, o tempo de execução de tarefas em tempo real pode ser limitado definindo um valor em microssegundos em /proc/sys/kernel/sched_rt_runtime_us."‘

Para um determinismo aprimorado, isole núcleos de CPU específicos usando parâmetros como isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, e definir irqaffinity=0. Isso reserva esses núcleos exclusivamente para tarefas em tempo real.

Para gerenciar threads de interrupção, use o chrt ferramenta. Essas threads normalmente são executadas com um padrão. SCHED_FIFO A prioridade é 50, mas você pode ajustá-la para evitar conflitos com seu aplicativo. Por exemplo, para definir a prioridade da thread de interrupção (IRQ) de uma placa de rede para 98, use o comando: chrt -p -f 98.

Após concluir a configuração, é crucial testar e validar o desempenho da latência. Ferramentas como teste cíclico pode medir a latência (por exemplo, teste cíclico -S -m -p98 -i250), enquanto rtla A Análise Linux em Tempo Real ajuda a identificar e analisar picos de latência. Essas ferramentas garantem que sua configuração atenda às demandas de aplicativos em tempo real.

Aplicações e benefícios do PREEMPT_RT

Casos de uso de aplicações em tempo real

PREEMPT_RT se destaca em sistemas onde a precisão de temporização é imprescindível. aeroespacial, Isso garante que os controles de navegação e voo funcionem sem atrasos de microssegundos, o que poderia comprometer a segurança. Telecomunicações As empresas contam com ele para gerenciar o roteamento de dados em tempo real, garantindo chamadas de voz e vídeo fluidas, eliminando oscilações e picos de latência.

No indústria automotiva, É um pilar fundamental para os sistemas de controle de veículos, com grandes empresas como a Continental Automotive apoiando sua adoção. automação industrial, O PREEMPT_RT alimenta Controladores Lógicos Programáveis (CLPs) e sistemas SCADA, frequentemente trabalhando em conjunto com protocolos como o EtherCAT para manter a segurança e a eficiência nas linhas de produção. Robótica Além disso, depende fortemente dessa tecnologia para o controle preciso dos atuadores e o feedback instantâneo dos sensores, permitindo que os robôs respondam imediatamente às mudanças ambientais.

Talvez as aplicações mais críticas sejam em dispositivos médicos, Em ambientes onde a precisão é fundamental, desde monitores de pacientes a robôs cirúrgicos, o PREEMPT_RT oferece o desempenho determinístico necessário para garantir o funcionamento impecável de sistemas vitais.

Benefícios dos Ambientes de Hospedagem

As vantagens do PREEMPT_RT estendem-se aos ambientes de hospedagem, onde a capacidade de resposta em tempo real é igualmente crucial. VPS e servidores dedicados, Isso minimiza a latência, permitindo que o agendador priorize tarefas de alta prioridade em detrimento das menos críticas. Isso garante tempos de resposta consistentes, o que impacta diretamente a experiência do usuário e a confiabilidade do serviço.

O modelo de interrupção por threads impede que "tempestades de interrupções" sobrecarreguem os sistemas durante operações intensivas de E/S. rt_mutex, A herança de prioridades garante que tarefas em segundo plano de baixa prioridade não bloqueiem serviços críticos de hospedagem. Temporizadores de alta resolução permitem precisão de agendamento em nível de microssegundos, reduzindo a instabilidade em configurações virtualizadas. Provedores de hospedagem, como Serverion, oferecem compilações de kernel personalizadas com PREEMPT_RT, dando aos administradores a flexibilidade de ajustar as configurações para cargas de trabalho específicas. Ao usar parâmetros como isolcpus e irqaffinity, Os provedores podem dedicar núcleos de CPU a tarefas críticas para o desempenho, mantendo as operações rotineiras do sistema isoladas.

Conclusão

Este guia abordou detalhadamente como PREEMPT_RT Transforma o Linux em um sistema operacional de tempo real, dando ao agendador controle quase completo. Desde sua inclusão nos kernels principais a partir do Linux 6.12 (setembro de 2024), eliminou a necessidade de patches externos em arquiteturas como x86, ARM64 e RISC-V.

O conceito é simples: reduzir ao máximo o código não preemptível. Ao converter spinlocks em locks de espera e executar manipuladores de interrupção como threads, tarefas de alta prioridade podem interromper quase todas as atividades do kernel. Recursos como herança de prioridade impedem que tarefas de baixa prioridade atrasem operações críticas, enquanto o RCU preemptível garante que mesmo seções críticas do lado da leitura não causem atrasos significativos. Sebastian Siewior, o mantenedor do PREEMPT_RT, afirma acertadamente:

""Todo o controle para o agendador.""

Esse avanço tecnológico oferece benefícios práticos. Por exemplo, Serverion Utiliza versões personalizadas do kernel PREEMPT_RT para ajustar o isolamento da CPU e otimizar cargas de trabalho em tempo real, garantindo tempos de resposta estáveis mesmo sob intensa pressão de E/S.

O que diferencia os sistemas de tempo real não é apenas a velocidade, mas sim a previsibilidade. O PREEMPT_RT minimiza a instabilidade (jitter), garantindo que as tarefas sejam executadas precisamente quando necessário. Isso é crucial para aplicações como automação industrial, telecomunicações e serviços de hospedagem com desempenho crítico. Ele proporciona o tipo de comportamento determinístico que os kernels padrão simplesmente não conseguem oferecer.

Com sua integração ao kernel principal e suporte de distribuições corporativas como Ubuntu Pro (Desde fevereiro de 2023), o PREEMPT_RT tornou-se mais acessível para provedores de hospedagem e administradores de sistemas. Ele oferece o desempenho confiável e de baixa latência exigido pelos ambientes mais exigentes e sensíveis ao tempo da atualidade.

Perguntas frequentes

Preciso do PREEMPT_RT ou o Linux padrão é suficiente?

O kernel Linux padrão, quando combinado com o Patch PREEMPT_RT, O kernel Linux, por si só, adquire capacidades de tempo real. Isso o torna uma ótima opção para aplicações onde baixa latência e tempos de resposta consistentes são críticos. No entanto, o kernel Linux principal, por si só, pode não atender às exigências rigorosas de tempo real.

O PREEMPT_RT reduzirá a taxa de transferência geral do meu sistema?

Para alcançar desempenho em tempo real, PREEMPT_RT O foco está na redução do código do kernel não preemptível, o que ajuda a melhorar a capacidade de resposta do sistema. Essa abordagem pode levar a uma ligeira diminuição na taxa de transferência geral, mas garante um comportamento consistente e previsível – crucial para aplicações sensíveis ao tempo. Essa compensação é intencional e fundamental para atender às demandas de sistemas de tempo real.

Qual é a latência alvo realista com PREEMPT_RT?

Com PREEMPT_RT, Alcançar latência na faixa de milissegundos é uma meta realista tanto para sistemas desktop quanto para sistemas embarcados. No entanto, o desempenho real depende muito de quão bem o sistema é configurado e ajustado para atender a requisitos específicos. Uma configuração adequada é fundamental para garantir o nível de resposta desejado.

Postagens de blog relacionadas

pt_BR