Un fin de semana como cualquier otros y sin ninguna razon aparente, aparecieron en el Event Viewer los siguientes mensajes de error:

5740 SNODE052 "The adapter ""SOAP"" raised an error message. Details "There were not enough free threads in the ThreadPool object to complete the operation. "

5740 SNODE052 "The adapter ""SOAP"" raised an error message. Details "Exception has been thrown by the target of an invocation."

5743 SNODE052 "The adapter failed to transmit message going to send port htp://transcce/vcservices/wsbackend.asmx  it will be retransmitted after the retry interval specified for this Send Port. Details:"There were not enough free threads in the ThreadPool object to complete the operation. "

 

Revisando la evidencia (Event viewer: mostrado, HAT: Nada) y la configuración (machine.config) en los servidores sabemos que :

Los SOAP adapters se utilizan para hacer llamadas a los SOAP web services desde las orquestaciones, y estos SOAP adapters utilizan el mismo Threadpool de .NET estándar para despachar los request por la red y procesar las respuestas que vienen de los WebServices. Cuando el adaptador hace muchas llamadas y se alcanza un pico, se comienzan a registrar las excepciones mostradas ateriormente.

El engine de BizTalk 2004 utiliza el framework 1.1 que ya es bien sabido, possee un problema con el Stack ASPNET HTTP que afecta la suficiencia en el numero de threads del threadpool configurado por defecto en el archivo Machine.config, cuando se saturan los threads del threadpool, que son usados a demanda por todos los send ports y otros componentes de Biztalk, suceden estos errores. El reinicio de los host , limpiara el espacio de memoria del proceso y siempre aliviara este problema pues reestablece el pool a sus valores maximos y minimos por defecto y limpiando por supuesto todo procesamiento.

Lo que se debe hacer como primer paso para solventar esto es modificar los parametros por defecto del machine.config en los servidores donde se ejecuta el Framework 1.1, con mucho cuidado guiandose por el siguiente KB:

http://support.microsoft.com/kb/821268 

Esto aliviara el problema, sin embargo existe una metrica indicando que por encima de 150 SOAP request/sec a podriamos ver este mensaje nuevamente.

Esta configuracion es general para el Framework 1.1 en el servidor, adicionalmente como se menciona en el articulo de Connected Services Framework Components (http://msdn.microsoft.com/en-us/library/aa306289.aspx) si se ha instalado el SP1 de BizTalk server se puede hacer un tunning adicional para biztalk:

Usando las mejoras del BizTalk Server 2004 Service Pack 1 para consumir Web Services bajo carga.

Con el SP1 se puede controlar y optimizar como BizTalk usa el .NET thread pool cuando consume Web services. Se necesitan crear las siguientes llaves del Registry:

HKLM\SYSTEM\CurrentControlSet\Services\BTSSvc[appguid]\CLR Hosting
MaxWorkerThreads: DWORD
MaxIOThreads: DWORD
MinWorkerThreads: DWORD
MinCompletionPortThreads: DWORD
MinIOThreads: DWORD

.Para un CPU de 4 procesadores:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTSSvc{8C6C0034-E23C-4507-9261-E91EF41125C9}\CLR Hosting\MaxWorkerThreads (REG_DWORD) = 100
 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTSSvc{8C6C0034-E23C-4507-9261-E91EF41125C9}\CLR Hosting\MaxIOThreads (REG_DWORD) = 100
 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTSSvc{8C6C0034-E23C-4507-9261-E91EF41125C9}\CLR Hosting\MinWorkerThreads (REG_DWORD) = 25
 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTSSvc{8C6C0034-E23C-4507-9261-E91EF41125C9}\CLR Hosting\MinIOThreads (REG_DWORD) = 25

Guiarse por el KB antes mencionado y otros como este : http://msdn.microsoft.com/en-us/library/cc594552(v=BTS.10).aspx es de suma importancia para establecer los valores mas adecuados, hay una formula de referencia que puede ser alterada en base a un monitoreo y condiciones particulares de la plataforma , pero no se debe abusar.

Este problema de agotamiento de threads del threadpool se ha venido resolviendo en versiones posteriores de Biztalk (2006 adelante) que utilizan un framework mejorado, ya en Biztalk 2010 existe dentro de la consola de administracion la posibilidad de configurar los valores del Threadpool directamente.

Las Instancias de los Host deben ser reiniciadas luego de estos cambios.

Unos KBs relacionados a problemas con el SOAP Adapter son:
 
 
http://support.microsoft.com/kb/886966
http://support.microsoft.com/kb/952567
http://support.microsoft.com/kb/815637
http://support.microsoft.com/kb/821268
http://support.microsoft.com/kb/915599