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
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:
Já para HDs:
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
. Okexec
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.