Explorando a Precedência de Carregamento de Parâmetros sysctl no Kernel do KylinOS v10

Ao preparar sistemas para ambientes de produção, como a implantação de clusters Kubernetes em plataformas como o KylinOS Advanced Server V10, a otimização dos parâmetros do kernel é uma etapa fundamental. Contudo, essa tarefa rotineira pode revelar nuances inesperadas na forma como o sistema operacional carrega e aplica essas configurações, levando a cenários onde os ajustes desejados não são efetivados.

O Desafio Inicial com sysctl

Durante a configuração inicial de um nó para Kubernetes, é comum definir uma série de parâmetros de kernel para garantir o desempenho e a estabilidade. Um arquivo como /etc/sysctl.d/k8s_tuning.conf pode ser criado com configurações essenciais, como:

# /etc/sysctl.d/k8s_tuning.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
vm.overcommit_memory = 1
vm.swappiness = 0
fs.file-max = 2097152

Após criar esse arquivo, o comando usual para aplicar as mudanças é sysctl -p. No entanto, uma verificação rápida de um parâmetro crucial, como net.ipv4.ip_forward, pode revelar que o valor permanece inalterado:

sysctl -p
cat /proc/sys/net/ipv4/ip_forward
# Saída esperada: 1, mas pode retornar: 0

Essa discrepância ocorre porque sysctl -p, sem argumentos adicionais, carrega apenas o arquivo /etc/sysctl.conf. Se /etc/sysctl.conf contiver uma configuração para net.ipv4.ip_forward = 0, ela irá sobrescrever quaisquer definições anteriores que não foram explicitamente carregadas via sysctl -p /caminho/do/arquivo.conf.

A Ordem Completa de Carregamento Após Reinício

A questão principal que surge é: qual é a ordem real de carregamento dos parâmetros do kernel quando o sistema é reiniciado? A compreensão dessa sequência é vital para garantir que as otimizações persistam e sejam aplicadas corretamente.

Serviços Envolvidos no Carregamento de Parâmetros

No KylinOS V10 (e em outras distribuições baseadas em systemd), dois serviços principais gerenciam o carregamento de parâmetros do kernel na inicialização:

  • systemd-sysctl.service: Responsável por aplicar configurações sysctl durante a fase de inicialização do sistema.
  • tuned.service: Um daemon de ajuste dinâmico do sistema que otimiza o kernel e outros componentes com base em perfis pré-definidos ou personalizados.

É possível verificar o status desses serviços:

systemctl status systemd-sysctl.service
systemctl status tuned.service

Geralmente, systemd-sysctl.service é estático (acionado implicitamente) e tuned.service pode ser habilitado ou desabilitado para inicialização automática.

Hierarquia de Carregamento de Arquivos por systemd-sysctl.service

