16

我正在调查我们网站使用 SQL Server 管理会话的问题。该网站是基于 sitecore CMS 的 asp.net 网络表单。我们在各种环境中都有相同的代码,例如 QA、登台和生产。

在生产中,我们看到的是,周期性地,我们得到一个快速上升的 CPU 使用率,这与服务器的流量没有任何关系。除了这个 cpu 峰值,我们还看到了网络 I/O 的相应峰值。

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

使用相同的代码和配置,我们根本看不到其他环境的这种行为。对于其他会话 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?

4

3 回答 3

10

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

  • IIS 7.5
  • .NET 框架 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 扩展的字节数。每个客户端请求都会发生一次。

另请参阅: AJAX POST 的 ManagedPipelineHandler 如果 IE9 用户在调用正在进行时离开页面,则崩溃

于 2013-12-05T10:20:05.430 回答
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

于 2013-03-26T10:26:32.853 回答
0

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

一些调查链接,直到有人可以更具体地回答这个问题!您可能希望包含有关您正在使用的 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/

于 2013-03-22T15:34:54.747 回答