Problemas con el Threadpool de un Web Service...

10/02/2006 - 17:15 por Simón Candel Romero | Informe spam
Hola. Tengo un pequeño problema relacionado con un Web Service.

Un determinado Servicio de Windows de mi sistema (desarrollado a medida) se
"despierta" cada cierto tiempo y busca en un determinado directorio de mi
máquina si existe algún archivo XML. En caso afirmativo, lo analiza y
mediante un bucle "for each" recorre cada uno de sus nodos para extraer una
determinada información y se la manda a un servicio web para que la procese
(los parámetros que se le pasa al Servicio Web son todo strings, no se le
pasan estructuras de datos complejas).

Este proceso se realiza por cada uno de los nodos, es decir, si el XML tiene
400 nodos, se van a realizar 400 llamadas al web service para obtener su
respuesta. Un ejemplo del bucle podría ser este:

Dim Booleano as boolean
Dim Dato as string

For each Nodo en Listanodos
Dato = ExtraeValor(Nodo)
Booleano = LLamadaAlWebService(Dato)
HazAlgo(Booleano)
Next

El principal problema es que el Xml que tengo que tratar contiene unos 7460
nodos por lo que se realizan 7460 llamadas al Web Service. Pues bien, cuando
va aproximadamente por el nodo 20 salta la siguiente excepción en el Web
Service:

"System.InvalidOperationException: No hay suficientes subprocesos en el
objeto ThreadPool para completar la operación."

¿Que puedo hacer? Tengo una máquina con un Windows Xp y el .Net Framework
v1.0.3705.

Muchas gracias.
 

Leer las respuestas

#1 CESAR DE LA TORRE [MVP]
11/02/2006 - 22:02 | Informe spam
- ¿El Web Service está en la misma máquina o en diferente máquina que tu
Servicio Windows?
- ¿Haces llamadas síncronas o asíncronas al Web Service?
Bueno, en cualquier caso, ese problema puede ocurrir en el WebService porque
ASP.NET limita el número de 'worker threads' que se pueden usar por las
llamadas. Como estás haciendo un número muy intensivo de llamadas, tienes dos
opciones a tomar (simultanemamente o intependientemente):
1.- Aumentar el número de Threads simultáneos que puede usar ASP.NET.
probablemente tienes limitado ese número a 20 (creo recordar que es el número
por defecto). Para aumentar (hacer tunning) de esos parámetros, tienes que
cambiar los siguientes parámetros de tunning de IIS/ASP.NET:
- maxWorkerThreads: de 20 a 50 o incluso 100
- maxIoThreads: de 20 a 50 o incluso 100
- maxconnection: 12*número de procesadores
- executionTimeout: Ponle bastante para que no te salten time-outs.
Sobre todo los dos primeros son los importantes en tu caso. SE CAMBIAN en el
MACHINE.CONFIG. Ten cuidado, no pongas demasiados threads simultáneos o
puedes dejar al servidor demasiado 'ocupado'. Si tienes demasiados threads,
el cambio de contexto de threads que realiza la CPU le cuesta también
trabajo. Si monitorizas el sistema y ves que cuando usas tu Servicio no baja
el procesador del 100%, entonces, deberías bajar el número que te digo, menos
de 50, etc. Es algo a hacer pruebas, monitorizar y cambiar dependiendo de eso.
Este Tunning que te digo está bien si 'te sobra' máquina, varios
procesadores, etc.

2.-Si estás algo imitado de máquina, lo mejor es que cambies tu desarrollo
y lo limites a un número máximo de ejecuciones simultáneas, por ejemplo, 10 o
15. Es decir, que mediante un meanism de encolados (colas implementadas en
memoria p.e. con un simple array al que vas poniendo elementos a true según
haces llamadas que no han acabado y pones a false cuando han acabado dichas
llamadas, etc.). En definitiva que autolimites el número de ejecuciones
simultáneas.
CESAR DE LA TORRE
Software Architect
[Microsoft MVP - XML Web Services]
[MCSE] [MCT]

Renacimiento
[Microsoft GOLD Certified Partner]


"Simón Candel Romero" wrote:

Hola. Tengo un pequeño problema relacionado con un Web Service.

Un determinado Servicio de Windows de mi sistema (desarrollado a medida) se
"despierta" cada cierto tiempo y busca en un determinado directorio de mi
máquina si existe algún archivo XML. En caso afirmativo, lo analiza y
mediante un bucle "for each" recorre cada uno de sus nodos para extraer una
determinada información y se la manda a un servicio web para que la procese
(los parámetros que se le pasa al Servicio Web son todo strings, no se le
pasan estructuras de datos complejas).

Este proceso se realiza por cada uno de los nodos, es decir, si el XML tiene
400 nodos, se van a realizar 400 llamadas al web service para obtener su
respuesta. Un ejemplo del bucle podría ser este:

Dim Booleano as boolean
Dim Dato as string

For each Nodo en Listanodos
Dato = ExtraeValor(Nodo)
Booleano = LLamadaAlWebService(Dato)
HazAlgo(Booleano)
Next

El principal problema es que el Xml que tengo que tratar contiene unos 7460
nodos por lo que se realizan 7460 llamadas al Web Service. Pues bien, cuando
va aproximadamente por el nodo 20 salta la siguiente excepción en el Web
Service:

"System.InvalidOperationException: No hay suficientes subprocesos en el
objeto ThreadPool para completar la operación."

¿Que puedo hacer? Tengo una máquina con un Windows Xp y el .Net Framework
v1.0.3705.

Muchas gracias.

Preguntas similares