2010-01-28 81 views
4

我运行一个流量合适的站点(每天约100,000页面浏览量),并且偶尔由于SQL Server超时错误而导致站点瘫痪。由于TempGetStateItemExclusive被连续调用,SQL Server请求超时

当我运行SQL事件探查器,我看到一个命令让所谓轻车熟路第二个这样的:

... 
exec dbo.TempGetStateItemExclusive3 @id=N'ilooyuja4bnzodienj3idpni4ed2081b',... 
... 

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

我发现了一个promising looking hot fix似乎解决这种确切的情况,但它似乎并没有解决我们的问题。 (我假设此修补程序包含在最新的.NET服务包中,因为它看起来不像您可以直接安装它)。我手动添加了该注册表项,但我们仍然看到像上面那样的循环存储过程调用(请求每500ms更多次会话)

我一直无法在开发机器上重新创建此项。当对同一会话ID发出两个请求时,它似乎阻止了正确的操作,甚至尝试敲击SQL直到第一个页面释放会话。

任何想法?先谢谢你!!!

回答

2

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

+1

对于InProc和进程外会话状态都有明显的优点和缺点 - 如果你真的没有在SessionState中存储任何内容,或者更重要的是,在会话状态下不能轻易重建任何东西,那么InProc就没有问题。但是,如果您的会话需要保持应用程序重新启动或服务器切换(在负载平衡的环境中) - 例如购物车等,那么InProc并不是真正的“路要走”,因为它会在这些情况下失败。 – 2013-03-22 13:30:11

+0

***关于'DeleteExpiredSessions'的性能问题***:https://sqlperformance.com/2013/01/t-sql-queries/optimize-aspstate – Kiquenet 2016-10-27 13:50:45

+0

我也喜欢inProc,但是你不能在web-农场。 – visual 2017-10-20 00:51:32

0

已经有一段时间了,但它没有一个清理工作可以删除陈旧的会话?它是否启用。

这个old KB提到它。就像我说的,这已经有一段时间了。

+1

是的,我们的SQL Server代理正在运行,与ASPState_Job_DeleteExpiredSessions作业一起。存储在ASPStateTempSessions中的会话数量似乎是一致的,徘徊在1500左右。 – JerSchneid 2010-01-28 18:37:31

0

只是出于好奇。你是否打开过程看看它有什么作用?

如果它只是做一个select语句,你可能会看看它是否使用NOLOCK。如果不是,请将NOLOCK添加到它并查看会发生什么。

+0

我已经看过该proc。它是由微软提供的一款自动生成的程序,所以我还没有像现在这样搞乱它。锁定机制实际上基于ASPStateTempSessions表的“锁定”列。该proc设置锁定列,另一个由ASP.NET调用(TempReleaseStateItemExclusive)释放它。 – JerSchneid 2010-01-28 20:01:26

+0

可爱。根据你的问题,这听起来像你们没有运行所有的服务包。你有没有想过只更新一切? – NotMe 2010-01-28 22:05:54

+0

是什么让你认为我们没有运行所有的服务包?我们完全是最新的。 (在我对修补程序的描述中,只是暗示我们没有手动安装修补程序,因为我们已经安装了最新的Service Pack) – JerSchneid 2010-01-29 15:42:50