2017-01-10 29 views
0

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

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

  • 使用IIS失败请求跟踪其示出了请求到达ServiceModel-4,而不与下面的信息继续: 模块名:ServiceModel-4.0 通知:AUTHENTICATE_REQUEST 的HTTPStatus:500 HttpReason:内部服务器错误 HttpSubStatus:0 ErrorCode:操作成功完成(0x0)

  • 用于调查Diag用于跟踪持续10分钟以上的请求并查看长时间运行的线程。堆栈跟踪如下:

Callstack1

或如下:

Callstack2

我见过这些都是从IIS进程调用。由于thiese是.Net功能,我怀疑是第一次被损坏的.Net安装,而且在服务器上安装了.Net4.5和.Net4(我不知道如何发生)。所以:

  • 我卸载.NET4和从窗户,开/关我关掉.Net4.5功能,重新启动后,我把它们,重新启动,但没有成功

  • ,我以后以同样的方式重新安装IIS(从Windows功能)。再次没有成功。

没有更多的想法。请帮忙!!

最好的问候, 姆拉登·尼科洛夫

+0

您是否有任何多线程代码在托管代码内部运行,可以抽取CPU,并且可能进入无限循环,没有可用的出口,从而无限消耗资源。我建议使用Dot Trace分析器并检查执行过程中的哪些方法,这比其他的Windows调试工具更具描述性。 –

回答

0

看来我已经找到了答案(但还没有使用点跟踪或其他工具)。有从多个线程访问通用字典。这似乎是一个已知的问题:

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/

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

但是我认为问题发生在这个字典(这是数据契约)的序列化过程中,它解释了记录的信息。 仍然无法解释这是如何发生的。如果有人能解释它,我认为这对每个人都是一个很好的知识。

相关问题