【发布时间】:2013-03-12 11:11:17
【问题描述】:
我正在调查我们网站使用 SQL Server 管理会话的问题。该网站是基于 sitecore CMS 的 asp.net 网络表单。我们在各种环境中都有相同的代码,例如质量保证、分期和生产。
在生产中,我们看到的是,周期性地,我们得到一个快速上升的 CPU 使用率,这与服务器的流量没有任何关联。除了这个 cpu 峰值,我们还看到了网络 I/O 的相应峰值。
我们的监控软件不会区分到互联网的流量和到数据库服务器的流量;然而,我们在 DB 服务器上看到的是 每秒对 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 吗?
【问题讨论】:
-
您是否能够看到这些峰值通常持续多长时间、它们发生的频率和/或它们在一天中的什么时间发生的模式?
-
这只是在黑暗中拍摄,但您的应用程序池在不同环境之间的配置(显着)不同吗?我想知道大量的 DB 调用是否与生产应用程序池的某种计划/定期循环一致(应用程序池重置,并且 ASP.NET 运行时正在一次从 SQL Server 恢复所有未过期的会话) .
-
峰值持续到应用程序池被回收。这通常会在一段时间内解决问题。没有真正的模式,它们似乎是随机发生的。我们以前每天都在预定的时间进行应用程序池回收,我们不得不将其更改为每 2 小时一次以尝试缓解此问题。如果它有帮助,我们有 2 个 Web 前端服务器使用粘性会话进行负载平衡。我们的 ISP 技术人员告诉我们,没有相应的流量通过 LB 进入,所以就像是某个失控的线程在进行这些调用。
-
目前我们在生产服务器上面临同样的问题,但仍然没有找到对该行为的真正解释。只有应用程序池重启有帮助。
-
您使用哪个监控软件?
标签: asp.net sql-server sitecore session-state