【问题标题】:Monitoring ADO.NET Connection Open Time监控 ADO.NET 连接打开时间
【发布时间】:2013-02-22 15:30:39
【问题描述】:

我们有一个包含 C# 客户端、C# WCF Web 服务层和 SQL Server 数据库的 3 层应用程序。 Web 服务使用 ADO.NET 连接到数据库。我们所有的 C# 代码都使用 .NET Framework 2.0。

最近,一位客户对我们的应用程序进行了压力测试。在测试过程中,Web 服务器产生了很多错误,如下所示:

无法连接到连接字符串“...”的数据库。超时已过。在操作完成之前超时时间已过或服务器没有响应。

我知道有一些方法可以在连接池已满时捕获连接错误并尝试在连接池之外获取连接。我们还发现了一些需要调整的查询,但它们没有解释 Web 服务器连接超时。

我们正试图找出网络服务器连接数据库超时的原因。我已设置 Web 服务器以启用所有 ADO.NET performance counters。但是,我没有看到与连接所需的时间或连接超时等相关的任何内容。理想情况下,我们可以在 perfmon 中与其他 ADO.NET 计数器相邻绘制连接时间。

有没有办法监控 ADO.NET 在获取连接时的性能?

我想我们可以通过定时尝试打开连接来创建自己的“平均连接打开时间”性能计数器,但我宁愿使用已经存在的东西。

【问题讨论】:

  • SQL Profiler 在这方面有帮助吗?
  • @MrMoose:分析器在查找一些问题查询方面帮助很大。但我需要一些特定的东西来监控连接时间,以查看它们何时上升以及何时开始超时。
  • 这需要一个专门关于监控连接打开时间的答案。如...多长时间调用 SqlConnection.Open 需要多长时间 - 它等待池连接具体可用的时间 - 诊断为什么池连接需要很长时间才能变为可用。诸如连接泄漏之类的事情。诸如 EF 之类的框架不会暴露诸如连接打开之类的事件,并且不会为连接工厂和 DbConnections 密封该死的类,因此很难检测。我们需要 ADO.NET 级别的东西,但它没有这样的性能计数器。

标签: c# wcf ado.net perfmon connection-timeout


【解决方案1】:

您可以使用perfmon 获取此信息。您需要附加到SQL Server: General Statistics 下的User Connections 监视器。 Here is the blog post 我是从那里抓到的。这将让您知道连接在什么时间点保持打开状态。

然后,您需要将其与应用程序任务(即当您看到它们不断攀升时您在应用程序中执行的操作)关联起来。

完成后,如果您还没有这样做,您将希望在 using 语句中获取这些连接:

using (SqlConnection cn = new SqlConnection("some connection string"))
{
    cn.Open();
    ...
}

通过这样做,您无需发出Close,也不必担心它们会被妥善处理。

简而言之,性能计数器应该可以帮助您追踪导致问题的应用程序中的代码,但它不会归结为每条线,即使从那里也需要更多的努力。

【讨论】:

  • 谢谢,但我不担心应用程序连接处理。我相当确定我们的数据对象正确地做到了这一点。我想知道为什么有时连接数据库需要很长时间。具体来说,我想通过 perfmon 监控获取连接的时间,这样我就可以将连接获取时间的峰值与某种数据库数量相匹配,例如挂起的 I/O 或 CPU 使用率等。除了创建自己的计数器之外,我看不到任何其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
相关资源
最近更新 更多