【问题标题】:Long running HttpWebRequests长时间运行的 Http Web 请求
【发布时间】:2011-01-12 04:02:45
【问题描述】:

我有一个在 IIS6 服务器上运行的 ASP.NET Web 应用程序。应用程序正在对远程机器上的 xml 服务进行可能长时间运行的调用。远程计算机上的某些服务调用需要很长时间才能执行(有时长达 4 分钟)。长期解决方案是使调用异步,但作为短期解决方案,我们希望增加调用超时和整体 httpRequest 超时。

我担心的是长时间运行的调用会填满请求队列并阻止“正常”页面请求完成。如何调整服务器、IIS 和应用程序设置以暂时解决问题?

目前大约有 200 个页面请求/分钟,这导致 270 个服务请求/分钟。

  • 当前执行超时为 360(6 分钟)
  • 当前服务调用超时时间为 2 分钟

【问题讨论】:

    标签: asp.net iis-6 httpwebrequest


    【解决方案1】:

    Microsoft 知识库上有这篇文章,其中包含您可能需要的几乎所有信息:

    * Contention, poor performance, and deadlocks when you make Web service requests from ASP.NET applications


    我会给你一些我对上面文章中处理的一些具体项目所做的研究。以下信息适用于 IIS6,适用于 IIS7 的 cmets。

    将处理器工作线程池从 25 个增加到至少 100 个

    线程池大小的默认值为 100,因为 autoConfig 的默认值为 true。

    autoConfig 涵盖的值为

    • maxWorkerThreads
    • maxIoThreads
    • 最大连接数

    有一个仍然是 25 的值必须更改 - ASPProcessorThreadMax,这只能在 IIS6 的 IIS 元数据库中设置(通过 adsutil 工具)。 [IIS7 的等价物是processorThreadMax 值]

    所以我选择不更改 machine.config 设置,因为它们很好,而且还有其他参数会受到关闭 autoconfig 的影响,而是通过 IIS 元数据库将 ASPProcessorThreadMax 从 25 更改为 100(更改此值的唯一方法)。

    例如

    cscript %SYSTEMDRIVE%\Inetpub\AdminScripts\<nowiki>adsutil.vb</nowiki>s SET W3SVC/AspRequestQueueMax 100
    

    每台服务器的最大连接数

    maxconnection autoconfig 将此值设置为 12*number of cpu's,这就是您一次连接的每个地址可以建立的连接数。

    调试

    您可以执行以下操作:

    监控请求是否在队列中等待

    监控以下计数器:

    • 运行 perfmon
    • 添加计数器:   应用程序队列中的 ASP.NET 应用程序/请求

    这将告诉我们工作项是否因为工人短缺而排队。

    检查应用程序池使用的身份

    1. 打开 IIS 管理器
    2. 在 IIS 管理器中检查您的站点使用了哪个应用程序池。
    3. 在 Application Pools 列表中选择正在使用的应用程序池,然后右键单击 -> 属性并查看正在使用的帐户身份。
    4. 默认应该是Network Service。

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多