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

  1. Optimización de Pila de Red TCP
  2. Parámetros de Manejo de Conexión
  3. Ajuste de Búfer y Memoria
  4. Optimización de Dispositivo de Red
  5. Ajuste Específico del Balanceador de Carga
  6. Monitoreo de Métricas del Kernel
  7. Configuración Persistente
  8. 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.