SQL Server请求超时,因为TempGetStateItemExclusive被连续调用

Jer*_*eid 5 sql-server asp.net session blocking

我运行的网站流量不错(每天约有100,000次页面浏览量),但由于SQL Server超时错误,偶尔使该网站瘫痪。

当我运行SQL事件探查器时,我看到一条命令每秒被调用数百次,如下所示:

...
exec dbo.TempGetStateItemExclusive3 @id=N'ilooyuja4bnzodienj3idpni4ed2081b',...
...
Run Code Online (Sandbox Code Playgroud)

我们使用SQL Server来存储ASP.NET会话状态。上面是存储过程,用于获取给定会话的会话状态。它似乎在循环,一遍又一遍地请求相同的2或3个会话。

我发现了一个有前途的修补程序,似乎可以解决此确切问题,但似乎并没有为我们解决问题。(我假设此修补程序包含在最新的.NET Service Pack中,因为它看起来不再可以直接安装了)。我手动添加了注册表项,但是我们仍然看到像上面那样的循环存储过程调用(比每500ms频繁地请求相同的会话)

我无法在开发计算机上重新创建它。当对相同的会话ID发出两个请求时,它似乎可以正确阻止,甚至尝试命中SQL,直到第一页释放该会话。

有任何想法吗?先感谢您!!!

Jer*_*eid 4

这可能是我需要不同问题的答案的情况之一。问题应该是“为什么我使用 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/

  • InProc 和进程外会话状态显然都有优点和缺点 - 如果您没有真正在 SessionState 中存储任何内容,或者更重要的是,没有什么不能在会话状态中轻松重建,那么 InProc 就可以了。然而,如果您的会话需要持续应用程序重新启动或服务器切换(在负载平衡环境中) - 例如购物车等,那么 InProc 并不是真正的“最佳选择”,因为它在这些情况下会失败。 (2认同)
  • 关于“DeleteExpiredSessions”的***性能问题***:https://sqlperformance.com/2013/01/t-sql-queries/optimize-aspstate (2认同)