🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Optimización de Rendimiento con Kernel Tuning

Actualizado el 21 de septiembre de 2025

El rendimiento de un servidor Linux no depende únicamente del hardware subyaciente o de la aplicación que ejecuta. El kernel actúa como el orquestador central de todos los recursos del sistema: CPU, memoria, almacenamiento y red. Un kernel mal configurado puede generar cuellos de botella invisibles, latencia innecesaria y un uso ineficiente de los recursos. A esto se le conoce como kernel tuning, una disciplina esencial para cualquier sysadmin que busque la máxima eficiencia, especialmente en entornos de producción de alta demanda.

En este artículo, exploraremos las técnicas más avanzadas y prácticas de kernel tuning para 2025, utilizando herramientas como sysctl, ulimit, y configuraciones específicas de planificadores. No se trata de aplicar cambios aleatorios, sino de entender qué parámetros ajustar según la carga de trabajo de tu servidor (bases de datos, servidores web, balanceadores, etc.).

Fundamentos del Kernel Tuning: El Rol de /proc y sysctl

El kernel de Linux expone miles de parámetros de configuración a través del sistema de archivos virtual /proc/sys/. La herramienta principal para modificarlos de forma segura y persistente es sysctl.

El proceso de kernel tuning consiste en:

  1. Identificar el cuello de botella: CPU, memoria, I/O o red.
  2. Medir el estado actual: Usar herramientas como vmstat, iostat, sar, perf y ss.
  3. Ajustar parámetros: Modificar valores en /etc/sysctl.conf o archivos en /etc/sysctl.d/.
  4. Validar el impacto: Volver a medir y comparar.

[WARNING] Nunca apliques cambios de kernel tuning en producción sin antes probarlos en un entorno de staging. Un parámetro incorrecto (por ejemplo, un vm.swappiness demasiado bajo) puede causar inestabilidad o OOM (Out Of Memory) Killer.

Parámetros Clave de Memoria y Swap

La gestión de la memoria es uno de los primeros lugares donde un sysadmin debe intervenir.

  • vm.swappiness (0-100): Controla la tendencia del kernel a mover procesos inactivos a la zona de swap.

    • Servidores web/cache (alto rendimiento): vm.swappiness = 1 (casi nunca swappear).
    • Workstations/desarrollo: vm.swappiness = 60 (valor por defecto).
    • Bases de datos: vm.swappiness = 0 o 1 (evitar latencia de swap).
    # Ejemplo para servidor de base de datos
    echo "vm.swappiness = 1" >> /etc/sysctl.d/99-tuning.conf
    sysctl -p /etc/sysctl.d/99-tuning.conf
    
  • vm.dirty_ratio / vm.dirty_background_ratio: Controlan cuándo se escriben los datos sucios en disco.

    • vm.dirty_background_ratio (por defecto 10%): Porcentaje de memoria total que, al llenarse de datos sucios, activa el proceso pdflush en segundo plano.
    • vm.dirty_ratio (por defecto 20%): Porcentaje máximo antes de que los procesos que escriben se bloqueen.
    • Para servidores de archivos (NFS/Samba): Aumentar dirty_ratio a 40% puede mejorar el rendimiento de escritura.
    • Para bases de datos (PostgreSQL/MySQL): Mantener dirty_ratio bajo (15%) para evitar picos de I/O.
# Ajuste para servidor de archivos con mucha escritura
vm.dirty_background_ratio = 5
vm.dirty_ratio = 30

Ajuste del Planificador de CPU y Gestión de Interrupciones

El planificador de CPU determina qué proceso se ejecuta y durante cuánto tiempo. En servidores modernos, el planificador más común es CFS (Completely Fair Scheduler) y, desde kernels 6.x, el EEVDF (Earliest Eligible Virtual Deadline First) en algunos casos.

Parámetros Relevantes via sysctl (No todos son ajustables directamente, pero sí via cgroups)

Aunque el planificador se configura principalmente con chrt (prioridades en tiempo real) o cgroups, hay parámetros globales importantes:

  • kernel.sched_migration_cost_ns: Tiempo que un proceso inactivo se considera "cacheado" en una CPU. Reducirlo (a 500000) puede mejorar el balanceo de carga en servidores NUMA.
  • kernel.sched_autogroup_enabled: Deshabilitarlo (=0) en servidores de bases de datos puede evitar que el kernel agrupe procesos de forma incorrecta, mejorando la predecibilidad.

Afinidad de Interrupciones (IRQ Balancing)

Para servidores con múltiples núcleos (especialmente en redes 10G/40G), las interrupciones de la tarjeta de red deben distribuirse entre las CPUs.

# Ver la afinidad actual de una IRQ (ejemplo: eth0)
cat /proc/irq/84/smp_affinity

# Asignar la IRQ a la CPU 0 (máscara 00000001)
echo 1 > /proc/irq/84/smp_affinity

[TIP] Usa irqbalance (servicio) para distribuir automáticamente las interrupciones. En servidores muy específicos, deshabilitarlo y asignar manualmente las IRQs a núcleos dedicados puede dar un 5-10% más de rendimiento de red.

Optimización de Red: El Stack TCP/IP

El rendimiento de red es crítico para servidores web, APIs y microservicios. La pila TCP/IP del kernel tiene decenas de parámetros que pueden marcar la diferencia entre una conexión lenta y una ultrarrápida.

