Asp.net mvc 问题与无回应的网站。如何调试?

Asp.net mvc 问题与无回应的网站。如何调试?,asp.net-mvc,sql-server-2012,entity-framework-6,windows-server-2012,Asp.net Mvc,Sql Server 2012,Entity Framework 6,Windows Server 2012,我们有一个在asp-mvc4中创建的网站,在windows server 2012的iss上运行,并使用MSSQL 2012作为数据存储。使用实体框架-6完成连接。。。非常标准的东西 我们不是一个高流量的网站(全世界最多有3000个用户,所以在不同的时区访问) 问题是,有时在没有警告的情况下,站点会变得无响应(浏览器不会显示它并超时)。没有什么特别的,但这里有一些奇怪的问题: 如果将终端服务器安装到服务器中,服务器本身工作正常 重新启动ISS无助于er没有错误日志 SQL server有大约1

我们有一个在asp-mvc4中创建的网站,在windows server 2012的iss上运行,并使用MSSQL 2012作为数据存储。使用实体框架-6完成连接。。。非常标准的东西

我们不是一个高流量的网站(全世界最多有3000个用户,所以在不同的时区访问)

问题是,有时在没有警告的情况下,站点会变得无响应(浏览器不会显示它并超时)。没有什么特别的,但这里有一些奇怪的问题:

  • 如果将终端服务器安装到服务器中,服务器本身工作正常
  • 重新启动ISS无助于er没有错误日志
  • SQL server有大约100个来自网站的连接都处于休眠状态(但杀死这些进程不会使网站恢复)
  • SQL server当时显示其中一半为等待任务,但如果从SSMS执行SQL,甚至从excel远程执行SQL(远程报告),SQL server仍会响应
  • 查看SQL事件探查器网站,尽管已关闭,但仍在发送SQL请求,但它们都是这样的请求:如果db_id('dbname')不为null,请选择其他。。。(不是网站上特别写的东西)
  • 真正奇怪的是:如果我们重新启动SQL server,网站会再次响应)
我知道这不是很多事情要做,但我们非常困惑,不知道如何继续。北距表示任何类型日志(网站、iss、sql server或windows)中的错误。我可以推断,这一定是因为网站认为SQL无法提供它所需要的,因为连接池或其他东西已经用光了,但为什么只有完全重新启动SQL server才能释放它,而不仅仅是停止进程,这让我很困惑,以及为什么连接池的构建首先发生在实体框架中,因为和sql是在实体框架中处理的


任何关于如何进一步调试的建议都是非常受欢迎的

开始禁用功能,直到站点不再挂起。在任务管理器中转储w3wp.exe进程的内存,然后在WinDbg和SOS中检查它。它应该向您显示所有请求以及它们正在执行的操作。您可能有100个请求卡在AcquireSessionState或类似的东西上。坏消息:这不是一个容易的过程。或者,获取类似NewRelic的东西,看看它是否能为您提供一些有关长时间运行的请求的遥测信息。SQL server有大约100个来自该网站的连接。请注意,对于ASP.NET连接池来说,100是一个神奇的数字。听起来像是在泄漏连接、实体框架或其他信息。尝试在连接字符串中显式地为连接池设置一个更高的数字。如果将其设置为200,那么当站点死亡时,您有大约200个连接=>您正在泄漏连接。我相信你可以让实体框架接受一个SqlConnection,但不能处理它,否则EF在处理连接方面是非常可靠的。谢谢。将尝试使用更高的池作为测试,但实际上并没有解释为什么杀死进程不会使其恢复,而只会使用“if db_id('dbname')…语句”创建新的休眠进程(只有重新启动sql本身会这样做)。更多地考虑,也许您正在泄漏连接,但可能您实际上也在使用100个连接。例如,如果您为每个请求创建一个新的
DbContext
,那么每个请求在尝试获取其他资源时都会被阻止。。。您可能已经设置了代码来整齐地处理所有内容,但请求只是在排队,而不是继续完成。所以没有处置。当您终止或重新启动时,是终止100个连接还是仅终止1个连接?因为如果连接池中有大量的连接请求正在排队,那么杀死1会立即减少计数