争用、 性能差、 和死锁时使从 ASP.NET 应用程序与 Web 服务的调用

文章翻译 文章翻译
文章编号: 821268 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当进行从 Microsoft ASP.NET 应用程序调用 Web 服务时,您可能会遇到争用、 性能差、 和死锁。报告的客户端可能请求停止响应 (或"挂起"),或需要很长时间来执行。如果怀疑死锁,则可能回收工作进程。在应用程序事件日志中,您可能会收到下面的消息。
  • 如果您使用的 Internet Information Services (IIS) 5.0,应用程序日志中收到以下消息:

       Event Type:     Error
       Event Source:   ASP.NET 1.0.3705.0
       Event Category: None
       Event ID:       1003
       Date:           5/4/2003
       Time:           6:18:23 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          aspnet_wp.exe  (PID: <xxx>) was recycled because it was suspected to be in a deadlocked state.
          It did not send any responses for pending requests in the last 180 seconds.

  • 如果您使用的 IIS 6.0,则应用程序日志中收到以下消息:

       Event Type:     Warning
       Event Source:   W3SVC-WP
       Event Category: None
       Event ID:       2262
       Date:           5/4/2003
       Time:           1:02:33 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          ISAPI 'C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll' reported itself as
          unhealthy for the following reason: 'Deadlock detected'.

  • 如果您使用的 IIS 6.0,系统日志中收到以下消息:

       Event Type:     Warning
       Event Source:   W3SVC
       Event Category: None
       Event ID:       1013
       Date:           5/4/2003
       Time:           1:03:47 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.
          The process id was '<xxxx>'.

您还可能会收到以下异常错误消息时进行调用HttpWebRequest.GetResponse方法:
"System.InvalidOperationException:要完成的线程池对象中没有足够的自由线程操作。"
您还可能会收到以下异常错误消息在浏览器中:
"HttpException (0x80004005): 请求超时离开。"
注意这篇文章也适用于直接进行HttpWebRequest请求的应用程序中。

原因

此问题可能会出现的因为 ASP.NET 将限制数量辅助线程和调用可用于执行的完成端口线程请求。

通常情况下,对 Web 服务的调用将使用一个辅助线程执行的代码,将该请求发送和一个完成端口线程,从 Web 服务接收回调。但是,如果该请求将被重定向或要求进行身份验证,该调用可能使用两个工作线程和两个完成端口线程。因此,可以在多个 Web 服务调用发生在同一时间耗尽托管线程池。

例如,假设 ThreadPool 限于 10 个工作线程,并且所有的 10 个工作线程当前正在执行代码的等待执行的回调。回调可从不执行,因为排队到线程池的任何工作项被阻止,直到某个线程变得可用。

争夺另一个潜在根源是System.Net命名空间用来限制连接数的maxconnection参数。通常情况下,这一限制就能如期作用。但是,如果尝试做很多很多应用程序请求为单个 IP 地址在同一时间,线程可能必须等到一项可用连接。

解决方案

要解决这些问题,您可以调整以最适合您的情况的 Machine.config 文件中有以下参数:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • maxconnection
  • executionTimeout
若要成功地解决这些问题,请执行以下操作:
  • 在可以执行的 ASP.NET 请求数限制同一时间大约 12 种每个 CPU。
  • 允许 Web 服务回调可随意使用中线程池的线程。
  • 选择适当的maxconnections参数的值。您的选择基于 IP 地址的数量,所使用的应用程序域。
注意建议以限制 12 种 ASP.NET 请求数每个 CPU 是有点任意的。但是,已证明此限制适用于大多数应用程序。

maxWorkerThreadsmaxIoThreads

ASP.NET 使用以下两个配置设置若要限制的辅助线程和完成线程的最大数量使用:
<processModel maxWorkerThreads="20" maxIoThreads="20">
MaxWorkerThreads参数,并使用maxIoThreads参数隐式与 Cpu 数的乘积。对于示例中,如果您有两个处理器,最大工作线程数为以下几种:
2 * maxWorkerThreads

minFreeThreadsminLocalRequestFreeThreads

ASP.NET 还包含以下配置设置用来确定多少辅助线程和完成端口线程必须是可用来启动远程请求或本地请求:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
如果没有足够的线程可用,请求进行排队直到足够线程可以自由地发出请求。因此,ASP.NET 将执行以下请求数多于在相同的时间:
(maxWorkerThreads*Cpu 数)-minFreeThreads
注意MinFreeThreads参数,并使用minLocalRequestFreeThreads参数是不隐式相乘的 Cpu 数量。

minWorkerThreads

