【问题标题】:Unresponsive ASP.NET site in IIS7IIS7 中无响应的 ASP.NET 站点
【发布时间】:2009-12-12 05:41:03
【问题描述】:

在我工作的地方,我们最近有一个网站非常无响应(一个简单的请求需要 1 分钟或更长时间。当我测试它时,我尝试了一个简单的页面:

<%@ Page Language="C# %>
<html><body><h1>Hello World</h1></body></html>

(PS:故意缺少代码隐藏声明 - 仅此而已。没有实际代码)

仍然需要一分钟才能做出回应。来自同一 IIS 站点的静态 .html 文件是即时的。

该网站获得了大量点击,我们使用的 CDN 实际上配置错误,因此获得了大量点击。一旦我们修复了该配置,它就恢复了正常速度,但它仍然困扰着我,因为我无法弄清楚出了什么问题,据我所知,服务器没有理由不能应付它.

服务器的 CPU 负载以大约 5% 的速度游弋,它有超过一 gig 的 RAM 未使用,服务器上的所有其他站点都可以正常加载,而暂存站点(具有所有相同的外部依赖项)也可以正常加载。

任何人都知道什么样的事情会导致这种情况?在单个站点(或应用程序池 - 它拥有它自己的)中是否有任何资源可以让我们使用如此多的整个站点变慢?我不是自己写的,所以我不确定使用的对象是否得到了适当的处理,很容易有未处理的 Web 请求、文件或数据库连接,但我看不出其中任何一个会减慢微小的速度我做的测试页...

【问题讨论】:

    标签: c# asp.net performance iis-7


    【解决方案1】:

    发生这种情况的原因有很多。我通常寻找的第一件事是某种网络延迟。即使您的 ASPX 页面只是您发布的两行 sn-p,也可能会在管道的早期发生一些事情:

    • 安全规则(它可能试图联系某个身份验证/授权服务或数据库);
    • 自定义 HttpModules,通过 web.config 或直接通过 IIS 配置;
    • web.config 中的各种其他设置可能会触发早期操作(即跟踪/记录,可能日志已满或指向网络位置)
    • 在 global.asax 中执行的任何代码
    • 加载 ASP.NET 身份的用户配置文件(如果配置了此选项,则默认情况下不配置)
    • 等等……

    有些只会在应用首次加载时发生,有些会在每次页面加载时发生。

    具有低 CPU 和磁盘使用率的无响应 Web 应用程序也可能表明 ThreadPool 中的所有可用线程都被阻塞,这可能是由于死锁(可能是应用程序本身不小心使用了 ThreadPool),或者正在等待在外部资源上。即使您的测试页面没有调用任何外部资源,如果您有 50 个在线用户都调用了可以调用的页面,那么如果网站设计不佳(见下文),它很容易使池饥饿。如果加载页面的时间正好是 30 或 60 秒,那么它可能是一个红旗,表示某处超时。

    ASP.NET 网站中的一个常见设计错误是在常用页面或代码路径上同步数据访问、I/O 或网络代码(即调用远程 Web 服务)。默认情况下这些都是阻塞调用,如果页面没有转换为Async模型,线程不会在应用等待响应时释放回线程池,从而阻止服务器在池后接受任何新连接用完了(我认为默认情况下它是 25 个线程)。在低流量的网站上,这可能永远不会成为问题,但在高流量的网站上,它会很快成为问题。

    当然,我真的只是在这里排除可能性。如果不了解更多关于站点和配置的信息,很难确定。运行详细的跟踪(尤其是在服务器启动的网络连接和文件访问上)可能会告诉您更多信息。

    【讨论】:

    • 嘿,我知道这很可能只是猜测,没有更多信息。我认为您已经通过填充应用程序池的工作线程限制而一针见血。我确实注意到用于呈现页面的一些非常低效的方法,我只是看不到它们如何影响对不相关页面的请求。最初的开发人员似乎确实知道它会从 CDN 提供作为一种许可,因此不必费心在自己的代码中放置任何缓存,这意味着主页的每个页面加载实际上都会进行 4-5 次 Web 服务调用,所以它如果 CDN 配置错误,很容易用完这个限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2012-09-30
    相关资源
    最近更新 更多