Administração de Sistemas

Performance tuning: sysctl, IRQ affinity e CPU governors

• 7 min de leitura

Performance tuning: sysctl, IRQ affinity e CPU governors
O tuning de desempenho em sistemas Linux gira em torno de três métricas fundamentais: latência (tempo de resposta de uma operação), throughput (quantidade de operações por unidade de tempo) e escalabilidade (capacidade de manter desempenho sob carga crescente). Otimizações que reduzem latência frequentemente aumentam throughput, mas exigem equilíbrio cuidadoso para não sacrificar estabilidade.

Performance tuning: sysctl, IRQ affinity e CPU governors

1. Fundamentos de Performance Tuning no Linux

1.1. Conceitos de latência, throughput e escalabilidade

O tuning de desempenho em sistemas Linux gira em torno de três métricas fundamentais: latência (tempo de resposta de uma operação), throughput (quantidade de operações por unidade de tempo) e escalabilidade (capacidade de manter desempenho sob carga crescente). Otimizações que reduzem latência frequentemente aumentam throughput, mas exigem equilíbrio cuidadoso para não sacrificar estabilidade.

1.2. Visão geral dos subsistemas envolvidos

Três subsistemas principais interagem diretamente com o desempenho: o kernel (gerencia processos, memória e I/O), o hardware (CPU, memória RAM, dispositivos de armazenamento e rede) e o escalonador de CPU (decide qual processo executa em qual núcleo). Ajustes em qualquer um desses pontos podem gerar ganhos significativos.

1.3. Ferramentas de monitoramento inicial

Antes de ajustar, é essencial medir. Ferramentas como perf (análise de eventos de hardware), top (visão geral de processos), vmstat (estatísticas de memória e CPU) e mpstat (uso por núcleo) fornecem a linha de base necessária.

# Exemplo de monitoramento com mpstat a cada 2 segundos
mpstat -P ALL 2

2. Ajuste de Parâmetros do Kernel com sysctl

2.1. Principais parâmetros de rede

Para servidores que processam muitas conexões, ajustar buffers de rede é crucial. O net.core.rmem_max e net.core.wmem_max definem o tamanho máximo dos buffers de recebimento e envio. O net.ipv4.tcp_rmem controla os buffers TCP de leitura (mínimo, padrão, máximo). O net.core.somaxconn limita o número de conexões pendentes em fila de aceite.

# Aumentar buffers de rede para alta throughput
sysctl -w net.core.rmem_max=134217728
sysctl -w net.core.wmem_max=134217728
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.core.somaxconn=65535

2.2. Parâmetros de memória e cache

O vm.swappiness controla a tendência de usar swap (0 = evitar swap ao máximo, 100 = swap agressivo). Para servidores com muita RAM, valores baixos (1-10) reduzem latência. O vm.dirty_ratio define o percentual de memória suja antes de forçar escrita em disco. O vm.vfs_cache_pressure controla a reutilização de caches de diretórios e inodes.

# Ajustes para workloads intensivos em I/O
sysctl -w vm.swappiness=10
sysctl -w vm.dirty_ratio=40
sysctl -w vm.vfs_cache_pressure=50

2.3. Configuração de kernel para alta concorrência

Para sistemas com muitos threads, kernel.sched_migration_cost_ns (tempo mínimo antes de migrar uma tarefa entre CPUs) reduz overhead de migração desnecessária. O kernel.numa_balancing pode ser desabilitado em workloads que não se beneficiam de balanceamento NUMA automático.

# Otimizações para cargas concorrentes
sysctl -w kernel.sched_migration_cost_ns=5000000
sysctl -w kernel.numa_balancing=0

3. Gerenciamento de Interrupções e IRQ Affinity

3.1. Entendendo interrupções de hardware e softirqs

Interrupções de hardware (IRQs) são sinais enviados por dispositivos à CPU. Softirqs são interrupções de software que lidam com processamento posterior. Quando todas as IRQs caem no mesmo núcleo, esse núcleo pode saturar, causando gargalos.

3.2. Distribuição de IRQs entre núcleos

O arquivo /proc/irq/[IRQ_NUM]/smp_affinity contém uma máscara de bits indicando quais CPUs podem atender aquela IRQ. O serviço irqbalance distribui automaticamente as interrupções, mas para cargas previsíveis, o ajuste manual é superior.

# Ver interrupções atuais
cat /proc/interrupts

# Definir afinidade manual para IRQ 130 (exemplo: placa de rede)
# Máscara 0x0f = CPUs 0,1,2,3
echo 0x0f > /proc/irq/130/smp_affinity

3.3. Casos práticos: NICs de alta velocidade e NVMe

Para NICs 10GbE ou superiores e SSDs NVMe, distribuir as filas de interrupção entre núcleos dedicados maximiza throughput. Muitos drivers modernos suportam múltiplas filas (RSS para rede, MSI-X para NVMe).

