在生产中,我们正在看到的是,定期地,我们可以快速上升cpu使用率,并不会以任何方式与服务器通信.随着这个cpu的尖峰,我们看到了网络I / O的相应的尖峰.
我们的监控软件不区分流量到互联网和流量到DB服务器;然而,我们在数据库服务器上看到的数据是asp数据库中每秒数百次调用dbo.TempGetStateItemExclusive3,所有这些都是相同的会话ID,没有相应的页面请求数量进入Web服务器.
使用相同的代码和配置,我们根本看不到其他环境的这种行为.我们也看不到其他会话ID,只是这一个具体的一个.
从数据库中删除行简单地导致它被重新创建为具有相同的会话ID.
UPDATE
我在事件日志中发现了这个错误:
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,Boolean returnStream,Boolean async) at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,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?
解决方法
> IIS 7.5
> .NET Framework 4.0
> Windows 2008(在IIS和DB服务器上)
>由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扩展的字节数.每发生一次客户端请求.