Otimizando Debian com base no CachyOS?

Este post é uma continuação do artigo “Otimizando meu Debian 12 para trabalho“.

Nele eu usei o que já é meio “batido” no mundo linux para otimizar sua máquina.

Tipo, configurar zram, preload, ajustar o uso da memória via sysctl… Enfim, neste artigo eu quero expandir a otimização trazendo alguns ajustes realizados pela distro CachyOS.

Recomendo fortemente conferir a documentação desta distro. Assim como o Arch, o CachyOS tem uma documentação bem interessante.

Sem mais, vamos as otimizações.

Otimizando regras udev e sysctl no Debian 12 com base no CachyOS

Otimizando Debian com base no CachyOS

Adicionei 3 regras udev do CachyOS em meu Debian 12. A primeira delas é esta da imagem acima.

Esta regra desativa o gerenciamento de energia e o standby automático em todos os discos rígidos (HDDs) conectados via barramento ATA/SATA no sistema.

Isso é feito para evitar que os discos entrem em modo de suspensão ou economia de energia, o que pode causar atrasos (latência) na primeira vez que são acessados após um período de inatividade.

Além desta regra, criei mais duas seguindo o exemplo vindo do CachyOS

69-hdparm.rules 
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTRS{id/bus}=="ata", RUN+="/usr/bin/hdparm -B 254 -S 0 /dev/%k"

50-sata.rules 
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}=="*", ATTR{link_power_management_policy}="max_performance"

60-ioschedulers.rules 
# HDD
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

# SSD
ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"

# NVMe SSD
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

Bastar criar os arquivos em /etc/udev/rules.d com seus respectivos nomes (sata.rules, ioschedulers.rules e hdparm.rules) e rodar os comandos para recarregar as regras udev

udevadm control --reload-rules
udevadm trigger

Feito!

Explicação das demais otimizações

1. hdparm.rules

Já explicada no tópico anterior

2. sata.rules

Desativa economia de energia em dispositivos sata que possuam gerenciamento.

Além disso, define a política de gerenciamento de energia para alto desempenho (max_performance)

3. ioschedulers.rules

As regras definidas neste arquivo fazem com que o melhor gerenciador de input/output seja definido para cada dispositivo de armazenamento.

Ou seja, ao detectar um SSD, a regra definirá para ele o agendador mq-deadline. Você pode conferir em:

agendador mq-deadline para ssd

Já para HDs:

agendador de io para HDs é o bfq

Com esta regra, saímos do padrão que vem sendo adotado independente do seu dispositivo de armazenamento.

Não que usar mq-deadline para um HD seja ruim, mas não é a maneira mais otimizada de usá-lo.

Alterando as configurações em Sysctl

Praticamente um “copia e cola” do arquivo feito pelo time do CachyOS com algumas pequenas alterações para meu cenário.

Criei o arquivo /etc/sysctl.d/99-sysctl.conf

# Gerenciamento de Memória
vm.swappiness = 100
vm.vfs_cache_pressure = 50
vm.dirty_background_bytes = 268435456
vm.dirty_bytes = 536870912
vm.dirty_writeback_centisecs = 1500
vm.page-cluster = 0

# Desempenho e Segurança
kernel.nmi_watchdog = 0
kernel.unprivileged_userns_clone = 1
kernel.printk = 3 3 3 3
kernel.kptr_restrict = 2
kernel.kexec_load_disabled = 1

# Rede
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_rmem=4096 87380 8388608
net.ipv4.tcp_wmem=4096 65536 8388608

# NFS

sunrpc.tcp_slot_table_entries=128
sunrpc.udp_slot_table_entries=128
fs.nfs.nlm_tcpport=0
fs.nfs.nlm_udpport=0

Pedi para o chatgpt explicar o que faz cada uma das opções acima. Confira abaixo:

vm.swappiness = 100

  • Análise: Esta configuração controla a tendência do kernel de usar o espaço de swap. Um valor alto (como 100) significa que o kernel usará o swap de forma mais agressiva.
  • Efeito: Isso pode ser útil em sistemas com muita memória RAM ou para carregar dados que não são acessados com frequência para o swap, liberando a RAM para dados mais ativos.

    No entanto, um valor de 100 pode levar a um uso excessivo do swap e lentidão em sistemas com pouca RAM.

    O valor padrão geralmente é 60. Para a maioria dos usuários de desktop, um valor mais baixo (como 10 ou 20) é preferível para evitar o swap, a menos que você tenha um SSD rápido.

vm.vfs_cache_pressure = 50

  • Análise: Controla a preferência do kernel para liberar a memória usada para inodes e dentries (o cache de diretórios).

    Um valor padrão de 100 significa que o kernel tentará liberar esse cache agressivamente.
  • Efeito: Reduzir para 50 faz com que o kernel seja menos propenso a liberar a memória do cache de diretórios.

    Isso pode melhorar o desempenho em sistemas que acessam muitos arquivos, pois os metadados do sistema de arquivos permanecem na memória por mais tempo, reduzindo o acesso ao disco.

