Ajustes del kernel con sysctl
Introducción
El kernel de Linux expone cientos de parámetros configurables en tiempo de ejecución a través del
pseudosistema de ficheros /proc/sys/. sysctl es la herramienta estándar para leer y
modificar esos parámetros sin necesidad de recompilar el kernel ni reiniciar el sistema.
/proc/sys — El origen de los parámetros
Cada parámetro del kernel es un fichero dentro de /proc/sys/. Los directorios reflejan la
jerarquía de los parámetros:
/proc/sys/
├── kernel/ ← parámetros del núcleo (hostname, panic, pid_max...)
├── net/ ← parámetros de red (ip_forward, tcp_syncookies...)
│ ├── ipv4/
│ └── ipv6/
├── vm/ ← gestión de memoria virtual (swappiness, dirty_ratio...)
└── fs/ ← sistemas de ficheros (file-max, inotify...)
Se puede leer o escribir directamente en estos ficheros, pero sysctl es la forma recomendada.
Leer parámetros
$ sysctl -a # listar todos los parámetros y sus valores
$ sysctl -a | grep swappiness # filtrar
$ sysctl vm.swappiness # leer un parámetro concreto
vm.swappiness = 60
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
La notación de sysctl usa puntos (vm.swappiness) mientras que la ruta en /proc/sys usa barras (/proc/sys/vm/swappiness). Son equivalentes.
Modificar parámetros en caliente
Los cambios con sysctl -w son inmediatos pero temporales: se pierden al
reiniciar el sistema.
# sysctl -w vm.swappiness=10
vm.swappiness = 10
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
# Equivalente escribiendo directamente en /proc/sys:
# echo 10 > /proc/sys/vm/swappiness
Hacer los cambios permanentes
Para que los valores persistan tras el reinicio, hay que añadirlos a los ficheros de configuración que systemd carga durante el arranque.
Fichero principal (válido en todas las distribuciones):
/etc/sysctl.conf
Directorio de ficheros adicionales (forma recomendada en sistemas modernos):
/etc/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf ← ficheros de los paquetes (no editar)
Los ficheros en /etc/sysctl.d/ se procesan en orden alfabético antes que
/etc/sysctl.conf. La convención es usar nombres como 99-custom.conf.
Ejemplo de /etc/sysctl.d/99-custom.conf:
# Reducir uso de swap
vm.swappiness = 10
# Activar reenvío de paquetes IP (necesario para routers/NAT)
net.ipv4.ip_forward = 1
# Protección contra ataques SYN flood
net.ipv4.tcp_syncookies = 1
# Evitar que el kernel entre en pánico silenciosamente
kernel.panic = 10
Aplicar los ficheros de configuración sin reiniciar:
# sysctl -p # aplica /etc/sysctl.conf
# sysctl -p /etc/sysctl.d/99-custom.conf # aplica un fichero concreto
# sysctl --system # aplica todos los ficheros en orden
Parámetros más relevantes
Red (net.ipv4):
-
net.ipv4.ip_forward = 1→ habilita el reenvío de paquetes IP entre interfaces. Necesario en routers, servidores con NAT y contenedores. -
net.ipv4.tcp_syncookies = 1→ protección contra ataques SYN flood. Recomendado en servidores expuestos a internet. -
net.ipv4.conf.all.rp_filter = 1→ filtrado de ruta inversa: descarta paquetes cuyo origen no es enrutable de vuelta. Evita spoofing. -
net.ipv4.conf.all.accept_redirects = 0→ deshabilita la aceptación de ICMP redirects (protección ante ataques de man-in-the-middle). -
net.ipv4.tcp_fin_timeout = 30→ tiempo en segundos que una conexión TCP en estado FIN_WAIT_2 permanece antes de cerrarse. Reducirlo libera sockets más rápido.
Memoria virtual (vm):
-
vm.swappiness = 60→ agresividad del kernel para usar swap (0=mínimo, 100=máximo). En servidores con mucha RAM se suele bajar a 10. -
vm.dirty_ratio = 20→ porcentaje de RAM que puede contener datos sucios (sin escribir a disco) antes de que el proceso que escribe sea bloqueado. -
vm.dirty_background_ratio = 10→ porcentaje de RAM con datos sucios antes de que el kernel empiece a escribir en segundo plano. -
vm.overcommit_memory = 1→ permite sobrecomprometer memoria (habitual en entornos con contenedores y Redis).
Kernel:
-
kernel.panic = 10→ segundos de espera antes de reiniciar automáticamente tras un kernel panic (0 = no reiniciar). kernel.pid_max = 32768→ número máximo de procesos simultáneos.-
kernel.dmesg_restrict = 1→ restringe el acceso admesga usuarios root. Evita que usuarios no privilegiados vean información del kernel.
Sistema de ficheros (fs):
-
fs.file-max = 100000→ número máximo de descriptores de fichero abiertos simultáneamente en todo el sistema. -
fs.inotify.max_user_watches = 524288→ número máximo de watches de inotify por usuario. Necesario aumentarlo en entornos con IDEs o herramientas de watch intensivas.
Flujo de trabajo completo
# 1. Consultar el valor actual
$ sysctl vm.swappiness
vm.swappiness = 60
# 2. Cambiar en caliente para probar
# sysctl -w vm.swappiness=10
# 3. Verificar que el cambio se aplicó
$ sysctl vm.swappiness
vm.swappiness = 10
# 4. Si el resultado es el deseado, hacer el cambio permanente
# echo "vm.swappiness = 10" >> /etc/sysctl.d/99-custom.conf
# 5. Verificar que el fichero se aplica correctamente
# sysctl --system | grep swappiness