sysctl: Ajustando Parâmetros do Kernel no Linux

sysctl: Ajustando Parâmetros do Kernel no Linux

O que você vai aprender

  • Como ler e alterar parâmetros do kernel com sysctl
  • Quando usar uma alteração em tempo de execução (sysctl -w) versus persistir via /etc/sysctl.d
  • Como diagnosticar por que uma configuração não entra em vigor (precedência, momento do carregamento)

Resumo Rápido

  • Ler -> sysctl <key> (listar todos com sysctl -a)
  • Alteração em tempo de execução -> sudo sysctl -w key=value (perdido ao reiniciar)
  • Persistir -> escreva /etc/sysctl.d/99-custom.conf, depois sudo sysctl --system

Premissas (ambiente alvo)

  • Distribuições baseadas em systemd como Ubuntu 22.04 / 24.04 ou RHEL 9
  • Pacote: sysctl(8) incluído no procps (procps-ng)
  • Alterar parâmetros geralmente requer root (sudo)

O que é sysctl?

Conclusão: sysctl lê e escreve os parâmetros ajustáveis do kernel em execução através de /proc/sys/; os nomes das chaves mapeiam diretamente para essa árvore de diretórios.

sysctl lê e escreve os parâmetros ajustáveis do kernel. Internamente, esses parâmetros são arquivos no sistema de arquivos virtual /proc/sys/, e sysctl é um wrapper fino que os expõe em um formato amigável key = value.

Pontos no nome da chave mapeiam diretamente para separadores de diretório:

# Estes referem-se a mesma coisa
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
net.ipv4.ip_forward = 0
0

Os principais namespaces de nível superior são:

Prefixo Área Parâmetros típicos
net. Rede net.ipv4.ip_forward / net.core.somaxconn
vm. Memória virtual vm.swappiness / vm.overcommit_memory
fs. Sistema de arquivos fs.file-max / fs.inotify.max_user_watches
kernel. Kernel geral kernel.hostname / kernel.pid_max

Como leio o valor atual?

Conclusão: Use sysctl <key> para um valor e sysctl -a para tudo; adicione -n para imprimir o valor sem o nome da chave.

# Um unico parametro
sysctl vm.swappiness
vm.swappiness = 60
# Todos os parametros (milhares de linhas; combine com grep)
sysctl -a | grep somaxconn
net.core.somaxconn = 4096

Para obter apenas o valor, use -n (não imprime o nome da chave). Isso é útil em scripts shell que tomam decisões com base em um valor.

sysctl -n vm.swappiness
60

Alguns parâmetros retornam "permission denied" para usuários não-root, então sysctl -a pode ser incompleto. Execute sudo sysctl -a quando precisar da lista completa.

Como altero um valor temporariamente?

Conclusão: sudo sysctl -w key=value aplica instantaneamente mas é perdido ao reiniciar, o que o torna ideal para testes e validação.

-w (write) altera o valor no kernel em execução. Entra em vigor imediatamente mas reverte ao reiniciar.

# Habilitar encaminhamento IP temporariamente
sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Escrever diretamente em /proc/sys/ faz a mesma coisa:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

sysctl -w é uma alteração temporária. "Eu configurei mas sumiu depois de reiniciar" quase sempre significa que o valor nunca foi persistido. Para torná-lo permanente, siga a próxima seção.

Como torno uma alteração permanente?

Conclusão: Coloque um arquivo drop-in em /etc/sysctl.d/ e aplique com sudo sysctl --system; drop-ins são preferidos em vez de editar /etc/sysctl.conf diretamente.

Persistência significa escrever linhas key = value em um arquivo de configuração. Em distribuições modernas com systemd, criar um arquivo drop-in em /etc/sysctl.d/ é preferido em vez de editar /etc/sysctl.conf diretamente, porque é mais fácil de gerenciar e comparar.

Por convenção, nomeie o arquivo como NN-nome.conf (onde NN é um número de dois dígitos). O número controla a precedência (veja abaixo).

# Exemplo: reduzir swap e habilitar encaminhamento IP
sudo tee /etc/sysctl.d/99-custom.conf <<'EOF'
# Custom kernel parameters
vm.swappiness = 10
net.ipv4.ip_forward = 1
EOF

Apenas escrever o arquivo não o aplica. Carregue-o explicitamente:

# Carregar apenas este arquivo
sudo sysctl -p /etc/sysctl.d/99-custom.conf

