【问题标题】:How to increase my Web Application's Performance?如何提高我的 Web 应用程序的性能?
【发布时间】:2011-02-09 08:01:42
【问题描述】:

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

【问题讨论】:

  • 我认为在性能方面,知道你在哪里慢是非常重要的,或者换句话说,你在哪里可以赢得更多的性能。 js、asp.net、sql server有问题吗?他们是不同的世界,需要不同的知识。
  • 好的,codeka 和 pablocastilla,让我们从 sql server 开始,因为我认为慢的主要问题在于 SQL

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


【解决方案1】:

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

  1. 个人资料。

    从收集性能数据开始。在调整过程结束时,您将需要一些数字进行比较,以实际证明您有所作为。这意味着您需要选择一些特定的进程来监控并记录它们的性能和吞吐量。

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

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

  2. 仪器。

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

    有很多工具可以帮助您解决这个问题并自动化其中一些。 (Microsoft's CLR profiler(免费),Redgate - Ants(商业),更高版本的visual studio内置了东西,loads more)但是你不必使用自动工具,只使用秒表是完全可以接受的对代码的每个块进行计时。您正在寻找的是瓶颈。可能的原因是您会发现大部分时间都花在了一小部分代码上。

  3. 调。

    现在你有了一些计时数据,你可以开始调优了。

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

    其次,现在您知道瓶颈在哪里,您可以尝试找出改进这段代码的方法。我在这里不能提供太多建议,因为这取决于你的瓶颈是什么,但只是想优化它。也许您需要缓存数据,这样您就不必循环两次。或者批量处理 SQL 调用,这样你就可以只做一个。或者收紧查询过滤器,以便返回更少的数据。

  4. 重新配置。

    这是人们经常错过的最重要的一步。调整代码后,您绝对必须在运行初始分析的相同环境中重新分析它。进行您认为可能会提高性能并最终结束的微小调整是很常见的由于 CLR 处理某些未知的方式而将其降级。这在托管语言中更为常见,因为您通常不知道幕后究竟发生了什么。

现在只需根据需要重复。

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

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

最后。在Improving .NET Application Performance and Scalability 上查看这篇巨大的 MSDN 文章。具体来说,您可能想查看chapter 6 和chapter 17。

【讨论】:

  • 非常感谢你,simon,我正在仔细阅读你的回答:)
【解决方案2】:

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

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

但是要强调; here 一切都是猜测。您需要剖析以找到吸吮的一般区域,然后进行更多剖析以隔离特定区域;但首先要查看:

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

【讨论】:

  • 谢谢你,Marc,等待更多,你给了我一个很好的起点,但是如果你给我这个点的细节,甚至是一个链接,我会更加感激你
【解决方案3】:

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

这可以帮助您在遇到严重问题的地方准确执行。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多