自 ASP.NET 1.0 Service Pack 3 和 ASP.NET 1.1 版中,ASP.NET 还包含下列配置设置,可以决定如何很多的工作线程进行可立即用于远程提供服务请求。
<processModel minWorkerThreads="1">
线程由此控制可以在更快的速度比创建设置从 CLR 默认"线程-微调"创建的辅助线程功能。此设置启用 ASP.NET 为可能的服务请求突然填充后端 slow-down 由于 ASP.NET 请求队列服务器请求从客户端,或其它类似突然爆发这会导致队列中的请求数中的突然上升。"minWorkerThreads参数的默认值为 1。我们建议您将minWorkerThreads参数的值设置为下面的值。
minWorkerThreads = maxWorkerThreads / 2
默认情况下, minWorkerThreads参数不是存在于 Web.config 文件或Machine.config 文件中。此设置是隐式的数的乘积Cpu。

maxconnection

Maxconnection参数确定可对进行多少连接特定的 IP 地址。参数即会出现,如下所示:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://65.53.32.230" maxconnection="12">
</connectionManagement>
如果在应用程序代码引用该应用程序通过主机名而不是 IP 地址,该参数应如下所示:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname" maxconnection="12">
</connectionManagement>
最后,如果除 80 之外的端口上承载的应用程序时,该参数必须类似于以下的 URI 中包含非标准的端口:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="http://hostname:8080" maxconnection="12">
</connectionManagement>
过程级别的全部内容的前面部分讨论的参数设置。但是, maxconnection参数的设置应用到应用程序域级别。默认情况下,由于此设置将应用于应用程序域级别,您可以创建最多两个连接到特定的 IP 地址,从每个应用程序域中的您过程。

executionTimeout

ASP.NET 使用以下配置设置为限制请求执行时间:
<httpRuntime executionTimeout="90"/>
您还可以通过使用Server.ScriptTimeout属性设置此限制。

注意如果您增加executionTimeout参数的值,可能需要修改processModelresponseDeadlockInterval参数的设置。

建议

建议在这一节中的设置可能不适合所有应用程序。但是,以下附加信息可帮助您进行适当的调整。

如果正在进行如何为单个 IP 地址一个 Web 服务调用并将其保存在每个 ASPX 页面中,Microsoft 建议使用以下配置设置:
  • maxWorkerThreads参数,并使用maxIoThreads参数的值设置为100
  • 设置为maxconnection参数的值 12 *N (位置 N 为 Cpu 的数量,有)。
  • 设置为minFreeThreads参数的值 88 *N 和的minLocalRequestFreeThreads参数76 *N.
  • 设置50minWorkerThreads的值。请记住,在配置文件中默认情况下不是minWorkerThreads 。您必须添加它。
一些这些建议涉及一个简单的公式,其中涉及到数量在服务器上的 cpu。在 Cpu 数表示的变量公式为 N.对于这些设置,如果您已启用,超线程您必须使用物理 Cpu 数逻辑 Cpu 数。例如,如果您有一台四处理器服务器启用,则超线程值 N 在公式中将有8 (而不是4个。

注意当您使用此配置时,您可以执行最多 12 个ASP.NET 请求每个 CPU 同时因为100 88 = 12。因此,至少 88 *N 工作线程和 88 *N 完成端口线程可用于其他用途 (如 Web 服务回调)。

例如,您有一台服务器有四个处理器和超线程启用。基于这些公式,可以使用下面的数值本文中提及的配置设置。
<system.web>
	<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
	<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>

<system.net>
	<connectionManagement>
		<add address="[ProvideIPHere]" maxconnection="96"/>
	</connectionManagement>
</system.net>

还有,当您使用此配置中,12 个连接可供每个 CPU 每个 IP 地址的每个应用程序域。因此,在下面的示例方案中,很少发生争用时请求正在等待连接和线程池不会被耗尽:
  • Web 主机只能有一个应用程序 (应用程序域)。
  • 每次请求 ASPX 页面使一个 Web 服务请求。
  • 所有请求都是为同一个 IP 地址。
但是,当您使用此配置,方案涉及的下列选项之一将可能使用太多的连接:
  • 到多个 IP 地址的请求。
  • 请求被重定向 (302 状态代码)。
  • 请求要求身份验证。
  • 请求是由多个应用程序域。
在这些情况下,最好使用较低的值为maxconnection参数和更高的minFreeThreads参数,并使用minLocalRequestFreeThreads参数的值。

状态

这行为是设计使然。

更多信息

如果您遇到性能不佳和 ASP.NET 和的 IIS 7.0 上的争用,请转到下面的 Microsoft 博客:
在 IIS 7.5,IIS 7.0 中,IIS 6.0 中的 ASP.NET 线程使用情况

在 IIS 7.0 中的 ASP.net 挂起

参考

有关详细信息,请转到以下 Microsoft 开发人员网络 (MSDN) 网站:
提高 ASP.NET 性能

属性

文章编号: 821268 - 最后修改: 2013年2月6日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft .NET Framework 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
关键字:?
kbprb kbmt KB821268 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 821268
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com