【发布时间】:2016-10-21 13:53:33
【问题描述】:
我有一个托管在 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 上许多人的建议将应用程序池的 IdleTimeout 属性设置为 0。
无论何时使用流,我都会在所有地方进行处理。所以所有的流都关闭了。
谁能告诉我谁在中止线程以及为什么以及是否有任何方法或工具来追踪线程中止启动的原因?
【问题讨论】:
-
客户端是否有可能中止请求,导致服务器端也会产生异常
-
ASP.NET 会根据需要随时生成和终止工作进程。您的线程可能刚刚被 ASP.NET 关闭。找出您的计算机上可以同时运行多少个线程。还要尝试在测试期间跟踪处理器性能。
-
您增加了池调用的数量,但没有增加缓冲区大小。我感觉有很多电话因此而被挂断。
-
哪个服务正在记录错误?客户端服务还是 WCF 服务?
标签: c# wcf threadabortexception thread-abort