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.

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.