# Exemplo para placa de rede Intel ixgbe com múltiplas filas
# Ativar RSS com 4 filas
ethtool -L eth0 combined 4

# Verificar filas e IRQs associadas
cat /proc/interrupts | grep eth0

4. Escalonamento de Frequência da CPU: CPU Governors

4.1. Modos de governador

Os governadores de CPU controlam a frequência de operação:
- performance: frequência máxima fixa, maior desempenho e consumo.
- powersave: frequência mínima fixa, economia de energia.
- ondemand: aumenta frequência sob demanda, balanceado.
- conservative: similar ao ondemand, mas com transições mais suaves.
- schedutil: governador moderno que usa dados do escalonador para decisões mais precisas.

4.2. Seleção e troca de governadores

A troca pode ser feita via cpufrequtils ou diretamente pelo sysfs.

# Instalar cpufrequtils (Debian/Ubuntu)
apt install cpufrequtils

# Ver governador atual
cpufreq-info

# Trocar para performance em todos os núcleos
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > $cpu
done

4.3. Impacto no desempenho vs. consumo energético

Em servidores de produção, o governador performance elimina latências de transição de frequência, mas aumenta consumo térmico e elétrico. Em workstations, schedutil oferece bom equilíbrio. Para workloads batch, ondemand pode ser suficiente.

5. Estratégias de Isolamento de CPU e Afinidade de Processos

5.1. Isolamento de núcleos com isolcpus e taskset

O parâmetro de boot isolcpus remove núcleos do escalonador geral, permitindo que apenas processos explicitamente designados os usem. O comando taskset fixa processos a núcleos específicos.

# No GRUB, adicionar ao kernel line:
isolcpus=2,3

# Fixar processo ao núcleo 2
taskset -c 2 ./meu_processo

5.2. Afinidade de processos com cgroups e cpuset

Cgroups v2 permitem criar grupos com afinidade de CPU, memória e I/O. O subsistema cpuset define quais núcleos um grupo pode usar.

# Criar cgroup com acesso apenas às CPUs 0-1
mkdir /sys/fs/cgroup/cpuset/meu_grupo
echo 0-1 > /sys/fs/cgroup/cpuset/meu_grupo/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/meu_grupo/cpuset.mems
echo $$ > /sys/fs/cgroup/cpuset/meu_grupo/cgroup.procs

5.3. Combinação com IRQ affinity para cargas de tempo real

Para bancos de dados ou aplicações de tempo real, isole núcleos para o processo principal, direcione IRQs de rede e disco para outros núcleos e use governador performance. Isso elimina contenção e reduz jitter.

6. Monitoramento e Validação de Ajustes

6.1. Uso de sysctl -a, /proc/interrupts, /proc/cpuinfo e cpufreq-info

Após ajustes, verifique a configuração ativa:

# Listar todos os parâmetros sysctl ativos
sysctl -a | grep -E "net.core|vm.swap|kernel.sched"

# Ver informações detalhadas da CPU
cat /proc/cpuinfo | grep "model name" | head -1

# Ver frequências atuais
cpufreq-info | grep "current frequency"

6.2. Benchmarks práticos

Use ferramentas específicas para validar ganhos:
- stress-ng para estressar CPU e memória.
- iperf3 para medir throughput de rede.
- fio para benchmark de disco.

# Teste de rede com iperf3 (servidor)
iperf3 -s

# Teste de rede (cliente, 30 segundos)
iperf3 -c 192.168.1.100 -t 30 -P 4

6.3. Análise de regressão e persistência de configurações

Para persistir ajustes sysctl, edite /etc/sysctl.conf ou crie arquivos em /etc/sysctl.d/. Para IRQ affinity, use scripts em /etc/rc.local ou regras udev. Para governadores, configure /etc/default/cpufrequtils.

# Exemplo de /etc/sysctl.d/99-performance.conf
net.core.rmem_max = 134217728
vm.swappiness = 10
kernel.numa_balancing = 0

7. Casos de Uso e Boas Práticas

7.1. Servidor web com alta carga

Combine ajustes de rede (buffers grandes, somaxconn alto), governador performance em todos os núcleos, IRQ affinity da placa de rede para núcleos dedicados e isolamento de núcleos para o processo do servidor web.

7.2. Estação de trabalho para desenvolvimento

Use schedutil como governador para equilíbrio, mantenha swappiness baixo (10) para evitar swap durante compilações e deixe irqbalance ativo para distribuição automática.

7.3. Máquina virtual ou container

Em ambientes virtualizados, muitos parâmetros sysctl são gerenciados pelo hipervisor. Priorize ajustes de rede e I/O dentro do convidado. Evite isolcpus em containers, prefira cgroups para controle de recursos.

Referências

💬 Comentários
Mais em Administração de Sistemas