36 Fixação de CPU no Host #
A fixação de CPU, também conhecida como afinidade de processador, é a técnica de vincular um processo ou thread a um núcleo de CPU específico, impedindo que o agendador do sistema operacional o mova. Ao garantir que um processo sempre seja executado no mesmo núcleo, ele se beneficia do acesso mais rápido aos dados que permanecem na memória cache desse núcleo. Essa prática é comum em ambientes de computação de alto desempenho porque melhora drasticamente o desempenho e reduz a sobrecarga.
36.1 Isolamento de CPUs via TuneD #
tuned é uma ferramenta de ajuste de sistema que monitora as condições do sistema para otimizar o desempenho usando vários perfis predefinidos. Um recurso importante é sua capacidade de isolar núcleos de CPU para cargas de trabalho específicas, como aplicativos em tempo real. Isso evita que o SO utilize esses núcleos e potencialmente aumente a latência.
Para habilitar e configurar esse recurso, a primeira coisa é criar um perfil para os núcleos de CPU que queremos isolar. Neste exemplo, entre 64 núcleos, dedicamos 60 núcleos (1-30,33-62) para o aplicativo e os 4 núcleos restantes são usados para manutenção. Observe que o design de CPUs isoladas depende fortemente dos aplicativos em tempo real.
$ echo "export tuned_params" >> /etc/grub.d/00_tuned
$ echo "isolated_cores=1-30,33-62" >> /etc/tuned/cpu-partitioning-variables.conf
$ tuned-adm profile cpu-partitioning
Tuned (re)started, changes applied.36.2 Isolamento de CPUs via argumentos do kernel #
Em seguida, precisamos modificar a opção do GRUB para isolar os núcleos da CPU e outros parâmetros importantes para o uso da CPU. As seguintes opções são importantes para serem personalizadas com as especificações do seu hardware atual:
| parameter | value | descrição |
|---|---|---|
isolcpus | domain,nohz,managed_irq,1-30,33-62 | Isole os núcleos 1-30 e 33-62. |
skew_tick | 1 | Esta opção permite que o kernel desloque as interrupções do temporizador entre as CPUs isoladas. |
nohz | on | Quando habilitada, a interrupção periódica do temporizador do kernel (o 'tick') parará em qualquer núcleo de CPU que esteja ocioso. Isso beneficia principalmente as CPUs de manutenção ( |
nohz_full | 1-30,33-62 | Para os núcleos isolados, isso interrompe o tick e faz isso mesmo quando a CPU está executando uma única tarefa ativa. Isso significa que faz a CPU rodar em modo full tickless (ou 'dyntick'). O kernel só entregará interrupções de temporizador quando elas forem realmente necessárias. |
rcu_nocbs | 1-30,33-62 | Esta opção descarrega o processamento de callback RCU de núcleos de CPU especificados. |
rcu_nocb_poll | Quando esta opção está definida, as CPUs sem callback RCU farão polling regularmente para verificar se o tratamento de callback é necessário, em vez de serem explicitamente despertadas por outras CPUs. Isso pode reduzir a sobrecarga de interrupção. | |
irqaffinity | 0,31,32,63 | Esta opção permite que o kernel execute as interrupções nos núcleos de manutenção. |
inativo | Fazer poll | Isso minimiza a latência de saída do estado ocioso, mas ao custo de manter a CPU funcionando em velocidade máxima na thread ociosa. |
nmi_watchdog | 0 | Esta opção desativa apenas o watchdog NMI. Isso pode ser omitido quando |
nowatchdog | Esta opção desativa o watchdog de soft-lockup, que é implementado como um temporizador executado no contexto de interrupção de hardware do temporizador. |
Os comandos a seguir modificam a configuração do GRUB e aplicam as alterações mencionadas acima para que estejam presentes na próxima inicialização:
Edite o arquivo /etc/default/grub com os parâmetros acima e o arquivo ficará assim:
GRUB_CMDLINE_LINUX="BOOT_IMAGE=/boot/vmlinuz-6.4.0-9-rt root=UUID=77b713de-5cc7-4d4c-8fc6-f5eca0a43cf9 skew_tick=1 rd.timeout=60 rd.retry=45 console=ttyS1,115200 console=tty0 default_hugepagesz=1G hugepagesz=1G hugepages=40 hugepagesz=2M hugepages=0 ignition.platform.id=openstack net.ifnames=1 intel_iommu=on iommu=pt irqaffinity=0,31,32,63 isolcpus=domain,nohz,managed_irq,1-30,33-62 nohz_full=1-30,33-62 nohz=on mce=off nosoftlockup nowatchdog nmi_watchdog=0 quiet rcu_nocb_poll rcu_nocbs=1-30,33-62 rcupdate.rcu_cpu_stall_suppress=1 rcupdate.rcu_expedited=1 rcupdate.rcu_normal_after_boot=1 rcupdate.rcu_task_stall_timeout=0 rcutree.kthread_prio=99 security=selinux selinux=1 idle=poll"Atualize a configuração do GRUB:
$ transactional-update grub.cfg
$ rebootPara validar que os parâmetros sejam aplicados após a reinicialização, o seguinte comando pode ser usado para verificar a linha de comando do kernel:
$ cat /proc/cmdlineExiste outro script que pode ser usado para ajustar a configuração da CPU, que basicamente realiza as seguintes etapas:
Defina o governador da CPU como
performance.Desative a migração de timer para as CPUs isoladas.
Migre as threads kdaemon para as CPUs de manutenção.
Defina a latência das CPUs isoladas para o menor valor possível.
Atrase as atualizações do vmstat para 300 segundos.
O script está disponível em repositório de exemplos do SUSE Telco Cloud.