我有一台运行 IIS 7.5 和 SQL Server 2010 的专用服务器。服务器 CPU 负载通常接近 100%。SQL 服务器不会占用太多,但 w3wp 进程占用了大量 CPU(通常为 70+%)。
我想找出导致这种压力的原因: * 静态文件请求过多(可以添加 CDN) * ajax 请求过多(无论如何我都在考虑彗星/网络套接字) * 单个 asp.net 页面消耗过多的处理能力(应该很容易优化)
你会从哪里开始寻找从哪里开始优化?
我有一台运行 IIS 7.5 和 SQL Server 2010 的专用服务器。服务器 CPU 负载通常接近 100%。SQL 服务器不会占用太多,但 w3wp 进程占用了大量 CPU(通常为 70+%)。
我想找出导致这种压力的原因: * 静态文件请求过多(可以添加 CDN) * ajax 请求过多(无论如何我都在考虑彗星/网络套接字) * 单个 asp.net 页面消耗过多的处理能力(应该很容易优化)
你会从哪里开始寻找从哪里开始优化?
最简单的方法是在生产环境中分析应用程序。不确定您的情况是否可行。一些选项:
我找到了一种简单的方法来查看服务器上发生了什么。尽管如此,专业的方法可能是去使用分析工具。
我做了什么?在 IIS 控制台中,您可以获得所有当前工作线程的列表,如果您选择一个,您可以看到该线程正在处理什么。所以我能够看到线程正在并行处理 100 个请求,其中 70 个请求回溯到同一个 ajax 调用。
直接的解决方案是减少该呼叫的频率(从每 10 秒到每 30 秒)。下一步将是进一步优化服务器端的调用,因为我确实有其他频率相同(每 10 秒)的 ajax 调用,因为它们太快了,几乎从未出现在活动请求列表中。
可能最简单的解决方法是在服务器上安装New Relic 。我认为试用期持续 30 天,所以它应该给你足够的时间来了解这一点。它将向您展示长时间运行的 SQL 查询、.NET 方法以及您能想到的几乎所有其他内容。它使识别瓶颈变得非常容易。
顺便说一句,我建议使用 New Relic,因为听起来您的问题出在生产环境中。New Relic 并不是一个非常详细的分析器。它收集了足够的信息以提供帮助,但不会降低服务器的速度。这使得它非常适合这个目的。
但是,如果您可以在开发环境中重现该问题,则可以尝试免费的Eqatec profiler之类的东西。
一个好的起点是启动开发工具(IE/Chrome 中的 F12)并查看网络选项卡下的时间。这将向您显示页面如何加载的瀑布式图表,并且应该帮助您识别任何可能被明智地移至 CDN 的加载速度特别慢的静态文件、发出的任何不必要的请求、花费了多少时间来获取实际页面本身等。
之后,使用性能分析器分析应用程序。像ANTS Performance Profiler这样的好的分析器可以让您查看不同方法的执行时间/命中计数,以及正在运行哪些数据库查询以及它们花费了多长时间。新版本的 ANTS(目前在EAP中)还将按 http 请求对该活动进行分组,以便您查看特定页面是否需要优化或被点击太多次。
您还可以检查缓存是否按照您的预期工作,这样用户就不会不必要地重新请求页面。
还有一篇关于 ASP.NET 性能的好文章,您可能想在http://aspalliance.com/1533_ASPNET_Performance_Tips.7阅读。
免责声明:我为制作 ANTS 的 Red Gate 工作。