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 comsysctl -a) - Alteracao em tempo de execucao ->
sudo sysctl -w key=value(perdido ao reiniciar) - Persistir -> escreva
/etc/sysctl.d/99-custom.conf, depoissudo sysctl --system
Premissas (ambiente alvo)
- Distribuicoes baseadas em systemd como Ubuntu 22.04 / 24.04 ou RHEL 9
- Pacote:
sysctl(8)incluido noprocps(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 esysctl -apara tudo; adicione-npara 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=valueaplica 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 comsudo sysctl --system; drop-ins sao preferidos em vez de editar/etc/sysctl.confdiretamente.
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:
- 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.conffacilita a sobrescrita. - 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 |
Nao cole um "exemplo de tuning" inteiro sem entender cada parametro. Antes de aplicar em producao, valide o comportamento em staging com uma alteracao temporaria sysctl -w, depois persista apenas se tudo estiver bem.
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 -wprecisa desudo.Operation not permittedsignifica 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. Usesysctl -epara ignorar erros de chave desconhecida e encontre o nome correto comsysctl -a | grep.
# Verificar o log de aplicacao na inicializacao (systemd) journalctl -u systemd-sysctl