Linux: tuning de kernel com sysctl para alto tráfego
O kernel Linux vem configurado para uso geral — não para servidores web de alto tráfego. Com ajustes no sysctl e nos limites do sistema, você elimina gargalos invisíveis: conexões recusadas em picos de tráfego, file descriptors esgotados, buffers TCP subdimensionados e TIME_WAIT acumulado.
Configurações essenciais de rede no sysctl
Parâmetros críticos para servidores web e APIs:
# /etc/sysctl.d/99-vps-performance.conf
# ── Conexões TCP ───────────────────────────────────────────
# Backlog de conexões aguardando accept():
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# Reutilizar sockets em TIME_WAIT (evita esgotamento de portas):
net.ipv4.tcp_tw_reuse = 1
# Manter conexões keep-alive por menos tempo:
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# Timeout de FIN (reduzir TIME_WAIT):
net.ipv4.tcp_fin_timeout = 15
# ── Buffers de rede ────────────────────────────────────────
net.core.rmem_max = 134217728 # 128 MB — buffer receive máximo
net.core.wmem_max = 134217728 # 128 MB — buffer send máximo
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# Fila de pacotes de rede:
net.core.netdev_max_backlog = 250000
# ── Limites gerais ─────────────────────────────────────────
# File descriptors globais:
fs.file-max = 2097152
# Aplicar imediatamente:
sudo sysctl -p /etc/sysctl.d/99-vps-performance.conf
# Verificar valor atual de qualquer parâmetro:
sysctl net.core.somaxconnAumentar limites de file descriptors
Nginx e Node.js precisam de muitos file descriptors para conexões simultâneas:
# /etc/security/limits.conf — adicionar ao final:
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
# Para serviços systemd — override:
sudo mkdir -p /etc/systemd/system/nginx.service.d/
cat > /etc/systemd/system/nginx.service.d/limits.conf << 'EOF'
[Service]
LimitNOFILE=1048576
EOF
sudo mkdir -p /etc/systemd/system/node-app.service.d/
cat > /etc/systemd/system/node-app.service.d/limits.conf << 'EOF'
[Service]
LimitNOFILE=1048576
EOF
# Recarregar e verificar:
sudo systemctl daemon-reload
sudo systemctl restart nginx
# Ver limite atual do processo Nginx:
NGINX_PID=$(pgrep nginx | head -1)
cat /proc/$NGINX_PID/limits | grep "open files"
# Verificar uso de file descriptors em tempo real:
watch -n 1 "ls /proc/$NGINX_PID/fd | wc -l"Tuning do Nginx para alto tráfego
Configurações do Nginx que dependem do sysctl:
# /etc/nginx/nginx.conf
worker_processes auto; # um worker por CPU
worker_rlimit_nofile 1048576; # limite de files por worker
events {
worker_connections 65535; # máximo de conexões por worker
use epoll; # melhor performance no Linux
multi_accept on; # aceitar múltiplas conexões por ciclo
}
http {
# Keepalive entre Nginx e upstream (Node.js):
upstream nodejs {
server 127.0.0.1:3000;
keepalive 64; # pool de 64 conexões persistentes
}
server {
location / {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Connection ""; # necessário para keepalive
}
}
# Buffer de leitura do cliente:
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
# Enviar arquivos eficientemente (zero-copy):
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Keepalive com clientes:
keepalive_timeout 65;
keepalive_requests 10000;
}Monitorar e diagnosticar gargalos de rede
Ferramentas para identificar onde o sistema está travando:
# Conexões TCP por estado:
ss -s
# Ver sockets em TIME_WAIT (se acima de 10k: problema):
ss -tan state time-wait | wc -l
# Ver sockets em ESTABLISHED:
ss -tan state established | wc -l
# Estatísticas de erros TCP:
netstat -s | grep -E "failed|overflow|reject|retransmit"
# Overflow na fila de SYN:
netstat -s | grep "SYN to LISTEN"
# Se crescendo: aumentar net.ipv4.tcp_max_syn_backlog
# File descriptors em uso por processo:
ls /proc/$(pgrep node | head -1)/fd | wc -l
ls /proc/$(pgrep nginx | head -1)/fd | wc -l
# Monitorar throughput de rede em tempo real:
iftop -i eth0
# ou:
nethogs eth0
# Ver interrupções de CPU por NIC (IRQ affinity):
cat /proc/interrupts | grep ethBBR: algoritmo de congestionamento TCP moderno
Habilitar BBR para melhor throughput em conexões de longa distância:
# BBR (Bottleneck Bandwidth and Round-trip propagation time)
# Desenvolvido pelo Google — melhora throughput em redes com perda de pacotes
# Verificar se o kernel suporta (Linux 4.9+):
uname -r # deve ser 4.9+
# Habilitar BBR:
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/99-bbr.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/99-bbr.conf
sudo sysctl -p /etc/sysctl.d/99-bbr.conf
# Verificar se está ativo:
sysctl net.ipv4.tcp_congestion_control
# Deve retornar: net.ipv4.tcp_congestion_control = bbr
# Comparar algoritmos disponíveis:
sysctl net.ipv4.tcp_available_congestion_control
# BBR é especialmente benéfico para:
# - VPS em diferentes regiões geográficas
# - Usuários com conexões lentas ou instáveis
# - APIs com payloads grandes (uploads/downloads)
# - Streaming de dados via SSE ou WebSocket$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.