如何提高我的Web应用程序的性能?

时间:2010-04-18 08:21:27

标签: asp.net sql sql-server performance optimization

我有一个使用MS SQL Server 2005的ASP.NET Web应用程序(.NET 2008)。我想提高网站的性能。有没有人知道一篇文章,包含在SQL(索引等)和代码中逐步执行的步骤?

3 个答案:

答案 0 :(得分:4)

性能调优是一个非常具体的过程。我不知道有任何直接讨论如何实现这一目标的文章,但我可以简要介绍一下我在提高应用程序/网站性能时所遵循的步骤。

  1. 配置。

    首先收集效果数据。在调整过程结束时,您需要一些数字进行比较,以实际证明您已经有所作为。这意味着您需要选择一些您监控的特定流程并记录其性能和吞吐量。

    例如,在您的网站上,您可以记录登录所需的时间。你需要保持这个非常狭窄。选择您要记录的特定操作并为其计时。 (使用工具进行计时,或在应用程序中添加一些Stopwatch代码以报告时间。此外,不要只运行一次。多次运行。尽量确保您了解所有环境设置所以你可以在最后再次复制它。

    尽量使其尽可能接近您的生产环境。确保您的代码在发布模式下编译,并在真正独立的服务器上运行,而不仅仅是在一个盒子上运行等。

  2. 仪器

    现在您知道要改进哪些操作,并且您有足够的目标时间,您可以检测代码。这意味着注入(手动或自动)额外的代码,每次调用每个方法,或者每行,并在调用堆栈中记录时间和/或内存使用情况。

    他们有很多工具可以帮助你解决这个问题并使其自动化。 (Microsoft's CLR profiler(免费),Redgate - Ants(商业),视觉工作室的高版本内置了内容,loads more)但你不必使用自动工具,它是完美的只需使用秒表类来计算代码的每个块。你要找的是一个瓶颈。可能的障碍是你会发现很少一部分时间花在一小段代码上。

  3. 调谐。

    现在你有一些时间数据,你可以开始调整。

    这里有两种方法可供考虑。首先,从整体的角度来看。考虑是否需要重新设计整个调用堆栈。你在不必要地重复一些事吗?或者你只是在做一些你不需要的事情?

    其次,现在您已经了解了瓶颈的位置,您可以尝试找出改善这些代码的方法。我不能在这里提供太多建议,因为它取决于你的瓶颈是什么,但只是想优化它。也许您需要缓存数据,因此您不必循环两次。或批处理SQL调用,这样您就可以只执行一次。或者收紧查询过滤器,以便返回较少的数据。

  4. 重新分布。

    这是人们经常错过的最重要的一步。一旦你调整了代码,你绝对必须在你运行初始分析的同一环境中重新分析它。你认为可能会提高性能并实际结束的微调很常见由于CLR处理某些事情的一些未知方式而降级它。这在托管语言中更为常见,因为您通常不知道具体内容是什么。

  5. 现在只需重复一遍。

    如果您经常进行性能调整,我发现我可以运行一整套自动化性能测试,检查各种不同活动的性能和吞吐量。这样我可以在每个版本中运行这些并记录每个版本的性能变化。这也意味着我可以在性能调优会话之后检查一下,我知道我没有让其他领域的性能更差。

    在进行分析时,不要总是只考虑运行单个操作的时间。还要考虑在负载下进行分析,有很多用户登录。有时,当只有一个用户连接时应用程序表现很好,但是当他们突然遇到一定数量的用户时,整个事情就会停止。也许是因为他们花了更多的时间进行上下文切换或者将内存交换到磁盘中。如果您希望提高吞吐量,则需要弄清楚导致吞吐量限制的原因。

    最后。查看关于Improving .NET Application Performance and Scalability的这篇巨大的MSDN文章。具体来说,您可能需要查看chapter 6chapter 17

答案 1 :(得分:2)

我认为我们能从这里做的最好的事情就是给你一些指示:

  • 从sql server查询较少的数据(缓存,适当的查询过滤器)
  • 编写更好的查询(索引,连接,分页等)
  • 尽量减少任何不适当的阻塞,例如不同请求之间的锁定
  • 确保会话状态的大小不会爆炸
  • 使用更大的金属/更多金属
  • 使用适当的循环代码等

但要强调;从这里任何东西都是猜测。您需要进行配置文件以查找suckage的常规区域,然后进行更多分析以隔离特定的区域;但首先看看:

  • web-server和sql-server之间的sql跟踪
  • 网络服务器和客户端之间的网络跟踪(两个方向)
  • 缓存/状态服务器(如果适用)
  • Web服务器上的CPU /内存利用率

答案 2 :(得分:1)

我认为首先你必须找到你的瓶颈,然后尝试改进它们。

这有助于您准确执行严重问题。

此外,您需要改进与数据库的连接。例如,使用Lazy,Singletone Pattern并创建Batch请求而不是单个请求。 它可以帮助您减少数据库连接。

检查缓存和合适的循环结构。

另一件事是使用适当的类型,例如,如果你需要int donot创建一个long等等

最后,ypu可以使用一些Profiler(特别是在SQL中),并尽可能地检查你的查询。