我有一个问题,我现在正在争取一周。我在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分钟以上的请求并查看长时间运行的线程。堆栈跟踪如下:
或如下:
我见过这些都是从IIS进程调用。由于thiese是.Net功能,我怀疑是第一次被损坏的.Net安装,而且在服务器上安装了.Net4.5和.Net4(我不知道如何发生)。所以:
我卸载.NET4和从窗户,开/关我关掉.Net4.5功能,重新启动后,我把它们,重新启动,但没有成功
,我以后以同样的方式重新安装IIS(从Windows功能)。再次没有成功。
没有更多的想法。请帮忙!!
最好的问候, 姆拉登·尼科洛夫
您是否有任何多线程代码在托管代码内部运行,可以抽取CPU,并且可能进入无限循环,没有可用的出口,从而无限消耗资源。我建议使用Dot Trace分析器并检查执行过程中的哪些方法,这比其他的Windows调试工具更具描述性。 –