|Index|SUSE Telco Cloud Documentação|Configuração de recursos de Telco|Fixação de CPU no Host
Aplica-se a SUSE Telco Cloud 3.6

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:

parametervaluedescrição

isolcpus

domain,nohz,managed_irq,1-30,33-62

Isole os núcleos 1-30 e 33-62. domain indica que essas CPUs fazem parte do domínio de isolamento. nohz habilita a operação sem tick nessas CPUs isoladas quando estão ociosas, para reduzir interrupções. managed_irq isola as CPUs fixadas de serem alvo de IRQs. Isso contempla irqaffinity=0-7, que já direciona a maioria das IRQs para os núcleos de manutenção.

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 (0,31,32,63). Isso economiza energia e reduz as ativações desnecessárias nesses núcleos de uso geral.

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 estiver definido.

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
$ reboot

Para 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/cmdline

Existe 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.