在wcf请求通过后,Service Model-4模块通过IIS进程100%CPU

时间:2017-01-10 17:07:08

标签: c# wcf iis

我有一个问题,我现在已经打了一个星期了。我在Windows Server 2012 R2上的IIS 8.5中运行WCF服务,并且每30秒发出一个或两个请求的Windows服务客户端。在某些时候(通常运行两个小时的服务),其中一个请求导致服务应用程序池(与其他应用程序池分离)进程获得CPU使用率。在IIS工作进程部分可以看到该请求永远不会结束,并且在ServiceateSodel-4模块中处于AuthenticateRequest状态(即很可能是在某处无限循环)。在某些时候,另一个这样的请求被添加到第一个请求,直到它们变为四个,永远停留并导致100%的CPU使用率(机器上有4个逻辑处理器)。我做了什么调查,解决了这个问题:

  • 使用wcf跟踪和自定义日志记录来确定问题所在。 Wcf跟踪实际上显示了以毫秒为单位成功传递给服务器的所有请求(!)(与此同时,客户端的wcf跟踪显示了对相同请求的超时)。自定义日志记录还显示服务代码正在调用所请求操作的returtn。该方法的结果是两个简单的dto对象,因此没有可能的序列化问题,也没有在从服务发送回复之前正在执行的enpoint行为或wathever自定义代码(方法代码除外,正如我提到的那样成功返回)

  • 使用iis失败的请求跟踪,该请求跟踪显示请求到达ServiceModel-4而不继续以下信息: ModuleName:ServiceModel-4.0 通知:AUTHENTICATE_REQUEST HttpStatus:500 HttpReason:内部服务器错误 HttpSubStatus:0 ErrorCode:操作成功完成(0x0)

  • 使用Debug Diag跟踪持续超过10分钟的请求,并查看运行时间较长的线程。堆栈跟踪如下:

Callstack1

或如下:

Callstack2

我见过这些是从iis进程调用的。由于这是.Net功能,我怀疑第一次损坏.Net安装,而且服务器上安装了.Net4.5和.Net4(我不知道究竟会发生什么)。所以:

  • 我卸载.Net4和从Windows功能打开/关闭我关闭.Net4.5功能,重新启动,然后我打开它们,重新启动,没有成功

  • 之后我以相同的方式重新安装了IIS(来自Windows功能)。再次没有成功。

没有更多的想法。

1 个答案:

答案 0 :(得分:1)

似乎我找到了答案(但没有使用Dot Trace或其他工具)。可以从多个线程访问通用字典。这似乎是一个众所周知的问题:

https://blogs.msdn.microsoft.com/tess/2009/12/21/high-cpu-in-net-app-using-a-static-generic-dictionary/

https://blogs.msdn.microsoft.com/asiatech/2009/05/11/asp-net-application-100-cpu-caused-by-system-collections-generic-dictionary/

实际上我在研究开始时注意到了这个问题,但是把它排除了,因为我无法重现它(可能是因为我没有在iis应用程序中测试字典,当然我收到了各种例外情况,但不是100%的Cpu),主要是因为所有日志都显示访问字典的代码已经通过,上面的堆栈跟踪也与字典无关。

但是我认为问题发生在这个字典的序列化(数据合同)中,它解释了记录的信息。 仍无法解释这究竟是怎么发生的。如果有人能够解释它,我认为这对每个人都是一个很好的知识。