小编azu*_*ric的帖子

WCF服务停止处理呼叫15秒

我在我的一个WCF服务中遇到了一个奇怪的行为.这项服务工作良好约1.5年,但几周后它显示出某种"停电"(不幸的是我无法发布图像因为我是新来的).

虽然仍有来电,但来电/秒降至0."停电"总是15秒.在这15秒之后,处理排队的呼叫.它不能与网络相关,因为90%的呼叫来自同一服务器上的另一个WCF服务,并且没有其他服务(总共10个)受此行为的影响.服务本身确实继续工作,如计算内部资源,进行数据库更新等.不会增加内部工作的执行时间.这发生在大约18-25分钟,但停电总是15秒.

OS

Windows Server 2012

WCF作为Windows服务运行

WCF配置:

InstanceContextMode = InstanceContextMode.PerCall,

ConcurrencyMode = ConcurrencyMode.Multiple,

UseSynchronizationContext = false,

IncludeExceptionDetailInFaults = true

Binding = WebHttpBinding

并发节流设置:

MaxConcurrentCalls = 384,

MaxConcurrentInstances = 2784,

MaxConcurrentSessions = 2400

我已经做了一些调查:

  1. WCF油门设置

我在服务发生的确切时间内完全转储了服务.ConcurrentCalls和ConcurrentSessions都没用完.转储没有显示可能导致问题的任何异常.

  1. MAX TCP Conenction

监控活动TCP连接远非其限制.

  1. 交换机中的端口中继

由于没有来电,甚至来自本地服务(使用localhost),我很确定它与网络无关.

  1. 加载问题

低负载(见下文)和高负载(传入呼叫的​​5倍)会出现此问题.其频率不会根据负载而变化.我还尝试在我的登台系统上重现行为,每秒约600-1000次呼叫.我设法将服务带入一个状态,我发送更多来电/秒,因为服务可以处理.突出的电话增加了,在某些时候,服务当然崩溃了.但这种行为从未出现过.

  1. 线程池耗尽

当服务运行50个线程并且还有200个线程时,会出现此问题.虽然没有更多可用线程,但会出现错误消息.

我已经没有可能引起这种行为的事情了.我认为,它可能是GC阻塞线程,因为该服务在RAM中使用大约10GB.它是一种内存缓存服务.或者它可能是操作系统(Windows Server 2012)或与Windows服务本身相关的东西.

有没有人自己面对这样的事情,或者有人有另外的想法会导致什么?

编辑:现在我可以发布图片:

在此输入图像描述

编辑: GC堆转储(感谢usr)

在此输入图像描述

我看到近50%(总共70%,包括相关参考文献)是由一本大字典引起的.2700万条目(基于内存转储堆).我将专注于重构它.里面有很多未使用的物品.也许这会有所帮助.

另外,我将从msdn 添加GC.WaitForFullGCApproach方法,以查看当服务停止处理传入请求时GC是否正在运行.

当我知道更多时,我会告诉你.

编辑: GC统计(包括停电14秒)

•CLR Startup Flags: CONCURRENT_GC
•Total CPU Time: 42.662 msec
•Total GC CPU Time: 2.748 msec
•Total Allocs : …
Run Code Online (Sandbox Code Playgroud)

c# wcf multithreading windows-services webhttpbinding

6
推荐指数
1
解决办法
713
查看次数