IIS7中没有响应的ASP.NET站点

时间:2009-12-12 05:41:03

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

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

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

(PS:缺乏代码隐藏声明是故意的 - 就是这样。没有实际的代码)

回复还需要一分钟的时间。来自同一IIS站点的静态.html文件是即时的。

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

服务器的CPU负载正在以5%的速度巡航,它已经超过了一堆未使用的RAM,并且服务器上的所有其他站点都正常加载,并且暂存站点(具有所有相同的外部依赖性)正在加载正常。

任何人都知道这会导致什么样的事情?在一个站点(或应用程序池 - 它有它自己的)中是否有任何资源,我们可以使用这么多的整个站点变得缓慢?我自己没有写它,所以我不确定所使用的对象是否被适当处理,很容易就会有不受欢迎的Web请求,文件或数据库连接,但我看不出其中任何一个会减慢这些我做的测试页......

1 个答案:

答案 0 :(得分:3)

这可能会发生很多原因。我经常寻找的第一件事是某种网络延迟。即使您的ASPX页面只是您发布的两行代码段,但在管道中可能会发生一些事情:

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

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

CPU和磁盘使用率低的非响应式Web应用程序也可能表明ThreadPool中的所有可用线程都被阻塞,原因可能是死锁(可能在应用程序本身内不小心使用ThreadPool),或等待在外部资源上。即使您的测试页面没有调出任何外部资源,如果您有50个在线用户都在调用可以访问的页面,如果该网站设计不当(见下文),它可能会很容易使用该网站。如果加载页面需要30或60秒,那么它可能是一个红色标记,表示某处超时。

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

当然,我真的只是在这里抛出可能性。如果不了解有关网站和配置的更多信息,很难肯定地说。运行详细的跟踪(特别是在服务器启动的网络连接和文件访问上)可能会告诉您更多信息。