减少到服务器/数据库的往返

时间:2009-07-12 23:06:16

标签: c# asp.net performance ado.net

在编写ASP.NET页面时,您认为您的页面向数据库或服务器进行了太多的往返是什么迹象?

(这是一个普遍的问题,但我说ASP.NET,因为我的大部分编码都是在网络方面)。

5 个答案:

答案 0 :(得分:4)

多少钱? 100万欧元的问题!轮廓。然后简介。如果您的应用程序花费大部分时间进行数据访问,则会出现问题(并且应该查看sql跟踪)。如果它花费大部分时间绘制UI,那么(假设你的视图没有进行数据访问)你应该首先看看其他地方......

答案 1 :(得分:1)

往返行程与延迟相关,而不是移动的数据总量,因此优化它们确实有意义。通常的方法是使用执行多个步骤的存储过程,甚至可能返回多个结果集。

答案 2 :(得分:1)

我所做的是查看ASP性能计数器和SQL性能计数器。要获得准确的测量结果,您必须确保SQL Server上没有随机噪声活动(即,与网站无关的导入批次)。

我看到的相关柜台是:

  • SQL Statistics/Batch requests/sec:这表明服务器接收的Transact-SQL批次的确切数量。在大多数情况下,它可以将从网站到SQL的往返次数等于1:1。
  • Databases/Transaction/sec:此计数器是按数据库实例化的,因此我可以快速查看哪个数据库存在“活动”。这样我可以关联网站数据往返(即我的app逻辑请求,转到app数据库)和ASP会话状态和用户资料(转到Asp会话db或tempdb)
  • Databases/Write Transaction/sec:我与上面的计数器(每秒事务)相关联,这样我就可以了解网站正在进行的读写比率。
  • ASP.NET Applications/Requests/sec:使用此计数器,我可以获得网站所看到的请求数/秒。与SQL Batch Requests / sec的数量相关联,它可以很好地指示每个请求的平均往返次数。

接下来要衡量的是通常试图了解在请求中花费的时间。在我自己的项目中,我大量使用performance counters I publish myself因此很容易衡量。但是我并不总是那么幸运,只能清理我自己的烂摊子......对我来说,性能分析通常不是一个选择,因为我大多数情况下对我无法检测的现场制作系统进行故障排除。

我的方法是首先尝试解决SQL方面的事情,因为很容易在SQL中找到执行时间的相关统计信息:SQL保留了一个很好的聚合统计信息,可以在sys.dm_exec_query_stats中查看。我也可以使用Profiler实时测量执行持续时间。通过对收集到的这些数字的一些分析,了解访问量最大的页面的正常请求模式,您可以非常好地估计每个Web请求在SQL中花费的总时间。如果这个时间几乎总是需要一个请求来提供页面,那么你就得到了答案。

回答原始问题标题:减少往返次数,减少请求次数。认真。首先,缓存我认为适合缓存的内容是显而易见的。其次,您可以降低复杂性:不要在每个页面上显示不必要的数据,当您可以使用它时缓存和显示陈旧数据,您可以隐藏辅助导航面板上的详细信息。

如果您认为问题是往返次数本身而不是请求数量(即,您将通过在一次往返中批量处理多个请求而获益极大),那么您应该以某种方式衡量往返开销正在扼杀你。通过普通网络连接上的连接池,这通常不是最重要的因素。

最后你应该看看是否可以在集合中完成所有可以完成的事情。如果你有一些半脑的ORM,它可以从ID键集中一次检索一个对象,那就去除它。

答案 3 :(得分:0)

我知道这可能听起来很反复,但客户端服务器往返取决于连接任何一侧有多少程序逻辑。

要检查的第一件事是验证:您必须始终在服务器端验证和清理您的输入,但这并不意味着您也无法在客户端执行此操作,这也减少了仅用于检查输入的往返

第二:您在客户端可以做些什么来减少服务器端过载?您可以在客户端检查或制作计算。还有一些AJAX可用于仅加载正在更改的页面的一部分。

第三:你可以将工作委托给另一台服务器吗?如果您的服务器负载过重,为什么不使用Web服务或只是将逻辑的某一端委托给另一台服务器?

正如马克写道:¿怎么样太多了?这取决于您和您的预算。

答案 4 :(得分:0)

  

编写ASP.NET页面时,有什么迹象   你在找你的页面吗?   做太多往返了   数据库或服务器?

当然这一切都取决于你必须描述。但是,这里有一些指标,它们并不意味着存在问题,但往往会表明

  • Page需要很长时间才能在本地呈现。

  • 要渲染页面,您需要超过30次往返。我把这个数字从我的帽子中取出来,但假设往返行程需要大约3.5毫秒,那么30次往返将使你超过100毫秒的准则(在任何其他类型的处理之前)。

  • 渲染页面所涉及的所有查询都经过了大量优化,执行时间不会超过一毫秒或两秒。每次渲染页面时都不需要执行大量CPU周期的操作。

  • 数据访问是抽象的,不以任何方式缓存。例如,如果GetCustomer将调用DAL,而DAL又发出查询,并且您的页面要求批量检索的100个Customer对象,则可能遇到麻烦。