Parámetros para Alta Concurrencia

  • net.core.somaxconn: Máximo número de conexiones en cola (backlog). Aumentar a 1024 o 4096 para servidores con muchas conexiones entrantes (Nginx, Apache).
  • net.ipv4.tcp_fastopen: Habilita TFO (TCP Fast Open). Reduce la latencia en un RTT (Round Trip Time). Valor recomendado: 3 (habilitado para cliente y servidor).
  • net.ipv4.tcp_tw_reuse: Permite reutilizar sockets en estado TIME_WAIT para nuevas conexiones. CRÍTICO para servidores que hacen muchas conexiones salientes (proxies, balanceadores).
  • net.ipv4.tcp_keepalive_time / tcp_keepalive_intvl / tcp_keepalive_probes: Ajusta el tiempo de keepalive para detectar conexiones muertas más rápido.

Configuración Recomendada para un Servidor Web de Alto Tráfico

# /etc/sysctl.d/99-networking.conf

# Aumentar buffers de red (en bytes)
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

# Ajustar buffers TCP automáticos (mínimo, default, máximo)
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# Habilitar escalado de ventana TCP (necesario para buffers grandes)
net.ipv4.tcp_window_scaling = 1

# Cola de conexiones
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# Reutilización de TIME_WAIT
net.ipv4.tcp_tw_reuse = 1

# Fast Open
net.ipv4.tcp_fastopen = 3

# Keepalives agresivos
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3

[INFO] El parámetro net.ipv4.tcp_tw_recycle fue eliminado en kernels modernos (5.x+) porque causaba problemas con NAT. No lo uses.

Ajustes de I/O: Planificadores y Elevadores

El planificador de I/O (elevator) decide el orden en que se envían las solicitudes de lectura/escritura al disco. En la era de los SSD NVMe, el planificador ideal suele ser none (ninguno) o mq-deadline.

Cómo Cambiar el Planificador

# Ver planificador actual por disco
cat /sys/block/nvme0n1/queue/scheduler

# Cambiar a 'none' para NVMe
echo none > /sys/block/nvme0n1/queue/scheduler

# Hacerlo persistente (ejemplo con udev o grub)
# En /etc/default/grub añadir: elevator=noop

Parámetros de I/O via sysctl

  • vm.dirty_writeback_centisecs: Frecuencia (en centésimas de segundo) con la que despierta el demonio pdflush. Reducir a 100 (1 segundo) para servidores de bases de datos.
  • vm.vfs_cache_pressure: Controla la tendencia del kernel a reclamar memoria de la caché de inodos/dentry. Un valor bajo (50) mantiene más caché de directorios, útil para servidores de archivos.
# Para servidor de archivos con muchos archivos pequeños
vm.vfs_cache_pressure = 50

Limitaciones de Recursos: ulimit y systemd

El kernel tuning no solo se trata de parámetros globales. También debemos ajustar los límites por proceso para evitar que una aplicación maliciosa o mal configurada agote los recursos.

Límites Esenciales

  • nofile (Número de archivos abiertos): Un servidor web puede necesitar 100.000+ archivos abiertos.
  • nproc (Número de procesos): Especialmente para servidores que lanzan muchos procesos hijos (ej: Apache prefork).
  • memlock (Memoria bloqueada): Necesario para bases de datos como PostgreSQL o Redis para evitar que su memoria sea swappeada.
# En /etc/security/limits.conf
*               soft    nofile          1048576
*               hard    nofile          1048576
*               soft    nproc           unlimited
*               hard    nproc           unlimited

Para sistemas con systemd (prácticamente todos en 2025), los límites se configuran en el archivo de servicio:

[Service]
LimitNOFILE=1048576
LimitNPROC=infinity
LimitMEMLOCK=infinity

Monitoreo y Validación del Tuning

Aplicar cambios sin medir es como conducir con los ojos cerrados. Herramientas esenciales para el sysadmin moderno:

  • sysctl -a | grep <param>: Lista todos los parámetros actuales.
  • stress o stress-ng: Para simular cargas de CPU, memoria, I/O y red.
  • perf top: Para ver qué funciones del kernel consumen más CPU.
  • bcc (BPF Compiler Collection): Herramientas como tcplife, biotop, runqlat para análisis profundo.

Ejemplo de Validación de Red

# Antes del tuning
ab -n 10000 -c 100 http://localhost/

# Después del tuning
# Repetir el test y comparar Requests per second (RPS) y Time per request

[TIP] Crea un script de baseline que capture todos los parámetros relevantes (sysctl -a, ulimit -a, cat /sys/block/*/queue/scheduler) antes de cualquier cambio. Esto te permitirá revertir fácilmente.

Conclusión: El Tuning como Proceso Continuo

La optimización de rendimiento con kernel tuning no es una tarea de "configurar y olvidar". Es un proceso iterativo que debe adaptarse a la evolución de las cargas de trabajo, las actualizaciones del kernel y el hardware. Un sysadmin en 2025 debe dominar estas técnicas para exprimir cada ciclo de CPU, cada byte de RAM y cada operación de I/O.

Recuerda siempre:

  1. Documenta cada cambio.
  2. Mide antes y después.
  3. Prioriza la estabilidad sobre el rendimiento absoluto.

El kernel de Linux es increíblemente flexible; solo necesitas saber qué palancas mover y cuándo. Empieza por ajustar swappiness y los buffers de red, y verás cómo tu servidor respira mejor.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel