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 comsysctl -a) - Alteração em tempo de execução ->
sudo sysctl -w key=value(perdido ao reiniciar) - Persistir -> escreva
/etc/sysctl.d/99-custom.conf, depoissudo sysctl --system
Premissas (ambiente alvo)
- Distribuições baseadas em systemd como Ubuntu 22.04 / 24.04 ou RHEL 9
- Pacote:
sysctl(8)incluído noprocps(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 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 (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=valueaplica 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 comsudo sysctl --system; drop-ins são preferidos em vez de editar/etc/sysctl.confdiretamente.
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 lê *.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:
- 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.conffacilita a sobrescrita. - 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 |
Não cole um "exemplo de tuning" inteiro sem entender cada parâmetro. Antes de aplicar em produção, valide o comportamento em staging com uma alteração temporária sysctl -w, depois persista apenas se tudo estiver bem.
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 -wprecisa desudo.Operation not permittedsignifica 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. 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