0

在我们的生产环境(仅)中,似乎从 ASP.NET Web 应用程序创建了过多的会话。引人注目的症状是 ASPStateTempSessions 表每小时生成约 25K 条记录(当 google 分析显示该站点上每小时的唯一用户数少于 500 时)。这会导致大量等待任务,从而导致其他数据库速度变慢和出现问题,从而阻碍站点性能。绝大多数会话中似乎没有任何大量数据。

关于什么可能导致幻象会话的任何想法?我最初认为图像请求等以某种方式导致了新会话,但这似乎不足以解释如此高的乘数。这还合理吗?我应该进一步探索这条途径吗?为什么在我的开发环境中不会出现相同的症状?

谢谢!

环境细节(我可以提供更多细节,我只是不确定还有什么相关的):

  • IIS 7
  • SQL Server 2008
  • 会话模式为 SQLServer:
    • <sessionState mode="SQLServer" sqlConnectionString="[连接字符串]" allowCustomSqlDatabase="true" cookieless="false" timeout="120" cookieName="XYZ_SessionId" />
4

1 回答 1

0

我同意可能的罪魁祸首是运行 SessionStateModule 的平面文件,特别是如果您使用 MVC 而不是 webforms。原因是为了支持无扩展 URL 路由,MVC 在你的 web.config 中添加了以下标签:

<modules runAllManagedModulesForAllRequests="true">
...

该属性的功能与其名称所暗示的差不多,如果您在 IIS 中托管同一网站的图像,这将导致您遇到开销。如果您不使用无扩展名 URL,您可以考虑关闭该属性,或者您可以尝试将图像移动到 CDN,如 akamai 或 AWS cloudfront。

或者,您可以寻找 SessionStateModule 替代方案,其中一些可能提供替代行为。你甚至可以通过继承来滚动你自己System.Web.SessionState.SessionStateStoreProviderBase,有一篇关于这样做的 MSDN 文章:自定义会话提供程序教程。如果你做最后一个,我最近发现ResetItemTimeout它是默认 SessionState 模块在每个请求上最常运行的项目。

最后,我认为您正在经历的扩展是由此引起的,因为 SessionState 模块默认是同步的。这意味着请求 imageA.jpg 和 imageB.jpg 的浏览器只有在 imageA 释放会话锁之后才会接收 imageA 然后 imageB。这比网络服务器的默认行为慢得多,默认行为是在单独的线程上同时提供服务。

如果这不能解决问题,另一种排除故障的方法是查看当前通过 IIS7 的请求。为此,请转到 IIS 管理器左侧的顶级服务器名称,然后单击 Worker Processes。它应该列出您的网站进程,双击它,它将显示所有当前请求。你应该在那里看到大量的图像文件。

于 2013-07-23T20:54:00.767 回答