我有一个托管在 IIS 6.0 上的 WCF 服务(内置于 .NET 框架 3.5)。
代码流程如下
- 客户端(这是另一个 Web 服务)调用 WCF 服务
- WCF 服务调用一个线程在后台进行处理并立即响应被调用者。
- 后台线程完成所有处理后,回调线程。这个调用基本上是一个 HTTPs 请求,因为客户端是一个 Web 服务。
我正在对我的 WCF 服务进行负载测试以定义阈值。观察结果如下:
在 1 分钟内向 WCF 服务发出的 1024 个请求的大约 3 次迭代成功通过。完成每次迭代所需的时间约为 25-30 分钟。然而,从第 4 次迭代中可以看到批量失败。大约 50% 的请求失败,以下例外。
异常线程被中止。
堆栈跟踪
21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap)
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
.
.(My function calls stack trace)
.
.
我试图解决此问题的更改如下:
<behavior>
<serviceThrottling maxConcurrentCalls="2000"
maxConcurrentInstances ="2400"
maxConcurrentSessions ="400"/>
</behavior>
在 web.config 中
<system.web>
<compilation debug="false" />
<httpRuntime executionTimeout="1800"/>
</system.web>
在 web.config 中
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
在 web.config 中
ServicePointManager.DefaultConnectionLimit = 100; (Change in code)
正如 StackOverflow 上的许多人所建议的那样,我已将 App 池的 IdleTimeout 属性设置为 0。
无论在哪里使用溪流,我都会在所有地方处理。所以所有的流都关闭了。
谁能告诉我谁在中止线程以及为什么以及是否有任何方法或工具来追踪线程中止启动的原因?