1

我们遇到了 IIS 和 Azure 的一个非常严重的问题。不确定这是在 IIS 方面还是我们的自定义代码方面。

我参与了两个在 Azure 中运行的网站(站点 A 和站点 B)。(标准 WebRoles,ASP.NET MVC3)。这两个站点的架构完全不同,彼此没有任何关系,但在相似的情况下都表现出相似的行为。

站点 A 在启用会话状态的情况下运行。会话存储在 SQL Azure 数据库中。大多数对站点 A 的调用都通过指向 SQL Azure 数据库的 ASP.NET SQL 成员资格提供程序进行保护

站点 B 也在启用会话状态的情况下运行。会话存储在 Azure AppFabric 缓存中。站点 B 还具有与 AppFabric 缓存和 Azure 表存储通信的 http 处理程序。

当关键 Azure 资源(如 SQL Azure 或缓存)变得非常慢时,问题开始但不会恢复。当这些资源变得非常缓慢并且每个请求的处理时间超过一分钟时,Azure 的负载均衡器会终止这些连接,但 Web 角色上的 IIS 不会从其活动队列中清除/删除这些请求。

因此,问题不在于当 SQL Azure 或 AppFabric 缓存非常慢时站点没有响应。最大的问题是当 SQL Azure 或 AppFabric Cache 恢复并开始正常工作时,站点无法恢复。请求位于活动请求列表中,并且不会消失很长时间(几个小时?)。坦率地说,我不知道他们在那里坐了多久,因为我们尽快重启了这些服务器。由于 Azure 资源偶尔会出现间歇性问题,并且由于两个站点的流量都非常高,因此两个站点很快就会在非清算请求的重压下陷入困境。IIS 队列已满,在有人进入并重新启动应用程序池之前,站点不可用。

4

2 回答 2

2

IIS 保持请求“活动”的事实非常奇怪。您是否尝试将请求超时配置为小于 60 秒?这样做将使 IIS 控制终止请求,而不是让负载平衡器关闭连接:

<httpRuntime executionTimeout="50" />

注意:这仅在 Debug = false 时有效

于 2012-07-25T18:39:35.790 回答
0

我有一个类似的问题,IIS 请求会持续很长时间。我花了很长时间试图弄清楚为什么 IIS 没有杀死它们。我尝试了 Sandrino Di Mattia 的解决方案和其他解决方案,但没有一个对我有用。

事实证明,IIS 并没有终止请求,因为它们仍然处于活动状态。在某些情况下,客户端浏览器会打开一个连接并永远保持它。我会查看浏览器的网络调试器(Firebug、Webkit 检查器等),然后看到请求就在那里旋转。据我所知,他们正在响应 keepalive,因此 IIS 和负载平衡器将保持连接和请求处于活动状态。最终的解决方案是让浏览器不这样做。

它可能与您的问题无关,但在我的特定情况下,问题是<video>标签。当给定一个<video>指向一个大文件的标签时,他们会立即打开一个连接并保持它直到播放视频,这可能永远不会(我们关闭了自动播放)。<video>解决方案是在我们准备好播放视频之前不创建标签。

另外,有没有办法知道 Azure 负载均衡器已经终止了请求?我知道看到活动的唯一方法是请求是通过 IIS 管理控制台。

于 2012-07-26T18:45:24.200 回答