vm.dirty_bytes = 268435456

  • Análise: Define a quantidade máxima de memória que pode ser usada para armazenar dados “sujos” (dirty), ou seja, dados que foram alterados na RAM, mas ainda não foram gravados no disco.

    O valor é em bytes. 268435456 bytes equivalem a 256 MB.
  • Efeito: Em vez de usar um percentual do total de RAM (vm.dirty_ratio), essa configuração usa um valor absoluto.

    Isso ajuda a manter uma quantidade constante de dados sujos antes de iniciar a gravação, o que pode ser bom para sistemas com muita RAM, evitando que a gravação em disco seja iniciada muito cedo e criando um gargalo.

vm.page-cluster = 0

  • Análise: Controla o número de páginas contíguas que o kernel tentará ler do disco durante uma operação de “leitura adiantada” (readahead).

    Um valor de 0 indica que o kernel lerá apenas uma página por vez.
  • Efeito: O valor padrão é 3. Mudar para 0 pode ser uma otimização específica para SSDs e dispositivos de memória flash, pois eles têm latência de busca muito baixa e não se beneficiam da leitura de blocos grandes, que é otimizada para HDDs. Para HDDs, um valor maior pode ser mais eficiente.

vm.dirty_writeback_centisecs = 1500

  • Análise: Define o intervalo (em centésimos de segundo) em que os dados sujos serão gravados no disco. O valor 1500 equivale a 15 segundos.
  • Efeito: O valor padrão é 500 (5 segundos). Aumentar para 15 segundos permite que os dados se acumulem mais na RAM antes de serem gravados, o que pode resultar em menos operações de gravação e, em teoria, em menos “escreve e apaga” no disco, melhorando o desempenho em certas cargas de trabalho.

kernel.nmi_watchdog = 0

  • Análise: Desativa o “NMI watchdog”. O watchdog NMI é um timer que monitora a capacidade de resposta do processador para detectar travamentos ou freezes.
  • Efeito: Desativá-lo pode diminuir ligeiramente o consumo de energia e a latência, pois o timer de monitoramento é desativado. No entanto, você perde a capacidade de diagnosticar um sistema que travou completamente.

    Em um sistema de desktop estável, isso geralmente é seguro.

kernel.unprivileged_userns_clone = 1

  • Análise: Permite que usuários sem privilégios criem namespaces de usuário.
  • Efeito: Essa configuração é crucial para o uso de tecnologias de virtualização e conteinerização como Docker, Podman e LXC.

    Se você usa esses aplicativos, essa configuração é essencial. No entanto, ela pode ter implicações de segurança se não for gerenciada corretamente.

kernel.printk = 3 3 3 3

  • Análise: Controla o nível de mensagens do kernel que são exibidas no console. Os quatro valores controlam diferentes níveis de gravidade.
  • Efeito: Esta configuração oculta a maioria das mensagens do kernel do console, tornando-o mais “limpo”. As mensagens ainda serão gravadas nos logs do sistema, como o journald.

kernel.kptr_restrict = 2

  • Análise: Restringe o acesso a endereços de ponteiros do kernel (kptr).
  • Efeito: Com o valor 2, ele oculta todos os endereços de ponteiro do kernel, mesmo para o usuário root. Isso é uma medida de segurança para dificultar a exploração de vulnerabilidades de segurança que dependem de encontrar a localização de certas partes do código do kernel.

kernel.kexec_load_disabled = 1

  • Análise: Desativa o recurso kexec_load. O kexec permite carregar um novo kernel a partir do kernel em execução, reiniciando o sistema sem passar pela inicialização completa da BIOS/UEFI.
  • Efeito: Desativar este recurso é uma medida de segurança contra ataques que visam carregar um kernel malicioso na memória.

net.core.netdev_max_backlog = 4096

  • Análise: Aumenta o tamanho da fila de recebimento de pacotes de rede. O valor padrão é 1000.
  • Efeito: Um valor maior pode ajudar a evitar a perda de pacotes em situações de tráfego de rede muito intenso. Isso é útil para servidores ou sistemas que lidam com muitas conexões de rede simultâneas.

A opção vm.swappiness = 100 é bem diferente do que costumamos ver por ai na internet.

Geralmente vemos para definir um valor baixo, 10 por exemplo, para diminuirmos o uso do SWAP, que por usar disco é bem mais lento que a memória RAM.

Vou deixar por uns dias essa opção em 100 para ver se noto alguma diferença.

0 0 votos
Classificação do artigo
Inscrever-se
Notificar de

0 Comentários
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários
0
Adoraria saber sua opinião, comente.x