Aviso desde el principio. Es un artículo bastante técnico. Te pongo en situación. Montas un nuevo servidor en Rocky Linux o Alma Linux porque te has tenido que cambiar desde CentOS. Después de montar todo el servidor para tus páginas web, tienes que configurar correctamente los parámetros del archivo /etc/sysctl.conf del Kernel de Linux (Rocky Linux 9, en concreto) para mejorar su seguridad y rendimiento.
Y te surge la duda: ¿Qué parámetros hay que cambiar? ¿Cuáles son imprescindibles? ¿Volverá a arrancar mi servidor con los cambios? Te cuento mi experiencia. Estos parámetros del Kernel van a tener una influencia enorme en cómo se comporta tu sistema, en cómo interactúa con el hardware y con el software.
¡Ojo! Ten en cuenta que estos cambios pueden ser buenos para mí, pero no para ti. Vete cambiándolos poco a poco, comprueba el rendimiento de tu sistema. Consulta tus estadísticas y vuelve a tunearlos. Haz un backup de tu archivo y de tu servidor.
Para que te pongas en situación. He tuneado (más bien sigo haciéndolo) estos parámetros del Kernel para un servidor con Rocky Linux 9.4, 16 GB de RAM y 6 núcleos en el procesador. ¿Kernel? Linux 5.14.0-427.16.1. El servidor tiene 8 TB de transferencia y una entrada y salida de red de 40/6 Gbps. Discos SSD. En el servidor hay un sistema LAMP con Opcache y Memcached instalados para que funcionen varias instalaciones de WordPress. Te cuento todo esto, porque es importante saber para qué se están cambiando los parámetros de rendimiento del Kernel. El tunning del Kernel es un proceso de ensayo y error que tiene que ir cambiando con el tiempo.
¿Comandos útiles y terminología que deberías de conocer?
sysctl -a
Este comando muestra todos los parámetros disponibles en el sistema. Es decir, tu punto de partida. Te van a salir muchos, divididos principalmente en:
- Memoria (vm): Configuraciones relacionadas con la gestión de la memoria virtual, como vm.swappiness, vm.dirty_ratio, etc.
- Red (net): Parámetros que afectan el comportamiento de la red, como net.ipv4.tcp_syncookies, net.ipv4.ip_forward, etc.
- Seguridad: Configuraciones de seguridad, como kernel.dmesg_restrict, fs.protected_symlinks, etc.
- Sistema de archivos (fs): Parámetros relacionados con la gestión del sistema de archivos, como fs.file-max, fs.inotify.max_user_watches, etc.
/etc/sysctl.conf
El archivo donde vas a tener que escribir los valores de estos parámetros si quieres que se queden de manera persistente entre reinicios del servidor. Accedes al archivo mediante vi y lo editas.
¿Solo quieres cambiar un parámetro de manera temporal?
sudo sysctl -w vm.swappiness=10
Esto está bien para hacer pruebas si no quieres arriesgar mucho. Pero en general, es mejor dejarlo todo bien configurado en el archivo sysctl.conf.
sysctl -p
Después de cambiar los ajustes del Kernel, tienes que ejecutar comando, que lee y aplica los parámetros de configuración del archivo /etc/sysctl.conf a tu sistema. No hace falta reiniciar el servidor para que veas si funcionan o no. Al ejecutarlo, puedes ver si hay algún error o no, por ejemplo, si hay algún ajuste que tu versión del Kernel no soporta.
Ejemplo de /etc/sysctl.conf para mejorar el rendimiento y la seguridad de un servidor Linux
Te lo vuelvo a recordar. Estos parámetros pueden funcionar en mi sistema pero no en el tuyo. Tienes que ir probando tú mismo y leer mucho para ajustar los que más te interesen. Es posible que en unos meses yo mismo los haya cambiado por otros o haya añadido nuevos valores. Ya voy por la sexta versión de este archivo.
¡Ojo! El proceso es el siguiente: vas cambiando o añadiendo pocos parámetros cada vez. Revisas estadísticas del servidor. Vuelves a cambiarlos. El proceso te puede llevar desde semanas a meses. Lees toda la documentación posible y haces backups de tu sistema. Hazlo todo con cuidado.
¡Ojo! Antes de comenzar a cambiar cosas, ejecuta en la Terminal sysctl -a para saber de qué valores partes y tenerlo en cuenta para tus cambios.
Vas a la terminal de tu servidor mediante SSH y pones lo siguiente:
sudo vi /etc/sysctl.conf
Vas cambiando los valores poco a poco y haciendo pruebas de rendimiento.
# ------------------------------
# Sección: Configuración de printk
# ------------------------------
kernel.printk = 3 4 1 3
# ------------------------------
# Sección: Seguridad y Optimización de Red
# ------------------------------
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# ------------------------------
# Sección: Protección contra Ataques
# ------------------------------
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 3
# ------------------------------
# Sección: Optimización de la Memoria
# ------------------------------
vm.swappiness = 10
fs.file-max = 1000000
kernel.pid_max = 65536
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 4000
vm.dirty_writeback_centisecs = 100
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
vm.vfs_cache_pressure = 50
vm.min_free_kbytes = 491520
# ------------------------------
# Sección: Ajustes Generales de Red
# ------------------------------
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.core.netdev_max_backlog = 100000
net.core.optmem_max = 25165824
# ------------------------------
# Sección: Ajustes de Memoria TCP/UDP
# ------------------------------
net.ipv4.tcp_mem = 786432 1048576 26777216
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 4096 87380 67108864
net.ipv4.udp_wmem_min = 16384
# ------------------------------
# Sección: Optimización de Conexiones TCP
# ------------------------------
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 900
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
Cuando terminas de editar, ejecutas el siguiente comando para aplicar los cambios de manera inmediata:
sudo sysctl -p
Compruebas si hay errores y vuelves a corregir. Te aparecerán en pantalla. ¿Hay más cosas que se pueden ajustar? Claro. Pero ya resulta complicado solo con estas. Vamos poco a poco, ¿no?
Uno de los valores que se suelen modificar de manera más sencilla es vm.swappiness, que básicamente controla cuando se mandan procesos a la memoria SWAP. Si prefieres usar memoria RAM, lo mejor es que este valor este bajo. Pero si andas escaso de memoria RAM, utilizar la memoria SWAP te puede salvar la vida, sobre todo si tu servidor tiene un buen disco SSD. Por ejemplo, se recomienda un valor bajo para cargas de trabajo con bases de datos:
- vm.swappiness = 0 # El intercambio está desactivado.
- vm.swappiness = 1 # Cantidad mínima de intercambio sin desactivarlo por completo.
- vm.swappiness = 10 # Este valor se recomienda para mejorar el rendimiento cuando existe suficiente memoria.
- vm.swappiness = 60 # El valor predeterminado.
- vm.swappiness = 100 # Se incrementa de forma agresiva.
Dicho esto, antes de meterte a tunear este parámetro, a lo mejor debes tunear el comportamiento de MariaDB (en my.cnf), Apache (httpd.conf) y PHP-FPM (en mi caso en php-fpm.conf). También deberías de ajustar los parámetros de Opcache y Memcached (archivos .ini).
Te puede interesar: Cómo configurar la memoria SWAP en un servidor Rocky Linux 9 o Cómo configurar diferentes versiones de PHP en Rocky Linux.
Comprobando como está recibiendo tu servidor los cambios en sysctl
Ahora puedes dejar estos cambios durante unas cuantas horas o incluso días y comprobar que tal le han sentado a tu servidor. ¿Cómo puedes hacer esto? Pues verificando el uso de CPU, memoria RAM, conexiones TCP y UDP de entrada y salida y demás parámetros del servidor.
Puedes hacerlo con los comandos adecuados de Linux. En mi caso, tengo este script para que guarde el resultado de todos estos comandos en un archivo ejecutable y así ir revisando el rendimiento del servidor.
Creas un archivo:
sudo vi system_stats.sh
Pones todo lo siguiente:
#!/bin/bash
# Nombre del archivo de salida
output_file="system_stats_$(date +'%Y%m%d_%H%M%S').txt"
# Función para ejecutar y guardar la salida de un comando
run_and_save() {
local cmd=$1
echo "Running $cmd..." | tee -a "$output_file"
echo "===== $cmd =====" >> "$output_file"
if eval "$cmd" >> "$output_file" 2>&1; then
echo "El comando '$cmd' se ha ejecutado con exito." >> "$output_file"
else
echo "El comando '$cmd' ha fallado." >> "$output_file"
fi
echo -e "\n" >> "$output_file"
}
# Lista de comandos a ejecutar
commands=(
"top -b -n 1"
"free -h -t"
"mpstat -P ALL 1 5"
"sar -u 1 5"
"vmstat 1 5"
"iostat -xz 1 5"
"netstat -s"
"df -h"
"df -i"
"df -hT"
"ss -s"
"ifconfig"
"ip addr show"
"ss -tuln"
"ip -s link"
"ps aux --sort=-%mem | head -n 20"
"ps aux --sort=-%cpu | head -n 20"
"systemctl list-units --type=service --state=running"
"swapon --show"
)
# Ejecución de los comandos
for cmd in "${commands[@]}"; do
run_and_save "$cmd"
done
echo "Todos los comandos ejecutados. Salida guardada en $output_file."
Le das permisos de ejecución:
sudo chmod +x system_stats.sh
Ejecutas el archivo:
./system_stats.sh
En menos de un minuto te ha guardado todas las estadísticas del sistema que tienes que ir comprobando para ver el rendimiento de tu servidor. Solo tienes que visualizar el archivo con fecha que ha sido guardado (por ejemplo):
cat system_stats_20240520_111940.txt
Las revisas y ajustas los parámetros de sysctl.conf. Vuelves a dejar el sistema funcionando unos días. Repites. Ajustas. Repites. Ajustas.
- ¡Truco! ¿Sabes quién te puede ayudar mucho a ajustar tus parámetros en función de estas estadísticas? Nuestra inteligencia artificial favorita: ChatGPT.
Otro paso importante a verificar es si el disco de tu servidor es SSD. Puedes hacerlo con este comando, que crea un archivo de prueba de aproximadamente 1 GB en /tmp
y mide el rendimiento de escritura del disco:
dd if=/dev/zero of=/tmp/test bs=64k count=16k conv=fdatasync
En mi caso he obtenido esta salida:
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.21714 s, 882 MB/s
Lo que indica que tengo un disco SSD, algo bueno para mejorar el rendimiento de la memoria SWAP y para tener en cuenta si aplico o no determinados cambios en sysctl.
- Te puede interesar: Cómo instalar Rclone en Rocky Linux 9
¿Más cosas que puedes hacer para ver si tienes problemas en el servidor?
Compruebas si han aparecido errores de memoria y se han terminado procesos (Out of Memory, OOM). Esto lo tienes registrado en los logs. En el caso de Rocky Linux podemos usar estos dos comandos:
grep -r -i "out of memory" /var/log/
grep -r -i "oom-killer" /var/log/
Si ves que han aparecido muchos errores después de tunear los parámetros de sysctl, es que no le han sentado muy bien a tu servidor y tienes que volver a cambiarlos. Si quieres puedes incorporar estos dos comandos al script anterior.
Te justifico un poco porque he hecho estos cambios
Configuración de printk
kernel.printk = 3 4 1 3
- Descripción: Controla los niveles de mensajes del kernel que se envían a la consola.
- Justificación: Limita la cantidad de mensajes para evitar el llenado excesivo del buffer de mensajes del kernel. Si usas una consola desde la página de proveedor de hosting, te puedes encontrar que no puedes usarla por la cantidad de mensajes que aparecen en pantalla. Tienes que ajustar a estos valores.
Seguridad y optimización de Red
net.ipv4.ip_forward = 0
- Descripción: Desactiva el reenvío de paquetes IPv4.
- Justificación: Mejora la seguridad evitando que el servidor actúe como un router. Tenemos un servidor ¿no?
net.ipv4.conf.all.accept_source_route = 0 y net.ipv4.conf.default.accept_source_route = 0
- Descripción: Desactiva la aceptación de rutas fuente.
- Justificación: Evita que los atacantes puedan definir rutas específicas para los paquetes.
net.ipv4.conf.all.accept_redirects = 0 y net.ipv4.conf.default.accept_redirects = 0
- Descripción: Desactiva la aceptación de redirecciones ICMP.
- Justificación: Protege contra ataques de redireccionamiento maliciosos. El Ping a tu servidor sigue funcionando, no te preocupes.
net.ipv4.conf.all.secure_redirects = 0 y net.ipv4.conf.default.secure_redirects = 0
- Descripción: Desactiva la aceptación de redirecciones seguras.
- Justificación: Mejora la seguridad al rechazar redirecciones no necesarias.
net.ipv4.icmp_echo_ignore_broadcasts = 1
- Descripción: Ignora los pings de difusión.
- Justificación: Protege contra ataques de denegación de servicio basados en ICMP. El Ping a tu servidor sigue funcionando, no te preocupes.
net.ipv4.conf.all.log_martians = 1
- Descripción: Activa el registro de paquetes sospechosos (martians).
- Justificación: Facilita la detección de paquetes mal formados o maliciosos. Viene bien para detectar ataques a los puertos de tu servidor en los logs del sistema.
net.ipv4.conf.all.rp_filter = 1 y net.ipv4.conf.default.rp_filter = 1
- Descripción: Activa el filtrado de rutas inversas.
- Justificación: Ayuda a prevenir ataques de suplantación de direcciones IP.
net.ipv4.conf.all.send_redirects = 0 y net.ipv4.conf.default.send_redirects = 0
- Descripción: Desactiva el envío de redirecciones ICMP.
- Justificación: Mejora la seguridad evitando la manipulación de rutas por parte del servidor.
Protección contra ataques
net.ipv4.tcp_syncookies = 1
- Descripción: Activa las cookies SYN para proteger contra ataques SYN flood.
- Justificación: Mitiga ataques de denegación de servicio (DoS) basados en SYN flood.
net.ipv4.tcp_synack_retries = 3
- Descripción: Reduce el número de reintentos SYN/ACK.
- Justificación: Libera recursos más rápidamente al reducir el tiempo de espera para confirmar conexiones.
Optimización de la memoria
vm.swappiness = 10
- Descripción: Ajusta la propensión del kernel a usar swap.
- Justificación: Prefiere usar más RAM antes de recurrir a swap, mejorando el rendimiento. Si ves que tus procesos acceden mucho a la memoria virtual, pon este valor a 10 o algo menos. Suele estar a 60, por lo menos en Rocky Linux y RHEL. Un valor bajo evita intercambiar procesos fuera de la memoria, lo que generalmente disminuye la latencia a costa del rendimiento de E/S.
- Valor bajo (p.ej., 10): Menor tendencia a usar swap.
- Valor alto (p.ej., 60): Mayor tendencia a usar swap.
fs.file-max = 1000000
- Descripción: Establece el número máximo de descriptores de archivo que el sistema puede asignar.
- Justificación: Aumenta la capacidad para manejar un gran número de archivos abiertos simultáneamente. Si tienes muchos WordPress instalados en el servidor te viene bien cuando tengas mucho tráfico.
kernel.pid_max = 65536
- Descripción: Define el número máximo de PIDs (Process IDs) que se pueden asignar.
- Justificación: Permite una mayor cantidad de procesos simultáneos. Y sigue siendo un valor alto. Comprueba los procesos que tienes en tu servidor y ajusta a tu gusto. El valor por defecto es muy elevado.
vm.dirty_ratio = 10
- Descripción: Establece el porcentaje máximo de memoria que puede estar “sucia” antes de que se escriba en el disco.
- Justificación: Balancea el uso de la memoria y la frecuencia de escrituras en el disco. Lo ajustas junto a vm.swappiness. El valor predeterminado es el 20 por ciento. Si tienes instalaciones de WordPress con MariaDB y PHP-FPM, una configuración de vm.dirty_ratio=10 puede ser buena, ya que WordPress genera una gran cantidad de datos modificados. Este valor puede ayudar a evitar picos de I/O repentinos y mantener un rendimiento más constante. Tienes que tener un disco SSD rápido para no crear cuellos de botella (es de lo único que te tienes que asegurar).
vm.dirty_background_ratio = 5
- Descripción: Establece el porcentaje de memoria sucia en segundo plano antes de que el sistema empiece a escribirla en el disco.
- Justificación: Mantiene el rendimiento del sistema al evitar que se acumule demasiada memoria sucia. Lo ajustas junto a vm.swappiness. El valor predeterminado es el 10 por ciento.
vm.dirty_expire_centisecs = 4000
- Descripción: Determina el tiempo (en centisegundos) antes de que los datos sucios sean escritos en el disco.
- Justificación: Controla la latencia de escritura de datos sucios. Lo ajustas junto a vm.swappiness. El valor por defecto es de 3000.
vm.dirty_writeback_centisecs = 100
- Descripción: Intervalo de tiempo (en centisegundos) para escribir datos sucios en el disco.
- Justificación: Asegura que los datos sucios se escriban regularmente en el disco. Lo ajustas junto a vm.swappiness. El valor por defecto es de 500.
vm.overcommit_memory = 1
- Descripción: Configura la estrategia de sobre asignación de memoria.
- Justificación: Permite al sistema sobre asignar memoria, útil para aplicaciones que utilizan mucha memoria virtual. El valor por defecto es 0. Cuando este parámetro se establece en 1, aumenta la posibilidad de sobrecarga de memoria, pero mejora el rendimiento de las tareas que requieren mucha memoria. Para sistemas con aplicaciones que requieren gran cantidad de memoria, mejor poner
1
.
vm.overcommit_ratio = 50
- Descripción: Establece el porcentaje de memoria adicional que el sistema puede sobre asignar.
- Justificación: Complementa wm.overcommit_memory permitiendo una sobre asignación controlada.
vm.vfs_cache_pressure = 50
- Descripción: Ajusta la presión del sistema para liberar cachés de sistema de archivos.
- Justificación: Reduce la frecuencia de liberación de cachés de VFS para mejorar el rendimiento. El valor predeterminado de vfs_cache_pressure es 100. Ajustar vm.vfs_cache_pressure a 50 te puede ayudar a reducir el uso de swap al mantener más datos de caché de inodos y dentries en la memoria.
vm.min_free_kbytes = 491520
- Descripción: Garantiza una cantidad mínima de memoria libre.
- Justificación: Previene problemas de rendimiento al asegurar que siempre haya memoria libre disponible. Depende mucho de tu memoria RAM. Suele ponerse al 3-5 % de la misma en servidores. Vete ajustando poco a poco, porque puede hacer que aumente el uso de memoria SWAP. Tanto los valores demasiado bajos como los demasiado altos pueden ser perjudiciales para tu sistema. La he dejado en el 3 % de 16 GB (491520 kB). En Red Hat no recomiendan ponerla por encima de 5 % a riesgo de sufrir los famosos out-of-memory. Pero si lo pones muy bajo, tienes riesgo de que aparezcan OOM en el sistema (procesos que se han terminado repentinamente).
Ajustes Generales de Red
net.core.somaxconn = 4096
- Descripción: Establece el tamaño máximo de la cola de conexiones pendientes.
- Justificación: Aumenta la capacidad de manejo de nuevas conexiones simultáneas. Depende mucho de la cantidad de usuarios en tu servidor.
- Servidor de baja carga: 256 – 512. Para servidores con pocas conexiones simultáneas.
- Servidor de carga media: 1024 – 2048. Para servidores con un número moderado de conexiones simultáneas.
- Servidor de alta carga: 4096 – 8192. Para servidores que manejan muchas conexiones simultáneas.
- Servidor de carga muy alta o especializado: 16384 – 32768. Para servidores que manejan una cantidad extremadamente alta de conexiones, como proxies o balanceadores de carga.
net.ipv4.tcp_max_syn_backlog = 8192
- Descripción: Define el número máximo de solicitudes de conexión entrantes sin confirmar.
- Justificación: Permite manejar un mayor número de conexiones TCP simultáneas. Lo mismo.
net.ipv4.tcp_window_scaling = 1
- Descripción: Habilita la escalabilidad de la ventana TCP.
- Justificación: Mejora el rendimiento en conexiones de alta latencia.
net.ipv4.tcp_timestamps = 1
- Descripción: Habilita las marcas de tiempo TCP.
- Justificación: Evita problemas de rendimiento debido a la envoltura de secuencia TCP.
net.core.netdev_max_backlog = 100000
- Descripción: Establece el tamaño máximo de la cola de paquetes de red en espera.
- Justificación: Permite manejar picos de tráfico de red sin perder paquetes. Depende mucho de la cantidad de usuarios en tu servidor.
net.core.optmem_max = 25165824
- Descripción: Define la cantidad máxima de memoria opcional para los sockets.
- Justificación: Permite que los sockets utilicen más memoria si es necesario.
Ajustes de memoria TCP/UDP
net.ipv4.tcp_mem = 786432 1048576 26777216
- Descripción: Configura el uso de memoria para TCP.
- Justificación: Ajusta la memoria TCP para manejar una gran cantidad de conexiones y tráfico.
net.ipv4.udp_mem = 65536 131072 262144
- Descripción: Configura el uso de memoria para UDP.
- Justificación: Ajusta la memoria UDP para manejar un tráfico de paquetes elevado.
net.ipv4.tcp_rmem = 4096 87380 67108864
- Descripción: Establece los tamaños de los buffers de recepción para TCP.
- Justificación: Mejora el rendimiento en conexiones de alta latencia y ancho de banda.
net.ipv4.tcp_wmem = 4096 87380 67108864
- Descripción: Establece los tamaños de los buffers de envío para TCP.
- Justificación: Mejora el rendimiento en conexiones de alta latencia y ancho de banda.
net.ipv4.udp_rmem_min = 16384
- Descripción: Define el tamaño mínimo del buffer de recepción para UDP.
- Justificación: Asegura que las aplicaciones UDP tengan suficiente buffer para recibir datos.
net.ipv4.udp_wmem_min = 16384
- Descripción: Define el tamaño mínimo del buffer de envío para UDP.
- Justificación: Asegura que las aplicaciones UDP tengan suficiente buffer para enviar datos.
Optimización de Conexiones TCP
net.ipv4.tcp_fin_timeout = 30
- Descripción: Reduce el tiempo de espera para cerrar las conexiones TCP.
- Justificación: Libera recursos más rápidamente al reducir el tiempo de espera de las conexiones cerradas. Tampoco hay que bajarlo mucho o vas a tener problemas. Suele estar en 60.
net.ipv4.tcp_tw_reuse = 1
- Descripción: Permite la reutilización de sockets en estado TIME-WAIT para nuevas conexiones.
- Justificación: Mejora la reutilización de recursos de red y optimiza el manejo de conexiones. Antes la gente usaba net.ipv4.tcp_tw_recycle, pero daba muchos problemas y ha sido deprecada.
net.ipv4.tcp_keepalive_time = 900
- Descripción: Configura el tiempo de espera antes de enviar mensajes keepalive en conexiones inactivas.
- Justificación: Mantiene las conexiones activas verificando su estado periódicamente. Tanto este valor como los dos siguientes los tuneas juntos. Suele encontrarse entre 600 y 7200 segundos. Suele estar en 7200.
net.ipv4.tcp_keepalive_intvl = 60
- Descripción: Establece el intervalo entre mensajes keepalive cuando no se recibe respuesta.
- Justificación: Permite detectar más rápidamente conexiones inactivas o caídas. Suele estar entre 30 y 120 segundos. Por defecto en 75.
net.ipv4.tcp_keepalive_probes = 5
- Descripción: Define el número de intentos de mensajes keepalive antes de cerrar la conexión.
- Justificación: Proporciona un balance entre la detección rápida de caídas y la tolerancia a fallos transitorios. Suele estar entre 3 y 10. Por defecto en 9.
Conclusión
Ya sabes. Ensayo y error. Cada sistema es diferente, y estos parámetros del Kernel (sobre todo los de rendimiento) pueden funcionar para mí, pero no para ti. Es cuestión de ir probando. Con calma. Poco a poco. Aprendiendo en el camino.
A modo de resumen, te comento en esta tabla los valores de sysctl que más afectan en mi instalación, y que ayudan a mejorar el rendimiento de WordPress:
Parámetro | Descripción | Recomendación |
---|---|---|
vm.dirty_ratio | Porcentaje de memoria sucia antes de activar la escritura. | 10 |
vm.dirty_background_ratio | Porcentaje de memoria sucia antes de que los procesos de escritura se activen en segundo plano. | 5 |
vm.swappiness | Controla la tendencia a mover procesos de RAM al swap. | 10 |
vm.vfs_cache_pressure | Cantidad de memoria usada para el cache de inodos y dentries. | 50 |
net.core.somaxconn | Número máximo de conexiones pendientes. | 4096 |
net.ipv4.tcp_max_syn_backlog | Tamaño máximo de la cola de solicitudes de conexión entrantes. | 8192 |
net.core.netdev_max_backlog | Número máximo de paquetes en cola en la interfaz de red antes de ser procesados. | 100000 |
net.ipv4.tcp_window_scaling | Permite el escalado de ventanas TCP para mejorar el rendimiento de la red. | 1 (habilitado) |
net.ipv4.tcp_timestamps | Ayuda en la recuperación rápida de la red y evita ciertos tipos de ataques. | 1 (habilitado) |
Seguro que tienes muchas preguntas o a lo mejor me quieres dejar alguna recomendación. Vamos a comentarlo juntos. Deja un comentario y lo hablamos.
Referencias:
- https://highon.coffee/blog/security-harden-centos-7/#sysctl-security
- https://www.lisenet.com/2017/centos-7-server-hardening-guide/
- https://www.cyberciti.biz/faq/linux-kernel-etcsysctl-conf-security-hardening/
- https://docs.vultr.com/securing-and-hardening-the-centos-7-kernel-with-sysctl
- https://reintech.io/blog/tuning-linux-kernel-parameters-rocky-linux-9
- https://gist.github.com/voluntas/bc54c60aaa7ad6856e6f6a928b79ab6c
- https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-rocky-linux-9
- https://www.baeldung.com/linux/file-system-caching
- https://xitoring.com/kb/how-to-fine-tune-linux-kernel-parameters/
- TCP keepalive Recommended Settings and Best Practices
- Demystifying the Linux Kernel‘s vm.min_free_kbytes Parameter
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux
- https://wiki.archlinux.org/title/sysctl
- https://access.redhat.com/solutions/32769