我正在调查我们的网站使用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吗?
答案 0 :(得分:7)
我们遇到了类似的问题,具有以下配置:
问题在于,有时一些会话仍然锁定在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扩展的字节数。每个客户端请求发生一次。
答案 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