IIS 7.5 ASP.NET挂起请求

4

我正在使用IIS Web服务器时遇到了一些性能问题,它会随机挂起,我正在尝试找出如何加快服务器速度。我在服务器上启用了失败请求跟踪,并将其设置为在请求超过3秒时生成日志。

生成的日志(xml)并没有显示太多信息,但是性能记录中有一个指示服务器挂起的部分的点。以下是发生大时间损失的日志部分。

65. i GENERAL_GET_URL_METADATA PhysicalPath="", AccessPerms="513" 17:46:32.577

66. i HANDLER_CHANGED OldHandlerName="", NewHandlerName="ExtensionlessUrlHandler-Integrated-4.0", NewHandlerModules="ManagedPipelineHandler", NewHandlerScriptProcessor="", NewHandlerType="System.Web.Handlers.TransferRequestHandler" 17:46:32.577

67. i VIRTUAL_MODULE_UNRESOLVED Name="FormsAuthentication", Type="System.Web.Security.FormsAuthenticationModule" 17:46:47.771

我不确定“Handler changed”是什么,但它花费了很长时间,请给我一些建议,从哪里开始寻找。


你的WebForms中是否有任何iFrame元素? - Emmanouil Chountasis
没有,据我所知。 - bischoffingston
检查应用程序池何时回收以及需要多长时间。 - Amit
2个回答

8

没有任何代码的情况下很难提出解决方案。以下是一些通用提示/建议,可帮助您在 ASP.NET 应用程序中获得出色的性能。

  • 最快的请求方式是在第一次请求时就不需要请求。尝试缓存所有可以缓存的内容。有服务器端缓存和客户端缓存。每种缓存方式都有其自身的用途,但你并不仅限于一种类型。
  • 确保不要将与请求相关的对象缓存和/或保留到内存中。ASP.NET有一个有限数量的并发请求,如果将请求引用保留在内存中,则会导致服务器挂起,如果线程已经用完了。
  • 在完成请求后立即关闭请求。
  • 在请求时客户端不需要的所有内容都应该在后台处理。
  • 确保应用程序中没有内存泄漏。垃圾回收常常是ASP.NET应用程序挂起的原因。在进行垃圾回收时,所有正在运行的线程都会暂停。这对于Gen 2垃圾回收尤为真实。您可以启用后台生成2代垃圾收集
  • 隔离有问题的代码。使用分析器查看哪种类型的请求是CPU密集型的。然后深入挖掘,看看其中的内容是什么使其变慢。
  • 在任何平衡良好的应用程序中,对象应该是短暂的或永久存在的。在ASP.NET应用程序的情况下,请求过程中创建的对象理想情况下应该在该请求或下一个GC gen 0内死亡。
  • 考虑为大型对象和初始化时间长的对象使用对象池。
  • 确保您的应用程序池不会完全崩溃并重新启动(查看IIS日志和/或Windows事件)。

以下是一些有用的调试工具:

  • LeanSentry。用于诊断 ASP.NET 服务器挂起问题的好工具
  • windbg。学习曲线较陡峭,但是绝对是你可以使用的最强大的调试工具
  • PerfView。用于分析 ETW 事件,如 I/O 或 CPU 使用率的有用工具

抱歉,赏金过期后我离开了一段时间,无法完全应用赏金。至少,我找不到一种方式来应用全部赏金。 - MichaelGG
没问题,Michael :) - slvnperron

1
有很多方法可以提高服务器性能。但在此之前,您应该从检查“挂起”期间的CPU使用率开始。应用程序代码中的无限循环可能会导致此行为。除非在循环中有I/O、锁定或睡眠,否则您将能够从CPU使用率中看到它,因为每个无限循环将获得一个完整核心的CPU使用率。 帮助提高服务器性能的链接 更多信息: 我可以看到与VIRTUAL MODULE UNRESOLVED相关的条目:这与Response.Redirect(url)的错误使用有关。还要确保您已在IIS上部署了集成模式的应用程序。
这是一个简单的清单,您可能需要重新考虑: 始终预编译您的站点,而不是复制它!在部署之前编译网站可能会获得显著的性能提升:ASP.NET Precompilation Overview 不要在生产应用程序中启用debug="true",当您的web.config中的debug标志为true时,应用程序在运行时使用更多的内存,并且由于启用了一些额外的调试路径,代码可以执行得更慢。 检查您的Web.config文件以确保在section中禁用了trace。 IIS 7.5带有自动启动功能。WAS(Windows进程激活服务)启动所有配置为自动启动的应用程序池,请确保您的应用程序池在IIS 7.5 applicationHost.config中配置为AlwaysRunning,在此处查看更多详细信息。
每个asp.net服务器都可以通过位于框架文件夹根目录下的aspnet.config文件进行良好配置。请确保在您的aspnet.config文件中将代码访问安全性(CAS)的发布者证据设置为false,这可能会在重新启动ASP.NET应用程序池时增加初始页面加载时间。您可以阅读更多信息
此外,您可能希望尝试IIS 7.5的应用程序初始化模块,该模块也可用于IIS 8.0,并可以通过预加载工作进程来减少第一次请求的响应时间。

CPU在第一次页面加载时并不会做太多事情。该网站相当简单,应该非常快速,除了ASP.NET框架之外几乎没有自定义应用程序代码。 - bischoffingston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接