La creación de un gran número de hilos y la aceptación de un gran número de solicitudes no significa que su servidor será capaz de procesar las solicitudes
Si tiene N hilos y sólo M físicas procesadores/núcleos , entonces cada hilo obtendrá 1 procesador si M >= N
y un promedio de M/N
procesadores si M < N
. Supongamos que tiene N solicitudes que se ejecutan cada una en una secuencia, y cada solicitud toma R
segundos de tiempo de CPU. El tiempo promedio transcurrido T
tomado para ejecutar una solicitud es T = Min(R, R * N/M) seconds
. Es bastante claro que a medida que aumenta N
(el número de subprocesos activos y solicitudes activas) el tiempo medio transcurrido T
para cada solicitud individual aumenta proporcionalmente.
Además de eso, si tiene muchos subprocesos, todos usarán memoria, y todos competirán por acceder a estructuras de datos compartidas ... o a la base de datos. Todo este uso y contención de recursos adicionales está aumentando los gastos generales del sistema en su conjunto de varias maneras.
Entonces, lo que sospecho que está sucediendo es que con ese número de subprocesos cada uno tratando de procesar las solicitudes simultáneamente, el tiempo T
está comenzando a aproximarse al tiempo de espera de solicitud del lado del cliente o del servidor. (Y tenga en cuenta que los caprichos del planificador, etc. significan que el tiempo real para cualquier solicitud dada podría ser menor o considerablemente mayor que el promedio). Cuando una solicitud expira, esto a su vez reduce el rendimiento en términos de solicitudes que reciben completado, porque el trabajo realizado en cada solicitud expirada se desperdicia (típicamente).
A menos que las solicitudes implican hablar de frenar los servicios externos, te aconsejo que para reducir el número de hilos a no más de 200 ... el valor por defecto de Tomcat 2. Espero que esto aumente el rendimiento del sistema. No necesariamente le permitirá procesar todas las 1000 solicitudes que se lanzaron en ese período, pero preveo que aumentará la cantidad de solicitudes que se procesaron con éxito.
1 - De hecho, aumentar el número de hilos a 1000 ni siquiera significa que podrá aceptar 1000 solicitudes. Si tiene cientos de hilos en estado RUNNABLE, es probable que el hilo oyente de Tomcat (el que llama al ServerSocket.accept()
) tenga falta de CPU y no pueda mantener el ritmo de solicitud de llegada.
2 - Necesitará hacer algunos ajustes de rendimiento en su sistema, pero no me sorprendería si reducir aún más las cosas mejoradas. Dependerá de su hardware, su aplicación y (supongo) su base de datos back-end.
Debería hacer un volcado de subprocesos para averiguar qué está bloqueando las solicitudes, porque _ha configurado _ 2000 hilos (máximo pero no mínimo, por lo que Tomcat necesitará crear más hilos sobre la marcha). Sin embargo, 2000 hilos son enormes, ¿estás seguro de que necesitas tantos? –
Hola Frank, solo estoy jugando para ver si el aumento de los hilos hace alguna diferencia y también consciente de que podría provocar problemas de memoria. En este punto, me gustaría configurar el servidor para que acepte tantas conexiones como sea posible sin un defecto de 200 hilos (como establece tomcat de forma predeterminada). Tengo curiosidad por saber cómo hacer un volcado de hilo por cierto. Cualquier ayuda es muy apreciada. Gracias.!! – Sirish
Para obtener un volcado de hilo, puede 'matar -3 PID' (si está en algún Unix, hay una combinación Ctrl-algo en Windows para lograr el mismo resultado) que imprimirá el volcado de hilo en el resultado estándar, o use 'jstack PID> threads.txt', jstack es parte del JDK. Incluso si solo tiene 200 hilos, si son todos usados por solicitudes concurrentes, será una lectura de "larga duración" para analizar. –