我有一个非常繁忙的网站,它在 W2K8 + IIS7 的单个 Web 前端机器上运行。
时不时地 - 例如可能是星期一凌晨 3 点左右,然后几天后..某个清晨时间..然后 2 周都没有...等等 - 网站无法响应任何客户端连接。
即没有人可以连接到该网站。
我可以远程桌面连接到机器等等,没问题。
我重新启动了应用程序池(网站以集成模式运行),仍然没有结果。我尝试获取进程的崩溃转储(大约 600 MB 甚至更多)... 尝试了大约一分钟后失败了(我有足够的硬盘空间)。
解决此问题的唯一方法是手动停止 www 服务,然后重新启动。停止需要一段时间(一分钟?),而启动几乎是即时的。
我不知道代码的哪一部分导致了这种情况。起初,我以为这可能是堆栈溢出,因为某些错误可能会进入错误页面,进而导致错误……重复一遍。但我查看了错误页面,感觉没问题。
因此,我希望有人能帮我,告诉我如何才能正确地获得 IIS 进程的正确转储,以便我可以对其进行更多剖析。我会发电子邮件泰丝·费兰德斯(崩溃调试的女神)但我想在向她发送垃圾邮件之前先在这里尝试一下。
有人能给我一些建议,告诉我如何开始调试这个问题吗?
答案1
需要考虑的一些事项:
- 当 iis 停止工作时,www 进程在做什么?(即消耗 CPU、消耗内存、线条平坦?)
- 您可以从服务器 telnet 到网站(主机名或 IP 地址)吗?或者连接是否失败?
- 它总是在清晨出故障吗?你在那个时候在运行什么吗?备份、批处理或数据库之类的东西?
- 你的 asp.net 进程是否消耗了大量的 RAM 或 CPU?
- 如果您创建第二个非 asp.net 网站(纯 html),它还能继续运行吗?
答案2
我不久前就找到了答案。
应用程序崩溃了,不管是什么原因(我仍然无法弄清楚具体在哪里),但 IIS 停止的原因是,这种情况在短时间内发生了很多次——IIS 将此称为快速失效保护。
这是一些典型设置的屏幕截图。如果我理解正确的话,它表示如果 5 分钟内发生 5 次崩溃,则停止此应用程序池并回复“服务不可用”消息。(不过,在此屏幕截图中,快速失败保护已关闭)。
(来源:west-wind.com)
这就是我的网站“拒绝连接”的原因。应用程序池被告知停下来(合作并倾听......)并返回503 for any new connections
直到人类(咳咳)检查了发生的情况并手动重新启动了应用程序池。