sysctl es la herramienta para leer y modificar en caliente los parámetros del kernel de Linux que se exponen en /proc/sys. Ajustar unos pocos de ellos (cuánto usa el sistema la swap, cuándo vacía a disco los datos pendientes o cuánta memoria puede reservar un proceso) puede mejorar la estabilidad y la latencia de un servidor. En este tutorial aprenderás a consultar y cambiar parámetros en Ubuntu 24.04, a hacer los cambios persistentes de forma ordenada y a aplicar un conjunto de ajustes de memoria razonable, midiendo antes y después.
Los valores por defecto de un kernel moderno son buenos para la mayoría de cargas. La regla de este tutorial es cambiar solo lo que tenga un motivo y comprobar su efecto.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath. Los comandos son iguales en Debian 12 y Rocky Linux 9.
- Un usuario no root con privilegios
sudo. - Conocer qué carga ejecuta el servidor (web, base de datos, contenedores), porque varios ajustes dependen de ello.
Paso 1: Consultar parámetros del kernel
Cada parámetro tiene un nombre con puntos que corresponde a una ruta en /proc/sys. Por ejemplo, vm.swappiness es /proc/sys/vm/swappiness. Consulta un valor:
sysctl vm.swappiness
vm.swappiness = 60
Consulta varios a la vez o busca por nombre:
sysctl vm.dirty_ratio vm.dirty_background_ratio
sudo sysctl -a | grep ^vm.overcommit
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
Los prefijos agrupan los parámetros por subsistema: vm.* (memoria virtual), net.* (red), fs.* (sistemas de archivos) y kernel.* (núcleo).
Paso 2: Tomar una línea base
Antes de cambiar nada, registra cómo se comporta el servidor bajo su carga habitual para poder comparar después. Estos tres comandos cubren memoria, swap y escritura a disco:
free -h
total used free shared buff/cache available
Mem: 3.8Gi 1.2Gi 410Mi 12Mi 2.4Gi 2.6Gi
Swap: 2.0Gi 310Mi 1.7Gi
vmstat 5 6
En la salida de vmstat, las columnas si y so muestran KB por segundo leídos y escritos en swap, y wa el porcentaje de CPU esperando E/S. Si si y so son distintos de cero de forma sostenida, el servidor está paginando.
grep -E '^(Dirty|Writeback):' /proc/meminfo
Dirty: 8456 kB
Writeback: 0 kB
Dirty es la cantidad de datos escritos por las aplicaciones que aún no se han volcado a disco.
Paso 3: Probar un cambio temporal
sysctl -w cambia un valor al instante, pero el cambio se pierde al reiniciar. Es la forma segura de probar:
sudo sysctl -w vm.swappiness=10
vm.swappiness = 10
Si el cambio empeora algo, basta con volver a escribir el valor anterior o reiniciar.
Paso 4: Hacer los cambios persistentes
Los parámetros persistentes se guardan en archivos .conf dentro de /etc/sysctl.d/. Al arrancar, systemd-sysctl los aplica en orden alfabético y el último valor leído gana. Usar un archivo propio en lugar de editar /etc/sysctl.conf deja claro qué has cambiado y facilita deshacerlo.
Crea el archivo:
sudo nano /etc/sysctl.d/99-tuning.conf
Añade los ajustes que correspondan a tu servidor. Este es un punto de partida para un servidor de aplicaciones o base de datos con 4 GB de RAM o más:
# Usar la swap solo cuando la memoria escasea de verdad
vm.swappiness = 10
# Empezar a volcar datos pendientes antes y limitar cuánto se acumula
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
Aplica todos los archivos de configuración sin reiniciar:
sudo sysctl --system
La salida lista cada archivo leído. Comprueba que tu archivo aparece y que los valores están activos:
...
* Applying /etc/sysctl.d/99-tuning.conf ...
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
* Applying /etc/sysctl.conf ...
sysctl vm.swappiness vm.dirty_ratio vm.dirty_background_ratio
Nota
/etc/sysctl.confse aplica el último. Si define el mismo parámetro que tu archivo, su valor prevalece. Revísalo congrep -v '^#' /etc/sysctl.confsi un ajuste no se aplica.
Paso 5: Elegir los ajustes de memoria
Esta tabla recoge los parámetros de memoria que merece la pena conocer, su valor por defecto en Ubuntu 24.04 y cuándo cambiarlo:
| Parámetro | Por defecto | Valor habitual | Cuándo cambiarlo |
|---|---|---|---|
vm.swappiness | 60 | 10 | Servidores de bases de datos y aplicaciones donde la latencia importa más que la caché de disco |
vm.dirty_background_ratio | 10 | 5 | Servidores con mucha RAM y escrituras en ráfagas que provocan picos de E/S |
vm.dirty_ratio | 20 | 10 | Junto con el anterior, para que ninguna escritura se bloquee acumulando gigas pendientes |
vm.overcommit_memory | 0 | 1 | Solo para Redis u otros servicios que lo recomienden en su documentación |
vm.max_map_count | 1048576 | Sin cambios | Ya supera los 262144 que piden Elasticsearch y OpenSearch |
vm.vfs_cache_pressure | 100 | Sin cambios | Solo con millones de archivos pequeños y medición previa |
Algunas aclaraciones:
vm.swappinessno desactiva la swap. Con un valor bajo el kernel prefiere liberar caché de disco antes que enviar a swap memoria de procesos. Con0se puede llegar antes al OOM killer, por eso10es más prudente.vm.dirty_ratioes un porcentaje de la memoria disponible. En un servidor con 64 GB, el 20% por defecto permite acumular más de 12 GB sin escribir, y el volcado posterior satura el disco. Si tienes mucha RAM puedes usar valores absolutos convm.dirty_background_bytesyvm.dirty_bytes; al fijar la variante en bytes, la de porcentaje pasa a 0 automáticamente.vm.overcommit_memory = 1permite reservar más memoria de la que existe. Redis lo necesita para quefork()no falle al guardar a disco, pero en otros servidores es mejor dejar0.
Hay parámetros que aparecen en muchas guías antiguas y ya no hace falta tocar en Ubuntu 24.04: fs.file-max (su valor por defecto es prácticamente ilimitado), kernel.pid_max (4194304) y net.core.somaxconn (4096). El límite de archivos abiertos que suele dar problemas es el de cada proceso, que se configura con ulimit y systemd, no con sysctl.
Paso 6: Verificar el efecto
Con la carga habitual en marcha, repite las mediciones del paso 2 y compáralas:
vmstat 5 6
grep -E '^(Dirty|Writeback):' /proc/meminfo
Lo que deberías ver:
- Con
vm.swappiness = 10, las columnassiysodevmstatmás cerca de cero mientras haya caché de disco que liberar. - Con los ratios de volcado reducidos, valores de
Dirtymás bajos y picos dewamás cortos durante escrituras intensas.
Si no ves diferencia, el parámetro no era el cuello de botella: elimina esa línea del archivo para mantener la configuración mínima.
Deshacer los cambios
Para volver a los valores por defecto, borra tu archivo y reinicia:
sudo rm /etc/sysctl.d/99-tuning.conf
sudo reboot
Si no puedes reiniciar, vuelve a escribir los valores por defecto con sudo sysctl -w (por ejemplo vm.swappiness=60).
Solución de problemas
sysctl: cannot stat /proc/sys/...: No such file or directory. El parámetro no existe en tu kernel o el módulo que lo proporciona no está cargado. Comprueba el nombre con sudo sysctl -a | grep nombre.
sysctl: permission denied on key. Falta sudo, o el parámetro es de solo lectura. Dentro de contenedores muchos parámetros no se pueden cambiar desde el invitado.
El valor vuelve a cambiar tras reiniciar. Otro archivo posterior en orden alfabético, o /etc/sysctl.conf, lo sobrescribe. Localízalo con grep -r nombre_parametro /etc/sysctl.conf /etc/sysctl.d/ /usr/lib/sysctl.d/.
Conclusión
Ya sabes consultar parámetros del kernel, probarlos en caliente, guardarlos en /etc/sysctl.d/ y medir si aportan algo. Como siguientes pasos, puedes ajustar la pila de red con la guía de ajuste TCP/IP para alto rendimiento, subir el límite de archivos abiertos por proceso con ulimit y LimitNOFILE de systemd, o consultar la documentación oficial de cada parámetro en https://docs.kernel.org/admin-guide/sysctl/vm.html.