# Ou recarregar todos os arquivos de configuracao dos diretorios padrao
sudo sysctl --system
* Applying /etc/sysctl.d/99-custom.conf ...
vm.swappiness = 10
net.ipv4.ip_forward = 1

Verifique o resultado. Após aplicar, leia o valor de volta com sysctl <key> e confirme que corresponde ao esperado.

sysctl vm.swappiness net.ipv4.ip_forward

Na inicialização, systemd-sysctl.service aplica esses arquivos automaticamente, então um valor persistido sobrevive a reinicializações.

Qual é a precedência dos arquivos de configuração?

Conclusão: Arquivos de vários diretórios são mesclados em ordem lexicográfica de nome de arquivo; para uma chave duplicada, o nome de arquivo lexicograficamente último vence, e /etc/ sobrescreve arquivos com o mesmo nome em outros locais.

sysctl --system*.conf destes diretórios:

Prioridade Diretório Propósito
Alta /etc/sysctl.d/ Configurações personalizadas do admin
Média /run/sysctl.d/ Configurações geradas em tempo de exec
Baixa /usr/lib/sysctl.d/ Padrões enviados com pacotes

As regras são duas:

  1. Arquivos são mesclados em ordem lexicográfica de nome de arquivo (comparados entre diretórios). Se a mesma chave aparece em múltiplos arquivos, aquele no arquivo cujo nome ordena por último (maior) vence. Por isso um número alto como 99-custom.conf facilita a sobrescrita.
  2. Se o mesmo nome de arquivo existe em múltiplos diretórios, o de /etc/ sobrescreve os de /run/ e /usr/lib/. Para desabilitar um arquivo de pacote, coloque um arquivo vazio com o mesmo nome em /etc/sysctl.d/.
# Rastrear qual arquivo define qual chave
grep -Rn swappiness /etc/sysctl.conf /etc/sysctl.d/ /usr/lib/sysctl.d/ /run/sysctl.d/ 2>/dev/null

/etc/sysctl.conf ainda é lido, mas é o arquivo único histórico. Separar novas configurações em drop-ins (/etc/sysctl.d/*.conf) facilita rastrear de onde cada configuração vem.

Parâmetros comuns com exemplos

Conclusão: Ajustes de memória, rede e descritores de arquivo aparecem com mais frequência na prática; nunca copie valores cegamente sem entendê-los.

Parâmetro Função Valor comum
vm.swappiness Agressividade do swap (0-100, menor favorece RAM) 10 em servidores de banco de dados
vm.overcommit_memory Política de overcommit de memória 1 para Redis, etc.
net.ipv4.ip_forward Encaminhamento de pacotes (necessário para roteadores/containers) 1
net.core.somaxconn Comprimento máximo da fila de aceitação 4096 para servidores web ocupados
fs.file-max Limite de handles de arquivo do sistema Aumentar para servidores de alta conexão
fs.inotify.max_user_watches Limite de watches do inotify Aumentar para IDEs/ferramentas de build

Por que minha alteração não está funcionando?

Conclusão: Verifique quatro coisas em ordem: permissões, recarga esquecida, arquivo que sobrescreve e chave ausente.

  • Permissão insuficiente: sysctl -w precisa de sudo. Operation not permitted significa permissões ou restrição de container (containers sem privilégios bloqueiam a maioria das escritas).
  • Esqueceu de recarregar: Escrever o arquivo não é suficiente. Confirme que executou sudo sysctl --system (ou -p).
  • Sobrescrito por outro arquivo: Se um valor reverte, um arquivo lexicograficamente posterior está sobrescrevendo. Encontre o culpado com grep -R <key> /etc/sysctl.d /usr/lib/sysctl.d.
  • Chave errada ou ausente: sysctl: cannot stat ... significa um erro de digitação ou um módulo não carregado. Use sysctl -e para ignorar erros de chave desconhecida e encontre o nome correto com sysctl -a | grep.
# Verificar o log de aplicacao na inicializacao (systemd)
journalctl -u systemd-sysctl

Resumo e próximas leituras

Com sysctl, três padrões cobrem a maioria do trabalho real: ler com sysctl <key>, alterar temporariamente com -w, e persistir com /etc/sysctl.d/ mais --system. Valide com uma alteração em tempo de execução antes de persistir, e sempre leia o valor de volta depois, e você evitará a maioria das surpresas.