为什么页面处理的AspNetSessionData阶段会将我的页面延迟20秒以上?

Jos*_*ger 3 asp.net session delay freb slowdown

我有一个使用ASP.NET与"InProc"会话处理的Web应用程序.通常,一切正常,但每天几百个请求比正常情况下运行时间要长得多.在IIS日志中,我可以看到这些页面(通常需要2-5秒才能运行)运行20秒以上.

我在详细模式下启用了失败请求跟踪,并发现延迟发生在AspNetSessionData部分.在下面显示的示例中,AspNetSessionDataBegin和AspNetSessionDataEnd之间存在39秒的差距.

我不知道下一步该做什么.我找不到任何延迟的原因,我找不到任何可以启用的日志记录功能来告诉我这里发生了什么.有谁知道为什么会这样,或者有任何建议我可以采取额外的步骤来找到问题?

我的应用程序通常为每个用户存储1-5MB的会话,主要是用于搜索的缓存数据.服务器有足够的可用内存,只能运行大约50个用户.

失败请求跟踪的屏幕截图

Mat*_*tus 5

它可能是由会话状态的锁争用引起的.看一下MSDN的ASP.NET会话状态概述的最后一段.另见K. Scott Allen关于此主题的有用帖子.

如果页面使用EnableSessionState ="True"注释(或继承web.config默认值),则对该页面的所有请求都将获取会话状态的写锁定.所有其他使用会话状态的请求 - 即使它们没有获取写锁定 - 也会被阻止,直到该请求完成.

如果页面使用EnableSessionState ="ReadOnly"注释,则页面将不会获取写锁定,因此不会阻止其他请求.(虽然它可能被另一个持有写锁定的请求阻止.)

要消除这种锁争用,您可能希望围绕HttpContext.Cache对象或静态WeakReference实现自己的[细粒度]锁定.后者可能更有效率.(参见Richard Kiessig撰写的Ultra-Fast ASP.NET第118-122页.)