我在IIS 6.0 / win 2003机器下托管了一个wcf服务。服务有这样的方法。
List<CustomObject> ProcessImageData(List<CustomObject> lstData)
{
lstSharedProcessedImages = lstData;
for (int idx = 0; idx < lstData.Count; )
{
CurrentThreadRoom = MAX_THREAD_COUNT - ThreadRunningCount;
for (int ctr = 0; ctr < CurrentThreadRoom; ctr++)
{
runBrowserThread(lstData[idx].Url, lstData[idx].Path);
idx++;
if (lstData.Count == idx)
break;
}
while (ThreadRunningCount >= MAX_THREAD_COUNT)
{
Thread.Sleep(SleepTimeMiliseconds);
}
}
while (ThreadRunningCount > 0)
{
Thread.Sleep(SleepTimeMiliseconds);
}
return lstSharedProcessedImages;
}
<service behaviorConfiguration="WcfServices.Service1Behavior" name="WcfServices.HtmlToImageService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages" contract="WcfServices.IHtmlToPngService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
<behaviors>
<serviceBehaviors>
<behavior name="WcfServices.Service1Behavior">
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000"/>
<serviceMetadata httpGetEnabled="true"/>
<dataContractSerializer maxItemsInObjectGraph="6553500"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</behaviors>
<wsHttpBinding>
<binding name="WSHttpBinding_IHtmlToImageService" closeTimeout="00:10:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
只有一个客户端在循环中调用wcf服务的方法,并等待一分钟进行每次迭代以接收结果。 wcf服务产生10个线程(所有独立且不相互依赖)来完成每个请求。这些线程中的每一个都创建一个WebBrowser实例来完成其工作。处理请求通常需要6-7秒,并将响应发送回客户端。大约80%的电话都是成功的。
现在的问题是,
在客户端调用服务方法时,在Web服务器上,我们看到线程数量大幅增加(从总共13k到大约18k)。该服务应该创建10个线程/请求,并且没有特定的代码在完成时终止该线程。假设一旦完成的工作完成,线程就会自行死亡(也会释放内存等)。
由于某种原因,内存中存在大量线程,导致服务器无响应。也不确定为什么在#of threads中出现如此巨大的飙升。
然后对服务器的所有后续调用都会失败。客户端不断调用新请求,并继续有以下例外情况。
&#34;这也可能是由于HTTP请求上下文被服务器中止(可能是由于服务关闭)。&#34;,&#34;请求通道在等待时间超时回复00:00:59.9749975。&#34;等等...
当内存被重新收集并且线程数再次降至13k或者其他什么时,服务再次起作用,处理请求,线程峰值加起来,新的异常和恶性循环继续。
这里出了什么问题?假设内存中的#of个线程是罪魁祸首,我该怎样强制清理服务器?无论如何线程清理似乎正在发生但是太迟了因为那时太多例外了。
你们建议的是什么?非常感谢任何输入!
答案 0 :(得分:0)
鉴于您尚未共享任何代码或配置,很难说。可以怀疑所有的胎面都没有完成,因此螺纹的数量增加了每次通话10次,如果没有完成。
您可以使用分析器或PerfMon来监控线程数,或者为您的服务添加跟踪调用和跟踪侦听器以了解更多信息。