重复调用dbo.TempGetStateItemExclusive3

时间:2013-03-22 14:35:14

标签: asp.net sql-server sitecore session-state

我正在调查我们的网站使用SQL服务器管理会话的问题。该网站是基于sitecore CMS的asp.net webforms。我们在各种环境中都有相同的代码,例如质量保证,分期和生产。

在生产中,我们所看到的是,我们定期得到一个快速上升的CPU使用率,它不会以任何方式与服务器的流量相关联。随着这个CPU峰值,我们看到网络I / O出现了相应的峰值。

我们的监控软件不区分流量输出到互联网和流量到数据库服务器;但是,我们在数据库服务器上看到的是在asp会话数据库中每秒数百次调用到dbo.TempGetStateItemExclusive3 ,所有这些都是针对相同的会话ID,并且没有相应数量的页面请求进入网络服务器。

使用相同的代码和配置,我们根本看不到其他环境的这种行为。我们也没有看到其他会话ID,只是这一个特定的。

从数据库中删除行只会导致使用相同的会话ID重新创建该行。

更新

我在事件日志中发现了这个错误:

Violation of PRIMARY KEY constraint 'PK__ASPState__C9F49290145C0A3F'. Cannot insert duplicate key in object 'dbo.ASPStateTempSessions'. The duplicate key value is (sessionidwiththeproblem). The statement has been terminated.
Stack trace:

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean\ breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand\ cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,\ TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,\ RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult\ result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Web.SessionState.SqlSessionStateStore.SqlExecuteNonQueryWithRetry(SqlCommand\ cmd, Boolean ignoreInsertPKException, String id)

有人想知道如何创建重复的会话ID吗?

3 个答案:

答案 0 :(得分:7)

我们遇到了类似的问题,具有以下配置:

  • IIS 7.5
  • .NET Framework 4.0
  • Windows 2008(在IIS和数据库服务器上)
  • 由ASPState数据库管理的会话

问题在于,有时一些会话仍然锁定在ASPState数据库中,导致每个锁定会话每秒都有数百次调用dbo.TempGetStateItemExclusive3。

IIS服务器上的CPU最终将获得锁定会话的数量。临时解决方案是回收应用程序池。

进一步在IIS服务器上启用跟踪,然后分析跟踪,我们注意到在EXECUTE_REQUEST_HANDLER模块中出现问题(即导致500内部服务器错误的网络连接问题)时,下一个模块这是RELEASE_REQUEST_STATE(并且应解锁会话)未被执行。因此会议保持锁定状态。

它变成了IIS的错误,我们通过在web.config中将uploadReadAheadSize的值更改为0来修复它:

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>

UploadReadAheadSize属性确定Web服务器将读入缓冲区并传递给ISAPI扩展的字节数。每个客户端请求发生一次。

另见: ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress

答案 1 :(得分:0)

看起来像是SQL问题而不是Sitecore,可能与未被清除的会话有关。我不是DBA但启用了SQL代理?您的生产SQL服务器是否处于与其他环境不同的Service Pack /补丁级别(this文章提到了一些类似问题的旧修补程序)?

一些调查链接,直到有人可以更具体地回答这个问题!您可能希望包含有关您正在使用的SQL版本的一些信息。

http://jerschneid.blogspot.co.uk/2010/01/aspnet-sql-server-requests-timing-out.html

https://www.simple-talk.com/sql/sql-tools/how-to-identify-blocking-problems-with-sql-profiler/

答案 2 :(得分:0)

要探索可能是IIS中的应用程序设置中的某些内容的概念,您可以使用Web部署(msdeploy)转储站点的配置。然后对显示问题的框和不显示问题的框之间的输出进行比较。

这样的东西将输出到控制台

msdeploy –verb:dump –source:appHostConfig="Default Web Site"

或XML

msdeploy –verb:dump –source:appHostConfig="Default Web Site" -xml

请参阅http://technet.microsoft.com/en-us/library/dd569101(v=ws.10).aspx