Performance 使用100%cpu的WCF windows服务

Performance 使用100%cpu的WCF windows服务,performance,wcf,windows-services,windows-server-2008-r2,cpu-usage,Performance,Wcf,Windows Services,Windows Server 2008 R2,Cpu Usage,我已经编写了一个WCF服务,它作为windows服务托管在运行windows server 2008 R2的机器上。 我的问题是,在运行24小时内,服务开始消耗任务管理器中显示的100%cpu。 现在,我正试图弄清这个问题的根源 我试过了,但没有成功: 记录所有loopstry、catch等和服务方法中的错误。 正在从任务管理器读取资源监视器。 在我的服务上运行性能监视器。 在Microsoft SQL Server中运行数据库活动监视器,查看是否有任何锁导致问题 这两种方法都没有清楚地了解是什

我已经编写了一个WCF服务,它作为windows服务托管在运行windows server 2008 R2的机器上。 我的问题是,在运行24小时内,服务开始消耗任务管理器中显示的100%cpu。 现在,我正试图弄清这个问题的根源

我试过了,但没有成功:

记录所有loopstry、catch等和服务方法中的错误。 正在从任务管理器读取资源监视器。 在我的服务上运行性能监视器。 在Microsoft SQL Server中运行数据库活动监视器,查看是否有任何锁导致问题 这两种方法都没有清楚地了解是什么导致了100%的cpu利用率。 请告诉我一种可以成功调试的方法


提前感谢

我去年遇到过一点这个问题,web服务的行为基本上就像内存泄漏一样,慢慢地工作,内存和CPU使用率达到100%

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

我们做的另一件事是使ServiceHost使用的类iDisposable,这样我们就可以将它放入Using语句中,理论上,当达到End Using时,该语句应该完全从内存中卸载对象

所以这两件事的结合对我们产生了不同,所以希望,也许它会对你有用

您可以尝试的另一件事是将ServiceHost设置为单例类,或者更改并发模式

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

在我们的例子中,我们运行多个实例并执行context percall,但您可以更改设置并查看问题是否消失

我去年遇到过一点这个问题,web服务的行为基本上就像内存泄漏一样,慢慢地工作,内存和CPU使用率达到100%

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

我们做的另一件事是使ServiceHost使用的类iDisposable,这样我们就可以将它放入Using语句中,理论上,当达到End Using时,该语句应该完全从内存中卸载对象

所以这两件事的结合对我们产生了不同,所以希望,也许它会对你有用

您可以尝试的另一件事是将ServiceHost设置为单例类,或者更改并发模式

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

在我们的例子中,我们运行多个实例并执行context percall,但您可以更改设置并查看问题是否消失

在数据访问层,我正在实现singleton…您认为这会导致问题吗?只有一种方法可以找到。。。改变它,看看症状是否消失。一个想法是,确保您的web服务客户端显式地关闭它们的连接。我不知道您是如何设置的,但是如果web服务things连接是打开的,您可能会有更多的对象驻留在内存中,并且占用的CPU比您需要的要多。如果您还没有这样做,请确保SQL server和web服务在不同的计算机上运行。这将有助于你找出问题所在。如果将web服务和SQL分开,而实际上是SQL造成了问题,那么您可能会遇到索引问题。谢谢Brian!我在一台单独的机器上安装了SQL和服务…我检查了SQL server,发现在我的数据库中随时都有6个活动连接…我想知道,即使网站没有任何用户,这怎么可能…我不知道这是否是一个问题…目前我正在使用任务调度器重新启动服务…粗糙的方式但是现在正在工作…我希望同时解决这个问题…所以是SQL server的最大化了?六个SQL连接不是什么大问题;它们可能来自SQL管理器及其运行的Windows服务。接下来我要检查的是当web服务运行时在SQL上运行的查询。您可以使用SQL探查器查看哪些查询运行得最多,以及它们使用了多少资源。您可能会从查询的一些新索引中受益。在数据访问层,我正在实现singleton…您认为这会导致问题吗。只有一种方法可以找到。。。改变它,看看症状是否消失。一个想法是,确保您的web服务客户端明确
我关闭了他们的联系。我不知道您是如何设置的,但是如果web服务things连接是打开的,您可能会有更多的对象驻留在内存中,并且占用的CPU比您需要的要多。如果您还没有这样做,请确保SQL server和web服务在不同的计算机上运行。这将有助于你找出问题所在。如果将web服务和SQL分开,而实际上是SQL造成了问题,那么您可能会遇到索引问题。谢谢Brian!我在一台单独的机器上安装了SQL和服务…我检查了SQL server,发现在我的数据库中随时都有6个活动连接…我想知道,即使网站没有任何用户,这怎么可能…我不知道这是否是一个问题…目前我正在使用任务调度器重新启动服务…粗糙的方式但是现在正在工作…我希望同时解决这个问题…所以是SQL server的最大化了?六个SQL连接不是什么大问题;它们可能来自SQL管理器及其运行的Windows服务。接下来我要检查的是当web服务运行时在SQL上运行的查询。您可以使用SQL探查器查看哪些查询运行得最多,以及它们使用了多少资源。您可能会从查询的一些新索引中受益。