sysctl: Ajustando Parametros do Kernel no Linux

sysctl: Ajustando Parametros do Kernel no Linux

O que voce vai aprender

  • Como ler e alterar parametros do kernel com sysctl
  • Quando usar uma alteracao em tempo de execucao (sysctl -w) versus persistir via /etc/sysctl.d
  • Como diagnosticar por que uma configuracao nao entra em vigor (precedencia, momento do carregamento)

Resumo Rapido

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

Premissas (ambiente alvo)

  • Distribuicoes baseadas em systemd como Ubuntu 22.04 / 24.04 ou RHEL 9
  • Pacote: sysctl(8) incluido no procps (procps-ng)
  • Alterar parametros geralmente requer root (sudo)

O que e sysctl?

Conclusao: sysctl le e escreve os parametros ajustaveis do kernel em execucao atraves de /proc/sys/; os nomes das chaves mapeiam diretamente para essa arvore de diretorios.

sysctl le e escreve os parametros ajustaveis do kernel. Internamente, esses parametros sao arquivos no sistema de arquivos virtual /proc/sys/, e sysctl e um wrapper fino que os expoe em um formato amigavel key = value.

Pontos no nome da chave mapeiam diretamente para separadores de diretorio:

# 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 nivel superior sao:

Prefixo Area Parametros tipicos
net. Rede net.ipv4.ip_forward / net.core.somaxconn
vm. Memoria 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?

Conclusao: 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 (nao imprime o nome da chave). Isso e util em scripts shell que tomam decisoes com base em um valor.

sysctl -n vm.swappiness
60

Alguns parametros retornam "permission denied" para usuarios nao-root, entao sysctl -a pode ser incompleto. Execute sudo sysctl -a quando precisar da lista completa.

Como altero um valor temporariamente?

Conclusao: sudo sysctl -w key=value aplica instantaneamente mas e perdido ao reiniciar, o que o torna ideal para testes e validacao.

-w (write) altera o valor no kernel em execucao. 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 e uma alteracao temporaria. "Eu configurei mas sumiu depois de reiniciar" quase sempre significa que o valor nunca foi persistido. Para torna-lo permanente, siga a proxima secao.

Como torno uma alteracao permanente?

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

Persistencia significa escrever linhas key = value em um arquivo de configuracao. Em distribuicoes modernas com systemd, criar um arquivo drop-in em /etc/sysctl.d/ e preferido em vez de editar /etc/sysctl.conf diretamente, porque e mais facil de gerenciar e comparar.

Por convencao, nomeie o arquivo como NN-nome.conf (onde NN e um numero de dois digitos). O numero controla a precedencia (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 nao 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. Apos aplicar, leia o valor de volta com sysctl <key> e confirme que corresponde ao esperado.

sysctl vm.swappiness net.ipv4.ip_forward

Na inicializacao, systemd-sysctl.service aplica esses arquivos automaticamente, entao um valor persistido sobrevive a reinicializacoes.

Qual e a precedencia dos arquivos de configuracao?

Conclusao: Arquivos de varios diretorios sao mesclados em ordem lexicografica de nome de arquivo; para uma chave duplicada, o nome de arquivo lexicograficamente ultimo vence, e /etc/ sobrescreve arquivos com o mesmo nome em outros locais.

sysctl --system le *.conf destes diretorios:

Prioridade Diretorio Proposito
Alta /etc/sysctl.d/ Configuracoes personalizadas do admin
Media /run/sysctl.d/ Configuracoes geradas em tempo de exec
Baixa /usr/lib/sysctl.d/ Padroes enviados com pacotes

As regras sao duas:

  1. Arquivos sao mesclados em ordem lexicografica de nome de arquivo (comparados entre diretorios). Se a mesma chave aparece em multiplos arquivos, aquele no arquivo cujo nome ordena por ultimo (maior) vence. Por isso um numero alto como 99-custom.conf facilita a sobrescrita.
  2. Se o mesmo nome de arquivo existe em multiplos diretorios, 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 e lido, mas e o arquivo unico historico. Separar novas configuracoes em drop-ins (/etc/sysctl.d/*.conf) facilita rastrear de onde cada configuracao vem.

Parametros comuns com exemplos

Conclusao: Ajustes de memoria, rede e descritores de arquivo aparecem com mais frequencia na pratica; nunca copie valores cegamente sem entende-los.

Parametro Funcao Valor comum
vm.swappiness Agressividade do swap (0-100, menor favorece RAM) 10 em servidores de banco de dados
vm.overcommit_memory Politica de overcommit de memoria 1 para Redis, etc.
net.ipv4.ip_forward Encaminhamento de pacotes (necessario para roteadores/containers) 1
net.core.somaxconn Comprimento maximo da fila de aceitacao 4096 para servidores web ocupados
fs.file-max Limite de handles de arquivo do sistema Aumentar para servidores de alta conexao
fs.inotify.max_user_watches Limite de watches do inotify Aumentar para IDEs/ferramentas de build

Por que minha alteracao nao esta funcionando?

Conclusao: Verifique quatro coisas em ordem: permissoes, recarga esquecida, arquivo que sobrescreve e chave ausente.

  • Permissao insuficiente: sysctl -w precisa de sudo. Operation not permitted significa permissoes ou restricao de container (containers sem privilegios bloqueiam a maioria das escritas).
  • Esqueceu de recarregar: Escrever o arquivo nao e suficiente. Confirme que executou sudo sysctl --system (ou -p).
  • Sobrescrito por outro arquivo: Se um valor reverte, um arquivo lexicograficamente posterior esta 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 digitacao ou um modulo nao 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 proximas leituras

Com sysctl, tres padroes 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 alteracao em tempo de execucao antes de persistir, e sempre leia o valor de volta depois, e voce evitara a maioria das surpresas.