2

我已经编写了一个WCF服务,该服务在运行Windows Server 2008 R2的计算机上作为Windows服务托管。 我的问题是,在运行24小时内,服务开始消耗100%cpu,如任务管理器中所示。 现在,我正试图解决这个问题的底部。使用100%cpu的WCF窗口服务

我曾妄图:

  1. 记录在所有回路错误(尝试,赶上等)和服务方式。
  2. 从任务管理器读取资源监视器。
  3. 在我的服务上运行性能监视器。
  4. 中的Microsoft SQL服务器运行数据库活动监控(看看是否有锁导致问题)

无论是做法已经产生了是什么原因导致100%的CPU利用率的一个清晰的认识。 请告诉我一种可以成功调试的方法。

在此先感谢!

回答

3

去年我遇到了这个问题,因为Web服务基本上表现得像内存泄漏一样,缓慢地工作到100%的内存和CPU使用率。

我们发现的一个问题是,我的ServiceHost obj(每个请求一个)的每个实例都使用了一个公共共享变量(db连接,我认为),它从运行我的Web服务的可执行程序中借用我们已经作为Windows服务运行。该共享变量阻止了一些内存被释放。一旦我们消除了共享变量,一些内存和CPU问题就消失了。

我们做的另一件事是让我们的ServiceHost iDisposable使用的类,以便我们可以将它放入Using语句中,理论上应该在End Using命中时从内存中卸载对象。

所以,这两件事情的结合对我们有所不同,所以希望它可能适用于您。

你可能会尝试的另一件事是让你的ServiceHost成为单例类,或者改变你的并发模式。

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, 
InstanceContextMode:=InstanceContextMode.PerCall)> 

在我们的情况下,我们运行多个和实例我们的语境percall,但你可以更改设置,看看您的问题就会消失。

+0

在数据访问层,我正在实现单例...你认为这是一个问题。 – SutharMonil

+0

只有一种方法可以找出......改变它,看看症状是否消失。 一个想法,确保您的Web服务客户端明确关闭他们的连接。我不知道你是如何设置的,但如果Web服务的东西连接是打开的,你可能会有更多的对象驻留在内存中(并使用CPU),而不是你需要的。 – Brian

+0

回家之前还有一个想法。如果您还没有做到这一点,请确保SQL服务器和您的Web服务在不同的机器上运行。这应该可以帮助你找出问题所在。如果您将Web服务和SQL分开,并且它实际上是造成问题的SQL,那么您可能会遇到索引问题。 – Brian