我运行一个流量不错的网站(每天大约10万页面浏览量),由于SQL Server超时错误,该网站偶尔会陷入困境.
当我运行SQL事件探查器时,我看到一个命令每秒被调用数百次,如下所示:
...
exec dbo.TempGetStateItemExclusive3 @id=N'ilooyuja4bnzodienj3idpni4ed2081b',...
...
我们使用SQL Server来存储ASP.NET会话状态.以上是调用以获取给定会话的会话状态的存储过程.它似乎在循环,一遍又一遍地要求相同的2或3个会话.
我发现promising looking hot fix似乎可以解决这个问题,但它似乎并没有为我们解决问题. (我假设此修补程序包含在最新的.NET Service Pack中,因为它看起来不像您可以直接安装它).我手动添加了该注册表项,但我们仍然看到如上所述的循环存储过程调用(请求每隔500ms更频繁地请求相同的会话)
我无法在开发机器上重新创建它.当对同一个会话ID发出两个请求时,它似乎正确阻塞,甚至尝试在第一页释放会话之前命中SQL.
有任何想法吗?先感谢您!!!
最佳答案 这可能是我需要回答不同问题的案例之一.问题应该是“为什么我使用SQL来存储会话状态信息?” SQL速度慢得多,并且与Web服务器断开连接,这两者都可能导致了这个问题.我查看了ASPStateTempSessions表的大小,发现它只有1MB左右.我们回到了< sessionState mode =“InProc”… />问题得到解决(网站运行速度更快)
下一步,当流量指示时,将添加另一个服务器并使用“StateServer”模式,以便我们可以分散内存使用情况.
我想我最初是为了处理一个不再是问题的记忆瓶颈. (这不是处理记忆瓶颈的好方法,仅供参考!)
重要编辑:好的,事实证明整个“TempGetStateItemExclusive”不是问题所在,它只是另一个问题的症状.我们遇到了一些导致阻塞问题的查询,因此每个SQL请求都会被淘汰.实际修复是识别和修复阻塞问题. (我仍然认为“InProc”是要走的路),这个链接帮助我们找到了很多问题:
http://www.simple-talk.com/sql/sql-tools/how-to-identify-blocking-problems-with-sql-profiler/