Cómo configurar el usuario máximo 300 concurrentes 30 centos
En la plataforma Linux, ya sea que esté programando un programa cliente o un programa servidor, al procesar conexiones TCP altamente concurrentes, el El número máximo de usuarios simultáneos es limitado. El límite del sistema en el número de archivos que un solo proceso puede abrir al mismo tiempo (esto se debe a que el sistema crea un identificador de socket para cada conexión TCP y cada identificador de socket también es un identificador de archivo). ). Cada mango de enchufe es también un mango de archivo). Puede utilizar el comando ulimit para ver el límite en la cantidad de archivos que el proceso de usuario actual puede abrir: error estándar, error estándar, error estándar, error estándar, error estándar, error estándar, error estándar, error estándar, estándar error y error estándar. Después de eliminar la entrada estándar, la salida estándar, el error estándar, los sockets de escucha del servidor y los sockets de dominio Unix utilizados para la comunicación entre procesos, solo hay alrededor de 1024-10=1014 archivos disponibles para las conexiones de socket del cliente. Esto significa que, de forma predeterminada, los programas de comunicación basados en Linux permiten hasta 1014 conexiones TCP simultáneas.
Para los manejadores de comunicación que desean admitir más conexiones TCP simultáneas, es necesario modificar los límites estrictos y flexibles de Linux en la cantidad de archivos que el proceso de usuario actual puede abrir simultáneamente. El límite suave es que Linux limita aún más la cantidad de archivos que el usuario puede abrir al mismo tiempo dentro del rango que el sistema actual puede soportar; el límite estricto es la cantidad máxima de archivos que el sistema puede abrir al mismo tiempo; basado en los recursos de hardware del sistema (principalmente memoria del sistema). Por lo general, el límite flexible es menor o igual que el límite estricto.
La forma más sencilla de cambiar estos límites es utilizar el comando ulimit:
[speng@as4 ~]$ ulimit -n
El comando anterior especifica que se permite un solo proceso Número máximo de archivos abiertos. Si el sistema muestra algo como "Operación no permitida", significa que no se pudo modificar el límite anterior. De hecho, el valor especificado en el límite excede el límite flexible o estricto del sistema Linux en la cantidad de archivos que un usuario puede abrir. Por lo tanto, es necesario modificar los límites estrictos y flexibles del sistema Linux sobre la cantidad de archivos que un usuario puede abrir.
El primer paso es modificar el archivo /etc/security/limits.conf y agregar la siguiente línea:
speng soft nofile 10240
speng hard nofile 10240
p>Donde speng especifica el límite de archivos abiertos de qué usuario, puede usar el símbolo "*" para indicar que desea modificar los límites de todos los usuarios, suave o duro, especifica si desea modificar el límite; límite suave o límite estricto; 10240 especifica que usted El nuevo límite a modificar es el número máximo de archivos abiertos (tenga en cuenta que el valor del límite suave debe ser menor o igual que el límite estricto). Guarde el archivo después de las modificaciones.
El segundo paso es modificar el archivo /etc/pam.d/login y agregar la siguiente línea:
sesión requerida /lib/security/pam_limits.so
Esto es para decirle a Linux que después de que el usuario complete el inicio de sesión en el sistema, se debe llamar al módulo pam_limits.pam_limits.so para establecer el límite máximo del sistema en la cantidad de diversos recursos que el usuario puede usar (incluido el máximo número de archivos que el usuario puede abrir), pam_limits El módulo .so lee la configuración en el archivo /etc/security/limits.conf para establecer estos límites. Guarde el archivo después de realizar cambios.
El tercer paso es verificar el límite a nivel del sistema Linux en la cantidad máxima de archivos abiertos usando el siguiente comando:
[speng@as4 ~]$ cat /proc/sys /fs/file-max
12158
Esto indica que el número máximo de archivos abiertos al mismo tiempo (es decir, el número máximo de archivos abiertos incluido el número total de archivos abiertos) archivos) es 2158 archivos, incluida la cantidad de archivos abiertos por todos los usuarios. El número total) es 12158
Esto indica que este sistema Linux permite abrir la cantidad máxima de archivos al mismo tiempo (es decir). Es decir, esto indica que este sistema Linux permite abrir hasta 12158 archivos al mismo tiempo (es decir, incluida la suma de los recuentos de archivos abiertos de todos los usuarios), lo cual es un límite estricto a nivel de sistema Linux que cualquier usuario- El límite de recuento de archivos abiertos de nivel no debe exceder. Normalmente, este límite estricto a nivel del sistema es el número máximo óptimo de archivos abiertos simultáneamente calculado por el sistema Linux en función de los recursos de hardware del sistema al inicio. El número no debe modificarse sin necesidades especiales. desea establecer un valor más allá de este límite para archivos abiertos a nivel de usuario. Para modificar este límite estricto, modifique el script /etc/rc.local y agregue la siguiente línea:
Echo 22158 > /proc/. sys/fs/file-max
Esto permitirá a Linux forzar un límite estricto a nivel del sistema en la cantidad de archivos abiertos a 22158 después de que se complete el inicio y guardar el archivo
. Después de completar los pasos anteriores, reinicie el sistema, que generalmente establece la cantidad máxima de archivos que Linux permite que un solo proceso de un usuario determinado abra al mismo tiempo en el valor especificado si usa el comando ulimit-n para averiguarlo. después del reinicio, el límite en la cantidad de archivos que un usuario puede abrir sigue siendo inferior al valor máximo establecido en los pasos anteriores. Esto puede deberse a que ha establecido un límite en la cantidad de archivos que un usuario puede abrir simultáneamente usando ulimit. n en el script de inicio de sesión del usuario en /etc/profile. Cuando cambia la cantidad máxima de archivos que se pueden abrir simultáneamente mediante ulimit -n, el nuevo valor solo puede ser menor o igual al último valor establecido por ulimit -n. por lo que no es posible aumentar el límite mediante este comando. Por lo tanto, si existe el problema anterior, solo necesita hacerlo. Puede abrir el archivo de script /etc/profile y verificar si se usa ulimit-n en el archivo. limite la cantidad máxima de archivos que un usuario puede abrir al mismo tiempo. Si los encuentra, elimine esta línea de comando o cambie el valor de configuración a un valor apropiado. Luego guarde el archivo y el usuario podrá cerrar sesión y volver a iniciar sesión. system.
A través de los pasos anteriores, se elimina el límite del sistema en la cantidad de archivos abiertos para los controladores de comunicación que admiten el manejo de conexiones TCP de alta concurrencia. /p>
2. en conexiones TCP (consulte el siguiente artículo "Optimización de los parámetros del kernel" para comparar)
Escriba un cliente que admita conexiones TCP de alta concurrencia en Linux Al utilizar un controlador de comunicación del cliente, es posible que, aunque el sistema Se ha eliminado el límite en la cantidad de archivos que un usuario puede abrir al mismo tiempo, aún se producen aperturas simultáneas de archivos. Cuando el número de conexiones TCP simultáneas aumenta hasta un cierto número, ya no se pueden establecer con éxito nuevas conexiones TCP. Hay varias razones para esto.
La primera razón puede ser que el kernel de la red Linux tiene restricciones en el rango de números de puertos locales. En este momento, un análisis más detallado del motivo por el cual no se puede establecer la conexión TCP revelará que el problema es que la llamada connect () no pudo regresar y el mensaje de error del sistema es "No se puede asignar la dirección solicitada". Al mismo tiempo, si usa la herramienta tcpdump para monitorear la red en este momento, encontrará tráfico de red donde el cliente envía paquetes SYN cuando no hay conexión TCP. Estas condiciones indican que el problema radica en las limitaciones del kernel nativo del sistema Linux. De hecho, la raíz del problema radica en la limitación del rango de números de puerto local correspondiente a todas las conexiones TCP del cliente en el sistema por parte del módulo de implementación del protocolo TCP/IP del kernel de Linux (por ejemplo, el rango de números de puerto local restringido por el kernel está entre 1024 ~ 32768).
Cuando hay demasiadas conexiones de clientes TCP en el sistema al mismo tiempo, dado que cada conexión de cliente TCP ocupa un número de puerto local único (el número de puerto está dentro del límite de rango de números de puerto local del sistema), si el cliente TCP existente La conexión ha ocupado todos los números de puerto locales y el número de puerto local no se puede asignar para la nueva conexión del cliente TCP en este momento. Por lo tanto, en este caso, el sistema devolverá un error en la llamada connect() y establecerá el mensaje de error en ". No se puede asignar la dirección solicitada". Para obtener más información sobre esta lógica de control, consulte el código fuente del kernel de Linux. Tomando el kernel de Linux 2.6 como ejemplo, observe la siguiente función en el archivo tcp_ipv4.c:
static int tcp_v4_hash_connect(struct sock *sk)
Tenga en cuenta que la función anterior Tiene la misma función que la variable función de control de acceso sysctl_local_port_range. La inicialización de la variable sysctl_local_port_range se establece en la siguiente función en el archivo tcp.c:
void __init tcp_init(void)
El rango de números de puerto local predeterminado establecido cuando el kernel compilado puede ser demasiado pequeño, por lo que es necesario modificar esta restricción del rango de puertos locales.
El primer paso es modificar el archivo /etc/sysctl.conf y agregar la siguiente línea al archivo:
net.ipv4.ip_local_port_range = 1024 65000
Esto indica que el límite del sistema en el rango de números de puerto local está establecido entre 1024 y 65000. Tenga en cuenta que el valor mínimo del rango de puertos local debe ser mayor o igual a 1024; el valor máximo del rango de puertos debe ser menor o igual a 65535.
El segundo paso es ejecutar el comando sysctl:
[speng@as4 ~]$ sysctl -p
Si el sistema no muestra un mensaje de error , indica que el nuevo rango de puertos locales se configuró correctamente. Si el rango de puertos se configura como se describe anteriormente, un proceso puede, en teoría, establecer hasta más de 60 000 conexiones de clientes TCP simultáneamente.
La segunda razón por la que no se puede establecer una conexión TCP puede ser que el firewall IP_TABLE del kernel de la red Linux tiene un límite en el número máximo de conexiones TCP que se pueden rastrear. En este momento, el programa aparecerá bloqueado en la llamada connect (), como si se hubiera bloqueado. Si usa la herramienta tcpdump para monitorear la red, también encontrará que no hay tráfico de red para la conexión TCP cuando el cliente. envía el paquete SYN. Debido a que el firewall IP_TABLE en el kernel rastreará el estado de cada conexión TCP, la información de seguimiento se colocará en la base de datos conntrack ubicada en la memoria del kernel. Cuando hay demasiadas conexiones TCP en el sistema, el tamaño de esta base de datos es limitado. la capacidad de la base de datos es insuficiente, IP_TABLE no puede crear información de seguimiento para nuevas conexiones TCP. Esto se manifiesta como un bloqueo en la llamada connect(). En este punto, debe cambiar el límite del kernel en el número máximo de conexiones TCP rastreables de manera similar a cambiar el límite del kernel en el rango de números de puerto local:
El primer paso es modificar el directorio /etc. /sysctl.conf, agregue la siguiente línea:
net.ipv4.ip_conntrack_max = 10240
Esto indica que es necesario agregar una nueva línea al archivo /etc.ipv4. ip_conntrack_max para indicar que se utilizará para realizar un seguimiento de nuevas conexiones. p>
Esto indica que el límite del sistema en el número máximo de conexiones TCP rastreadas está establecido en 10240.
El segundo paso es ejecutar el comando sysctl:
[speng@as4 ~]$ sysctl -p
Si no hay ningún mensaje de error, el sistema se ha modificado con éxito. Se ha agregado un nuevo límite en el número máximo de conexiones TCP rastreadas.
Si los parámetros se configuran como se describe anteriormente, un solo proceso puede teóricamente establecer hasta más de 10,000 conexiones de clientes TCP simultáneamente.