具有多个线程的WCF服务问题

时间:2016-03-09 00:18:17

标签: c# multithreading performance wcf

我在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; 
    }

web.Config(服务)文件

    <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>

客户端的app.config文件

    <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%的电话都是成功的。

现在的问题是,

  1. 在客户端调用服务方法时,在Web服务器上,我们看到线程数量大幅增加(从总共13k到大约18k)。该服务应该创建10个线程/请求,并且没有特定的代码在完成时终止该线程。假设一旦完成的工作完成,线程就会自行死亡(也会释放内存等)。

  2. 由于某种原因,内存中存在大量线程,导致服务器无响应。也不确定为什么在#of threads中出现如此巨大的飙升。

  3. 然后对服务器的所有后续调用都会失败。客户端不断调用新请求,并继续有以下例外情况。

  4. &#34;这也可能是由于HTTP请求上下文被服务器中止(可能是由于服务关闭)。&#34;,&#34;请求通道在等待时间超时回复00:00:59.9749975。&#34;等等...

    当内存被重新收集并且线程数再次降至13k或者​​其他什么时,服务再次起作用,处理请求,线程峰值加起来,新的异常和恶性循环继续。

    这里出了什么问题?假设内存中的#of个线程是罪魁祸首,我该怎样强制清理服务器?无论如何线程清理似乎正在发生但是太迟了因为那时太多例外了。

    你们建议的是什么?非常感谢任何输入!

1 个答案:

答案 0 :(得分:0)

鉴于您尚未共享任何代码或配置,很难说。可以怀疑所有的胎面都没有完成,因此螺纹的数量增加了每次通话10次,如果没有完成。

您可以使用分析器或PerfMon来监控线程数,或者为您的服务添加跟踪调用和跟踪侦听器以了解更多信息。