使用性能监视器监视池化连接

时间:2013-08-16 10:00:51

标签: sql-server asp.net-mvc-3 iis connection-pooling perfmon

我正在从负载失败的MVC3应用程序中调查此错误:

“从池中获取连接之前已经过了超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。”

应用程序正在使用Repository模式和Entity Framework,我的预感是它没有正确关闭连接。我希望能够监视SQL Server上的池连接数。搜索引导我相信我可以在Perfmon中使用这些计数器:

  • .NET CLR数据
  • SQLServer的.NET数据提供程序

然而,它们都显示并被禁用/变灰。

我直接在服务器上运行Perfmon,并且ISS和SQL Server都在服务器上运行。有什么想法为什么这些计数器不可用?

我也尝试使用SQL事件探查器来监控池化连接,但是AuditLog不能使用EventSubClass列。

2 个答案:

答案 0 :(得分:6)

您可以从SQL查询窗口运行此命令,以获取计数以及SQL服务器上运行的当前连接和会话的详细信息。

select * FROM sys.dm_exec_sessions AS es  
INNER JOIN sys.dm_exec_connections AS ec  
ON es.session_id = ec.session_id

我在汇集连接方面遇到了麻烦。他们很难控制。显然关闭它们似乎永远不会起作用,因为它们处于.NET的控制之下。我们用完连接的最大原因是未提交的事务。如果某个事务由于某种原因未提交或回滚,则连接不会被重新使用,而是迫使.NET打开另一个连接以继续处理。

答案 1 :(得分:1)

从SQL方面来说,唯一可行的方法是设置登录事件跟踪。 "事件子类"列将告诉您是否使用池连接发生了事件。有了它,您可以关联主机,登录名和应用程序名称并继续挖掘。

<强> Audit Login Event Class

在应用程序端,您可以使用&#34; .NET DATA PROVIDER FOR SQL SERVER&#34;的性能计数器。在perfmon。

<强> Performance Counters in ADO.NET