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

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ámetroPor defectoValor habitualCuándo cambiarlo
vm.swappiness6010Servidores de bases de datos y aplicaciones donde la latencia importa más que la caché de disco
vm.dirty_background_ratio105Servidores con mucha RAM y escrituras en ráfagas que provocan picos de E/S
vm.dirty_ratio2010Junto con el anterior, para que ninguna escritura se bloquee acumulando gigas pendientes
vm.overcommit_memory01Solo para Redis u otros servicios que lo recomienden en su documentación
vm.max_map_count1048576Sin cambiosYa supera los 262144 que piden Elasticsearch y OpenSearch
vm.vfs_cache_pressure100Sin cambiosSolo con millones de archivos pequeños y medición previa

Algunas aclaraciones:

  • vm.swappiness no desactiva la swap. Con un valor bajo el kernel prefiere liberar caché de disco antes que enviar a swap memoria de procesos. Con 0 se puede llegar antes al OOM killer, por eso 10 es más prudente.
  • vm.dirty_ratio es 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 con vm.dirty_background_bytes y vm.dirty_bytes; al fijar la variante en bytes, la de porcentaje pasa a 0 automáticamente.
  • vm.overcommit_memory = 1 permite reservar más memoria de la que existe. Redis lo necesita para que fork() no falle al guardar a disco, pero en otros servidores es mejor dejar 0.

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 columnas si y so de vmstat más cerca de cero mientras haya caché de disco que liberar.
  • Con los ratios de volcado reducidos, valores de Dirty más bajos y picos de wa má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.