Ajuste del Kernel Linux para Servidores Web
Los servidores web de alto rendimiento modernos requieren ajuste cuidadoso a nivel de kernel para manejar millones de conexiones concurrentes y entregar tiempos de respuesta consistentes. Los parámetros del kernel de Linux impactan directamente el manejo de conexiones, gestión de memoria y rendimiento de red. Esta guía cubre parámetros esenciales de ajuste de kernel para optimización de servidores web.
Tabla de Contenidos
- Optimización de Pila de Red TCP
- Parámetros de Manejo de Conexión
- Ajuste de Búfer y Memoria
- Optimización de Dispositivo de Red
- Ajuste Específico del Balanceador de Carga
- Monitoreo de Métricas del Kernel
- Configuración Persistente
- Conclusión
Optimización de Pila de Red TCP
Dimensionamiento de Búfer TCP
# Ver configuración actual de búfer TCP
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
# Formato de salida: min default max
# Por defecto: 4096 131072 6291456 (4KB, 128KB, 6MB)
# Optimizar para servidores web (aumentar defaults para alto rendimiento)
sudo sysctl -w net.ipv4.tcp_rmem='4096 65536 2097152' # 2MB max lectura
sudo sysctl -w net.ipv4.tcp_wmem='4096 65536 2097152' # 2MB max escritura
# Para escenarios de alto rendimiento
sudo sysctl -w net.ipv4.tcp_rmem='4096 262144 8388608' # 8MB max
sudo sysctl -w net.ipv4.tcp_wmem='4096 262144 8388608' # 8MB max
# Configuración de búfer de socket
sudo sysctl -w net.core.rmem_default=131072
sudo sysctl -w net.core.wmem_default=131072
sudo sysctl -w net.core.rmem_max=8388608
sudo sysctl -w net.core.wmem_max=8388608
Escalado de Ventana TCP
# Habilitar escalado de ventana TCP (permite ventanas más grandes)
sudo sysctl -w net.ipv4.tcp_window_scaling=1
# Habilitar para redes rápidas (latencia alta * ancho de banda alto)
# Soporta ventanas más grandes de 64KB
# Ver tamaño actual de ventana
cat /proc/sys/net/ipv4.tcp_window_scaling
Marcas de Tiempo TCP y SACK
# Habilitar marcas de tiempo TCP (mejora rendimiento)
sudo sysctl -w net.ipv4.tcp_timestamps=1
# Habilitar ACK Selectivo (mejora recuperación de pérdida)
sudo sysctl -w net.ipv4.tcp_sack=1
# Habilitar Duplicate SACK (ayuda a identificar retransmisiones)
sudo sysctl -w net.ipv4.tcp_dsack=1
Parámetros de Manejo de Conexión
Límites de Cola de Conexión
# Número máximo de conexiones en escucha de backlog
sudo sysctl -w net.core.somaxconn=65535
# Límite de backlog por socket
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# Estos deben coincidir con parámetro de cola de escucha de su aplicación
# Verificar en configuración del servidor: parámetro backlog de escucha nginx/apache
Gestión de Socket TIME_WAIT
# Reutilizar sockets TIME_WAIT (importante para servidores de alta tasa de conexión)
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# Permitir reconexiones rápidas desde la misma IP
sudo sysctl -w net.ipv4.tcp_tw_recycle=0 # Usualmente deshabilitado, problemático con NAT
# Reducir duración de TIME_WAIT (por defecto 60 segundos)
# Control limitado vía kernel - gestionado por protocolo
# Puede usar opción de socket SO_LINGER desde aplicación
Reciclaje de Conexión
# Habilitar reciclaje rápido de sockets time-wait
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# Número de veces a reintentar antes de agotar tiempo
sudo sysctl -w net.ipv4.tcp_retries2=8
# Timeout inicial de SYN
sudo sysctl -w net.ipv4.tcp_syn_retries=3
Ajuste de Búfer y Memoria
Configuración de Búfer UDP
# Búfer de lectura UDP (para aplicaciones que usan UDP)
sudo sysctl -w net.ipv4.udp_rmem_min=4096
sudo sysctl -w net.ipv4.udp_rmem_default=131072
# Búfer de escritura UDP
sudo sysctl -w net.ipv4.udp_wmem_min=4096
sudo sysctl -w net.ipv4.udp_wmem_default=131072
Gestión de Memoria
# Tamaño máximo de búfer de recepción de socket en todo el sistema
sudo sysctl -w net.core.rmem_max=134217728 # 128MB
# Tamaño máximo de búfer de escritura de socket en todo el sistema
sudo sysctl -w net.core.wmem_max=134217728 # 128MB
# Tamaño de búfer de backlog por defecto
sudo sysctl -w net.core.netdev_max_backlog=65535
Optimización de Dispositivo de Red
Búferes de Anillo
# Verificar configuración actual de búfer de anillo
ethtool -g eth0
# Aumentar búferes de anillo para tráfico alto
sudo ethtool -G eth0 rx 4096 tx 4096
# Configuración persistente (Ubuntu/Debian)
cat >> /etc/network/interfaces <<'EOF'
post-up ethtool -G eth0 rx 4096 tx 4096
EOF
# O con netplan
cat > /etc/netplan/99-ring-buffer.yaml <<'EOF'
network:
version: 2
ethernets:
eth0:
dhcp4: true
set-name: eth0
EOF
# Aplicar cambios
sudo netplan apply
Opciones de Descarga
# Verificar configuración actual de descarga
ethtool -k eth0
# Habilitar características de descarga (si es compatible)
sudo ethtool -K eth0 gso on # Generic Segmentation Offload
sudo ethtool -K eth0 gro on # Generic Receive Offload
sudo ethtool -K eth0 tso on # TCP Segmentation Offload
sudo ethtool -K eth0 lro off # Large Receive Offload (usualmente deshabilitado)
# Configuración de descarga persistente
cat > /etc/systemd/system-sleep/ethtool.service <<'EOF'
[Unit]
Description=Configure ethtool
Before=network.target
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -K eth0 gso on gro on tso on
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable ethtool.service
Ajuste Específico del Balanceador de Carga
Rango de Puerto de Conexión
# Extender rango de puerto efímero (para muchas conexiones salientes)
sudo sysctl -w net.ipv4.ip_local_port_range='1024 65535'
# Para casos extremos
sudo sysctl -w net.ipv4.ip_local_port_range='1024 65000'
# Ver rango actual
cat /proc/sys/net/ipv4/ip_local_port_range
Keepalive de TCP
# Tiempo de keepalive (cuánto esperar antes de enviar sonda de keepalive)
sudo sysctl -w net.ipv4.tcp_keepalive_time=600
# Intervalo de keepalive (con qué frecuencia reintentar)
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=60
# Número de sondas antes de descartar conexión
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3
Manejo de FIN
# Permitir reutilización de puertos en estado FIN_WAIT
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# Reducir timeout de FIN para limpieza de recursos más rápida
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
Monitoreo de Métricas del Kernel
Monitoreo de Estadísticas de Red
# Estadísticas de red en tiempo real
watch -n 1 'cat /proc/net/dev'
# Estadísticas detalladas de IP
cat /proc/net/netstat
# Monitorear estados de conexión TCP
watch -n 1 'ss -tan | tail -1'
# Contar conexiones por estado
ss -tan | grep -oE '[A-Z]+' | sort | uniq -c
# Monitorear uso de búfer de socket
cat /proc/net/sockstat
Diagnóstico de Conexión
# Verificar acumulación de TIME_WAIT
ss -tan | grep TIME-WAIT | wc -l
# Identificar riesgo de agotamiento de puerto
cat /proc/sys/net/ipv4/ip_local_port_range
netstat -tan | grep :80 | wc -l
# Monitorear backlog de SYN
watch -n 1 'grep TCPBacklogDrop /proc/net/netstat'
# Verificar conexiones descartadas
grep -E "TCPListen|TCPDrop" /proc/net/netstat
Configuración Persistente
Archivo de Configuración sysctl
# Crear configuración persistente
sudo tee /etc/sysctl.d/99-webserver-tuning.conf > /dev/null <<'EOF'
# Optimización de Búfer TCP
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
# Manejo de Conexión
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# Optimización de TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
# Parámetros de Rendimiento
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1
# Configuración de Memoria
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.core.netdev_max_backlog = 65535
# Timeouts de TCP
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3
# Rango de Puerto
net.ipv4.ip_local_port_range = 1024 65535
EOF
# Aplicar configuración
sudo sysctl -p /etc/sysctl.d/99-webserver-tuning.conf
# Verificar aplicación
sysctl -a | grep net.ipv4.tcp_rmem
Validación y Pruebas
# Antes de aplicar ajuste
ab -n 10000 -c 1000 http://example.com/
# Aplicar ajuste
sudo sysctl -p /etc/sysctl.d/99-webserver-tuning.conf
# Después de ajuste - comparar resultados
ab -n 10000 -c 1000 http://example.com/
# Probar con carga realista
wrk -t 4 -c 1000 -d 30s http://example.com/
Conclusión
El ajuste del kernel de Linux impacta directamente el rendimiento del servidor web, permitiendo a los sistemas manejar tráfico más alto, reducir latencia y utilizar hardware eficientemente. Al configurar cuidadosamente búferes TCP, límites de conexión y parámetros de dispositivo de red, las organizaciones optimizan infraestructura para características de carga de trabajo específicas. El monitoreo regular de métricas del kernel detecta degradación y guía optimización adicional. Combinado con ajuste a nivel de aplicación y planificación de infraestructura, la optimización de kernel asegura que los servidores web entreguen servicio receptivo y confiable bajo cargas de producción demandantes.


