Optimización del Núcleo de Linux
Para que el sistema pueda soportar una mayor concurrencia, además de la instalación de la extensión event que es obligatoria, la optimización del núcleo de Linux también es de suma importancia. Cada una de las siguientes optimizaciones es extremadamente importante, así que asegúrate de completarlas una por una.
Explicación de los parámetros:
max-file: indica la cantidad de identificadores de archivos que pueden abrirse a nivel de sistema. Se refiere a todo el OS y no a un usuario específico.
ulimit -n: controla la cantidad de identificadores de archivos que puede abrir un proceso. Se refiere a los identificadores de archivos disponibles para el usuario actual y los procesos que inicia en el
shellactual.
Ver la cantidad de identificadores de archivos que se pueden abrir a nivel de sistema: cat /proc/sys/fs/file-max
Abre el archivo /etc/sysctl.conf y añade la siguiente configuración
# Este parámetro establece la cantidad de TIME_WAIT del sistema, si supera el valor por defecto será eliminado inmediatamente
net.ipv4.tcp_max_tw_buckets = 20000
# Define la longitud máxima de la cola de escucha para cada puerto del sistema, este es un parámetro global
net.core.somaxconn = 65535
# La cantidad máxima de solicitudes de conexión que aún no han sido confirmadas que se pueden guardar en la cola
net.ipv4.tcp_max_syn_backlog = 262144
# Permite la cantidad máxima de paquetes que se pueden enviar a la cola cuando la velocidad de recepción de paquetes en cada interfaz de red es más rápida que la velocidad a la que el núcleo procesa esos paquetes
net.core.netdev_max_backlog = 30000
# Esta opción causará que los clientes en una red NAT agoten el tiempo de espera, se recomienda establecer en 0. Linux eliminó la configuración tcp_tw_recycle a partir del núcleo 4.12, si aparece el error "No such file or directory", ignóralo
net.ipv4.tcp_tw_recycle = 0
# La cantidad total de archivos que todos los procesos del sistema pueden abrir
fs.file-max = 6815744
# Tamaño de la tabla de seguimiento del firewall. Nota: Si el firewall no está activado, aparecerá el mensaje error: "net.netfilter.nf_conntrack_max" is an unknown key, simplemente ignóralo
net.netfilter.nf_conntrack_max = 2621440
net.ipv4.ip_local_port_range = 10240 65000
Ejecuta sysctl -p para que tenga efecto de inmediato.
Nota:
El archivo /etc/sysctl.conf tiene muchas opciones configurables, puedes ajustar otras opciones según tus necesidades ambientales.
Número de Archivos Abiertos
Configura el número de archivos que el sistema puede abrir para resolver el problema de too many open files en alta concurrencia. Esta opción afecta directamente la cantidad de conexiones de cliente que un solo proceso puede manejar.
El Soft open files es un parámetro del sistema Linux que afecta el número máximo de identificadores de archivos que puede abrir un único proceso. Este valor impacta en aplicaciones de conexión persistente como chats, donde un único proceso puede mantener conexiones de usuarios. Ejecutando ulimit -n se puede ver este valor; si es 1024, significa que un único proceso solo puede mantener hasta 1024 conexiones, o incluso menos (ya que otros identificadores de archivos pueden estar abiertos). Si se inician 4 procesos para mantener conexiones de usuario, la cantidad total de conexiones que la aplicación puede manejar no superará 4*1024, lo que significa que un máximo de 4x1024 usuarios pueden estar en línea. Este ajuste se puede aumentar para permitir que el servicio mantenga más conexiones TCP.
Tres métodos para modificar el Soft open files:
Primera opción: Ejecutar directamente en el terminal ulimit -HSn 102400, y luego reiniciar workerman.
Esto solo es efectivo en el terminal actual; al salir, el número de archivos abiertos volverá al valor por defecto.
Segunda opción: Añadir ulimit -HSn 102400 al final del archivo /etc/profile, de esta manera se ejecutará automáticamente cada vez que se inicie sesión en el terminal. Después de hacer el cambio, es necesario reiniciar workerman.
Tercera opción: Para hacer que el valor de archivos abiertos sea permanente, debes modificar el archivo de configuración: /etc/security/limits.conf. Añade lo siguiente al final de este archivo:
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
Este método requiere que el servidor se reinicie para que tenga efecto.