thread pelicula hilos español ejemplo java web-services concurrency threadpool

java - pelicula - Número razonable de subprocesos para el conjunto de subprocesos que ejecutan solicitudes de servicio web



threadpool java español (9)

Al crear un objeto Executor de FixedThreadPool en Java, debe pasar un argumento que describa la cantidad de subprocesos que el Executor puede ejecutar simultáneamente. Estoy creando una clase de servicio que es responsabilidad de procesar una gran cantidad de números de teléfono. Para cada número de teléfono que necesito para ejecutar el servicio web (ese es mi cuello de botella) y luego guardar la respuesta en un mapa hash.

Para hacer que este cuello de botella sea menos perjudicial para el rendimiento de mi servicio, he decidido crear la clase Worker que recupera los elementos sin procesar y los procesa. La clase Worker implementa la interfaz Runnable y yo ejecuto Workers utilizando Executor.

El número de trabajadores que se pueden ejecutar al mismo tiempo depende del tamaño de Executor FixedThreadPool. ¿Cuál es el tamaño seguro para un ThreadPool? ¿Qué puede suceder cuando creo FixedTheradPool con un número grande como argumento?


Algo que podría considerarse está mirando

Runtime.getRuntime().availableProcessors()

lo que da una cierta dirección sobre la cantidad de hilos que tendrían sentido para el sistema.


He leído en alguna parte que el número óptimo de subprocesos es el número de núcleos * 25. Parece que .NET usa esto como predeterminado para ThreadPool. Sin embargo, si tiene un gran número de llamadas de servicio web, es mejor que use un solo hilo y verifique una lista de llamadas de servicio web para obtener una respuesta. Cuando llegue la respuesta, simplemente procese la entrada y elimínela de la lista.


Me pregunto si estaría mejor usando NIO en lugar de subprocesos, ya que su factor limitante será el servidor de servicios web + el cuello de botella de la red, no la CPU del cliente.

De lo contrario, a lo sumo, no debe exceder la cantidad de conexiones simultáneas que su servicio web puede admitir.


No olvide que cada subproceso que cree también hará demandas en la memoria por su tamaño de pila. Por lo tanto, la creación de un grupo de subprocesos afectará la huella de memoria de su proceso (tenga en cuenta que algunos grupos no crean los subprocesos hasta que realmente son necesarios, por lo que al inicio no verá ningún aumento de memoria).

Este tamaño de pila se puede configurar a través de -Xss (similar a -Xmx etc.). Creo que el valor predeterminado es 512 Kb por hilo. En este momento no puedo encontrar ninguna autoridad para confirmar eso.


Si cada cómputo es equivalente a una llamada a un servicio web, debe considerar cuánta carga está cargando en ese servicio / cuántas conexiones concurrentes ese servicio tolerará o permitiría los propietarios de los servicios. La mayoría de los servicios de acceso público esperarán una sola conexión de un solo usuario a la vez. Si es posible, póngase en contacto con los propietarios de los servicios para conocer sus políticas de uso. El número de tales conexiones determinará el número de subprocesos que puede utilizar.


Si cada subproceso de trabajo necesita hacer una llamada de servicio web, entonces la cantidad de subprocesos en su grupo debe verse fuertemente influenciada por la cantidad de solicitudes simultáneas que puede manejar su servicio web. Más hilos que eso no harán más que abrumar al servicio web.


Si está haciendo cálculos pesados, por ejemplo, para manipulaciones de matrices paralelas, entonces la regla de oro es tener el número de subprocesos para el número de procesadores.


Si tiene acceso de usuario al servicio web, considere la posibilidad de crear una función por lotes para verificar múltiples números de teléfono en una llamada.

En .NET más reciente hay un ThreadPool que puede crecer y reducirse en función de su propio perfil de rendimiento. Desafortunadamente, la versión de Java es fija o crece hasta un límite en función del trabajo entrante.

Una vez tuvimos preocupaciones similares. Nuestra solución fue permitir al cliente ajustar el tamaño de la piscina y ajustar el rendimiento a su gusto.

Puede haber algunas propiedades de red y datos consideradas para el tamaño del grupo de operaciones de E / S: ancho de banda de red, tamaños de mensajes, tiempo de procesamiento y estilo del servicio web, número de núcleos locales.


Supongamos que el servicio web es infinitamente escalable y que a nadie le importará que lo envíe por correo no deseado con solicitudes. Supongamos también que las respuestas del servicio web están en el rango de 1 segundo, mientras que el tiempo de procesamiento local es de 5 milisegundos.

El rendimiento se maximiza cuando tiene la misma cantidad de subprocesos ocupados que procesando núcleos.

Bajo estas suposiciones, no podrá maximizar el rendimiento en un procesador de múltiples núcleos para cualquier tamaño de conjunto de subprocesos. Para lograr transacciones máximas por segundo, debe romper el hilo por modelo de conexión. Busque la E / S sin bloqueo (NIO) mencionada anteriormente o una implementación de Java del patrón de token de finalización asíncrono (finalización de E / S en Windows).

Tenga en cuenta que la memoria de pila que está reservada para cada subproceso creado es en realidad un espacio de direcciones reservado, no una memoria asignada o confirmada real. A medida que la pila intenta crecer, se lanzan excepciones, lo que hace que la memoria de la pila se comprometa a pedido. La consecuencia es que solo es realmente relevante para los administradores de memoria de 32 bits. Para la memoria de 64 bits, tiene un gran espacio de direcciones, aunque solo respalde una pequeña parte de ese espacio con la memoria física. Al menos, así es como entiendo que funciona Windows, no estoy seguro del mundo Unix.