Wednesday, 14 September 2011


IIS thread counts and web services requests

Worker process:

In iis6 and iis 7, worker process is handling all the asp.net and WCF services.

Application pool and worker process:

Each application pool have one worker process

Thread handling in iis7

Each worker processor can handle 20 threads per processor, but this can be changed by editing machine.config with parameter called autoconfig=true/false. default thread timeout is 20 minutes(relatively so high), If asmx or wcf service not accepting any new requests, we should check about thread count, if it is exceeding than 20 performance will be affected.


Thread handling in ii6:
Default thread count value is decided based on server configuration, it may vary based on server hardware and architecture.

How to check thread count:
Task manager or performance counter both are good option to check thread count.

How to find which thread causing trouble:
performance counter, processor monitor, thread dumps are best option. If we go, iis thread dumps, iisstate needs to be installed.

Advisable:
While hosting asmx or wcf services, we have to divide services and host in separate application pool. While making call with some other services, we have to do timout, if destination service, not responding particular time and that timedout needs to be logged. It is really helpful during the investigation.

Wednesday, 7 September 2011


VB script for Message download from Biztalk Database

Dear All,






Below is the script which is very helpful specifically download messages from Biztalk (Specifically 2009, because biztalk 2009 don't have HAT, so it is not possible to download bulk messages from biztalk Database).

I really wants to thank Shankar balaji, baskar chandran and vincent choo(he is the author ofhttp://vincentchoo.wordpress.com/, where we took the main script and this script will download the message from biztalk db and terminate those instances). But we modified vb script will not terminate any instance,just download the message from biztalk db. We tested and it is went through success fully and now I am sharing this script with you all.

Copy the below line and paste it Savemsg.bat and save it
cscript savemsg.vbs -SR "Orchestration Name"

Copy the below script and paste it in a file called savemsg.vbs and save it

before running the script create folder "D:\savemessage\" or edit

msg.SaveToFile "D:\savemessage\" line in the script and finally you are ready to run.



' save_messages.vbs
' Enter save_messages.vbs with no arguments from a command prompt for usage
' This script needs to be run under a user account that is a member of the BizTalk Administrators
' group. This script needs to be run on a machine that is configured with BizTalk administration
' tools.

dim objBtsWmiNS, objMsg, svcinsts, inst, msg, ndx, size

Dim aryHostNames()
Dim aryObjQueues()
Dim aryHostBatchSize()

Dim strKey2Instance
Dim strQuery2Msg
Dim strServiceName

On Error Resume Next
Dim objArgs: Set objArgs = WScript.Arguments
If ( objArgs.Count = 0 OR objArgs.Count > 2) Then
PrintUsage()
wscript.quit 0
End If

wmiQuery = ""

'ServiceStatus = 16 – 'Completed With Discarded Messages' in BizTalk Server 2004
'ServiceStatus = 32 – 'Suspended (not resumable)'
'ServiceStatus = 4 – 'Suspended (resumable)'
'ServiceClass = 64 – 'Routing Failure Report'
'ErrorId = "0xC0C01B4C" – is how 'Completed With Discarded Messages' are exposed in BizTalk Server 2006

If (objArgs(0) = "-Z" OR objArgs(0) = "-z") Then
wmiQuery = "select * from MSBTS_serviceinstance where ServiceStatus=16 OR ErrorId='0xC0C01B4C'"
End If

If (objArgs(0) = "-A" or objArgs(0) = "-a") Then
wmiQuery = "select * from MSBTS_serviceinstance where ServiceStatus=4 OR ServiceStatus=32 OR ServiceStatus=16 OR ErrorId='0xC0C01B4C' OR ServiceClass=64"
End If

If (objArgs(0) = "-SR" or objArgs(0) = "-sr") Then
wmiQuery = "select * from MSBTS_serviceinstance where ServiceStatus=4"
End If

If (objArgs(0) = "-SNR" or objArgs(0) = "-snr") Then
wmiQuery = "select * from MSBTS_serviceinstance where ServiceStatus=32"
End If

If (objArgs(0) = "-DIS" or objArgs(0) = "-dis") Then
wmiQuery = "select * from MSBTS_serviceinstance where ServiceClass=32 AND ServiceStatus=8"
'ServiceClass = 32 'Isolated Adapter
'ServiceStatus = 8 'Dehydrated
End If

msgbox wmiQuery

saveMessagesBeforeTermination = True

If ( objArgs.Count > 1) Then
strServiceName = objArgs(1)
End If

If(wmiQuery = "") Then
PrintUsage()
wscript.quit 0
End If

wscript.echo "–>Connecting to BizTalk WMI namespace"
Set objBtsWmiNS = GetObject("WinMgmts:{impersonationLevel=impersonate, (security)}\\.\root\MicrosoftBizTalkServer")
If Err <> 0 Then
CheckWMIError
wscript.quit 0
End If

wscript.echo "–>Getting BizTalk host collection"
Set hosts = objBtsWmiNS.ExecQuery("select * from MSBTS_HostSetting")
If Err <> 0 Then
CheckWMIError
wscript.quit 0
End If

hostCount = hosts.count

wscript.echo "hostcount -> " & hostcount

ReDim aryHostNames(8)
ReDim aryObjQueues(8)
ReDim aryHostBatchSize(8)

wscript.echo "–>Retrieve BizTalk host names and loading host queues"
ndx = 0
For Each host in hosts
wscript.echo "Found host " & host.Properties_("Name")
aryHostNames(ndx) = host.Properties_("Name")
Set aryObjQueues(ndx) = objBtsWmiNS.Get("MSBTS_HostQueue.HostName=""" & aryHostNames(ndx) & """")
If Err <> 0 Then
CheckWMIError
wscript.quit 0
End If
ndx = ndx + 1
Next

wscript.echo "–>Getting collection of service instances"
Set svcinsts = objBtsWmiNS.ExecQuery(wmiQuery)

'Iterate through instances and save them in host-specific arrays.

wscript.echo "–>Start iterating service instances"
totalCount = 0
For Each inst in svcinsts
If (objArgs.Count = 1 Or (objArgs.Count > 1 And strServiceName = inst.Properties_("ServiceName") ) ) Then

wscript.echo "Found suspended instance """ & inst.Properties_("ServiceName") & """ on host " & inst.Properties_("HostName")
'Resolve host index
For hostIdx = 0 To 8
If aryHostNames(hostIdx) = inst.Properties_("HostName") Then
Exit For
End If
Next

'16 is an internal service class that cannot be terminated
If 16 = inst.Properties_("ServiceClass") Then
wscript.echo "Skipping BizTalk internal service instances (they cannot be terminated anyway)"
Else
'64 is a routing failure report and doesn't have messages that can be saved
If 64 = inst.Properties_("ServiceClass") Or 16 = inst.Properties_("ServiceClass") Then
saveMessagesBeforeTermination = False
End If

errorCountSavingMessages = 0
If saveMessagesBeforeTermination Then
strQuery2Msg = "select * from MSBTS_MessageInstance where ServiceInstanceID=""" & inst.Properties_("InstanceId") & """"
Set msgInsts = objBtsWmiNS.ExecQuery(strQuery2Msg)
For Each msg in msgInsts
msg.SaveToFile "D:\savemessage\"
If Err <> 0 Then
CheckWMIError
wscript.echo "Failed to save MSBTS_MessageInstance"
wscript.echo Err.Description & Err.Number
errorCountSavingMessages = errorCountSavingMessages + 1
Else
wscript.echo "Saved message " & msg.Properties_("MessageInstanceID")
End If
Next
End If

totalCount = totalCount + 1
End If

End If
Next

' Delete whatever is left
'For hostIdx = 0 To hostCount-1
'If aryHostBatchSize(hostIdx) > 0 Then
'TerminateAccumulatedInstacesForHost hostIdx
'End If
'Next

wscript.echo "SUCCESS> " & totalCount & " instances were found and attempted to be saved"

'This subroutine deals with all errors using the WbemScripting object.
'Error descriptions are returned to the user by printing to the console.
Sub CheckWMIError()

If Err <> 0 Then
On Error Resume Next
Dim strErrDesc: strErrDesc = Err.Description
Dim ErrNum: ErrNum = Err.Number
Dim WMIError : Set WMIError = CreateObject("WbemScripting.SwbemLastError")

If (TypeName(WMIError) = "Empty" ) Then
wscript.echo strErrDesc & " (HRESULT: " & Hex(ErrNum) & ")."
Else
wscript.echo WMIError.Description & "(HRESULT: " & Hex(ErrNum) & ")."
Set WMIError = nothing
End If

'wscript.quit 0
End If

End Sub

Sub PrintUsage()
wscript.echo "Usage:"
wscript.echo "cscript save_messages.vbs < -Z | -A | -DIS | -SR | -SNR > [Port/Orchestration name]"
wscript.echo
wscript.echo " -Z saves all ""Zombie"" instances (e.g. completed with discarded messages)"
wscript.echo " -A saves all suspended and zombie instances as well as all routing failure reports"
wscript.echo " -SR saves suspended resumable instances only"
wscript.echo " -SNR saves suspended non-resumable instances only"
wscript.echo " -DIS saves all dehydrated 'isolated adapter' instances"
wscript.echo " optionally supply the name of the orchestration or port name to filter on specific instances"
wscript.echo
wscript.echo " Ensure that the C:\Temp folder exists before running as that is where it saves the instances"
wscript.echo
wscript.echo " Example: cscript save_messages.vbs -z ""E-Reporting Data Transform Port"""
wscript.echo
End Sub