编程开发 > ASP > 文章内容

ASPX页Web服务调用性能优化

2011-8-8编辑:mal
  摘要:本文介绍了如何通过异步方法消除使用 Microsoft ASP.NET 的 Web 服务调用的性能问题和线程池资源的消耗问题。

   情况:从 ASP.NET 页面调用 Web 服务时的性能破坏

   我们在本文中讨论 Web 服务时,期望在各种情况下都可以享用 Web 服务。一个主要的情况是从中间层环境(如 ASP.NET Web 页面)访问 Web 服务。为 MapPoint .NET Web 服务的用户提供支持的人员经常收到这样的问题,即用户在使用其 Web 服务时,对 MapPoint .NET 的调用可能需要相当长的时间。这本身并不是什么问题,但某些其他因素可以使之成为比表面上要严重得多的大问题。

   HTTP 双连接限制

   HTTP 规范表明,一个 HTTP 客户端与任一服务器最多可以同时建立两个 TCP 连接。这可以防止单个浏览器在浏览某个页面(例如,具有 120 个嵌入的缩略图)时,由于连接请求过多而使服务器负载过重。此时,浏览器将仅创建 2 个连接,然后通过这两个管道开始发送 120 个 HTTP 请求,而不是创建 120 个 TCP 连接并通过每个连接来发送 HTTP 请求。对于中间层,此方法的问题在于,中间层可能会有 50 个同时请求连接的用户。如果不得不为每个用户进行一次 MapPoint .NET Web 服务调用,将会有 48 个用户等待两个管道中的一个空闲下来。

   线程池限制

   ASP.NET 处理传入的请求的方式是通过一个称为进程线程池的一组线程为其提供服务。正常情况下,请求传入后,池中某个空闲的线程将为其提供服务。这里的问题在于,进程线程池不会创建无数个线程来处理大量的请求。具有最大线程数限制是一件好事,因为如果我们无限地创建线程,计算机上的全部资源将只能用来管理这些线程了。通过限制所能创建的线程数,我们可以把线程管理的系统开销保持在一个可控的水平。如果某个请求传入时线程池中的所有线程都被占用,则该请求将排队等候,在忙线程完成任务后,空闲出来的线程才能处理新请求。此方法实际上比切换到某个新线程更有效,因为不需要在请求之间进行线程切换。但存在的问题是,如果线程的使用效率不高(尤其是在非常忙的 Web 服务器上),则等候的请求队列会变得很大。

   考虑一下从 ASP.NET 页面进行 Web 服务调用的情况。如果进行同步调用,则正在运行的线程将被阻塞,直到 Web 服务调用完成为止。在调用期间,线程无法进行任何其他活动。它无法处理其他请求,只能等待。如果某个单处理器计算机上具有默认的工作线程数 20,则只需 20 个同时进行的请求即可用完全部线程,以后的请求必须排队等候。

   该问题不仅限于 Web 服务

   不仅调用 Web 服务的用户会遇到从 Web 页面进行调用时的拥堵且耗时较长的问题。进行任意数量的较长的调用都会遇到同样的问题,例如:SQL Server? 请求、长文件的读取或写入、各种 Web 请求或访问某个并发资源(其中锁定会造成严重的延迟)。实际上,有许多使用 Web 服务的情况,其服务调用比较迅速,并不是什么问题。但您或许会理解,如果您想通过代理服务器调用 MapPoint .NET Web 服务,所使用的连接具有一定的延迟,同时相应的服务可能又要花费一些时间来处理请求,则您可能在各处位置都看到延迟的情况,并且如果站点很忙,便可能出现问题。

   改善问题

   该问题的某些方面可以通过对环境进行某些配置设置来改善。我们看一下可用于改善该问题的某些配置设置。

   maxconnections

   连接到 Web 资源的默认双连接限制可以通过一个名为 connectionManagement 的配置元素来控制。connectionManagement 设置允许您添加要让其采用非默认连接限制的站点的名称。可以将以下内容添加到典型的 Web.config 文件中,将您连接的所有服务器的连接限制默认值增加到 40。

<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="40" />
</connectionManagement>
</system.net>

<system.web>
...
应当注意的是,对本地计算机的连接数量从来都没有限制,因此,如果是连接到本地主机,则此设置无效。

   maxWorkerThreads 和 minFreeThreads

   如果收到 HTTP 503 错误(“服务暂时过载”),则表明线程池中的线程已全部占用,并且请求队列也已超出最大值(appRequestQueueLimit 的默认设置为 100)。对于 IIS 5.0 安装,可以简单地增加线程池的大小。而对于 IIS 6.0 安装(与 IIS 5.0 不兼容),这些设置将无效。

   maxWorkerThreads 和 maxIoThreads 分别控制工作线程数以及处理新提交的 ASP.NET 请求的线程数。这些设置需要在您的 Machine.config 中进行配置,它们将影响您计算机上运行的所有 Web 应用程序。maxWorkerThreads 是 Machine.config 中的 processModel 元素的一部分,并且您在查看后会发现,该设置的默认值为每个处理器 20 个线程。

Asp+Sql对数据库的各种操作

热点推荐

登录注册
触屏版电脑版网站地图