O systemd-sysctl.service lê configurações de diversos locais, seguindo uma ordem específica de precedência para diretórios e nomes de arquivo:

  • /run/sysctl.d/*.conf
  • /etc/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf
  • /etc/sysctl.conf (carregado por último por este serviço)

As regras de precedência são:

  1. Arquivos com o mesmo nome em diretórios diferentes são resolvidos pela precedência do diretório (/etc > /run > /usr/local/lib > /usr/lib > /lib). Ou seja, um arquivo em /etc/sysctl.d/my.conf tem precedência sobre /usr/lib/sysctl.d/my.conf.
  2. Dentro de cada diretório, os arquivos são processados em ordem lexicográfica (alfabética). É uma prática comum prefixar arqiuvos com números (ex: 10-myapp.conf, 99-custom.conf) para controlar a ordem de carregamento.
  3. O arquivo /etc/sysctl.conf é sempre processado por último pelo systemd-sysctl.service. Isso significa que quaisquer parâmetros definidos nele sobrescreverão valores conflitantes de todos os arquivos *.conf lidos anteriormente por este serviço.

Exemplo de ordem de carregamento pelo systemd-sysctl.service:

Considerando arquivos como:

  • /usr/lib/sysctl.d/10-default.conf
  • /etc/sysctl.d/50-k8s.conf
  • /usr/lib/sysctl.d/90-system.conf
  • /etc/sysctl.conf

A sequência provável de carregamento seria: 10-default.conf50-k8s.conf90-system.conf/etc/sysctl.conf. Note que a precedência de diretório afeta arquivos com o mesmo nome, mas para nomes distintos, a ordem lexicográfica e o carregamento final de /etc/sysctl.conf ditam a prioridade.

Hierarquia de Carregamenot de Arquivos por tuned.service

Se o tuned.service estiver habilitado, ele é executado após o systemd-sysctl.service. O tuned opera com base em perfis que podem otimizar o sistema para diferentes cargas de trabalho (ex: virtual-guest, throughput-performance, balanced).

  1. O perfil ativo pode ser verificado com tuned-adm active.
  2. Cada perfil corresponde a um arquivo de configuração, como /usr/lib/tuned/virtual-guest/tuned.conf.
  3. Após carregar seu perfil específico, o serviço tuned executa internamente sysctl --system. Este comando, por sua vez, reprocessa todos os arquivos sysctl nas localizações padrão (similar ao systemd-sysctl.service, mas em um estágio posterior da inicialização).

Isso significa que as configurações do tuned, e as subsequentes aplicações via sysctl --system, podem sobrescrever quaisquer parâmetros definidos anteriormente pelo systemd-sysctl.service.

Um exemplo da saída de sysctl --system, mostrando a ordem de aplicação:

sysctl --system | grep "Aplicando"
# Aplicando /usr/lib/sysctl.d/10-default-yama-scope.conf ...
# Aplicando /usr/lib/sysctl.d/50-default.conf ...
# Aplicando /etc/sysctl.d/99-custom-k8s.conf ...
# Aplicando /usr/lib/sysctl.d/kylin_optimizations.conf ...
# Aplicando /etc/sysctl.conf ...

Nesse exemplo, as configurações são aplicadas sequencialmente, com os últimos valores para um dado parâmetro prevalecendo.

Carregamento Manual de Configurações sysctl

Para aplicar um arquivo sysctl específico a qualquer momento, use:

sysctl -p /caminho/do/seu/arquivo.conf

Isso permite um controle granular, mas é importante lembrar que estas são mudanças temporárias que podem ser sobrescritas na próxima inicialização ou por outros processos do sistema, dependendo da ordem de precedência.

Observações Específicas para KylinOS

No KylinOS, há um arquivo de configuração de parâmetros do kernel pré-existente em /usr/lib/sysctl.d/kylin.conf (ou similar, como kylin_optimizations.conf). Este arquivo já contém otimizações de fábrica e, devido à sua localização e possível ordem de carregamento, ele pode interagir com suas próprias configurações personalizadas.

Para garantir que suas configurações prevaleçam, considere as seguintes abordagens:

  1. Crie seus próprios arquivos de configuração em /etc/sysctl.d/ com um nome que garanta o carregamento após kylin.conf, como 99-meus-ajustes.conf.
  2. Diretamente modifique o arquivo /etc/sysctl.conf, pois ele é geralmente o último a ser processado pelo systemd-sysctl.service (e pelo sysctl --system invocado pelo tuned).
  3. (Menos recomendável) Edite diretamente /usr/lib/sysctl.d/kylin.conf. Esta opção pode ser desfeita por atualizações do sistema.

Síntese das Prioridades de Carregamento

  • O serviço tuned.service (se habilitado) executa suas otimizações e invoca sysctl --system após o systemd-sysctl.service inicial ter processado seus arquivos.
  • A regra fundamental é: o último valor carregado para um parâmetro do kernel é o que prevalece.
  • Arquivos em /etc/sysctl.d/ têm precedência sobre arquivos com o mesmo nome em /usr/lib/sysctl.d/.
  • A ordem de processamento dentro dos diretórios sysctl.d é lexicográfica (alfabética). Use prefixos numéricos para controlar a sequência.
  • O arquivo /etc/sysctl.conf é carregado por último em ambos os cenários de serviço (systemd-sysctl e tuned através de sysctl --system), conferindo-lhe a prioridade final.
  • Lembre-se da existência e do impacto de arquivos de configuração específicos do sistema, como /usr/lib/sysctl.d/kylin.conf no KylinOS.

Tags: KylinOS sysctl kernel parameters systemd tuned

Publicado em 6-18 20:55