2024年3月27日发(作者:)

IIS服务请求时的死锁、挂起解决方案

IIS服务请求时的死锁、挂起解决方案2010-05-19 10:50症状

使从调用XML Web services时应用您可能会遇到争用、性能下降

和死锁。客户端可能会报告请求停止响应(或"挂起")或需要执.使从调

用XML Web services时应用您可能会遇到争用、性能下降和死锁。客户端可能

会报告请求停止响应(或"挂起")或需要执行一个很长时间。如果怀疑死锁,工

作进程可能回收。应用程序事件日志中,可能会收到以下消息。如果要使用

Microsoft Internet Information Services(IIS)5.0,应用程序事件日志中收

到以下消息:

Event Type:Error Event Source: 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_(PID:xxx)was

recycled because it was suspected to be in adeadlocked 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:

meworkv.1.1.4322aspnet_'reported

itself as unhealthy for the following reason:'Deadlock detected'.

如果您使用IIS 6.0在系统事件日志中收到以下消息:

Event Type:Warning Event Source:W3SVC Event Categor y: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 process

id was'xxxx'.

在进行调用ponse方法时,您可能还会收到以下异

常错误信息:dOperationException:ThreadPool对象来完成该

操作中未有足够的自由线程"在浏览器中,您可能还会收到以下异常错误信息:

HttpException(0x 80004005):请求超时"请注意本文还适用于直接发出

HttpWebRequest请求的应用程序中。

原因

限制的工作线程和调用可用于执行请求的完成端口线程数可能会

发生此问题。通常,调用Web服务使用一个工作线程执行发送请求的代码和从

Web服务.限制的工作线程和调用可用于执行请求的完成端口线程数可

能会发生此问题。

通常,调用Web服务使用一个工作线程执行发送请求的代码和从Web服务

接收回调的一个完成端口线程。但是,如果请求被重定向,或要求身份验证,

调用将可以使用多达两个工作和两个完成端口线程。因此,多个Web服务调用

发生在同一时间时可以耗尽托管的ThreadPool。

是例如假设ThreadPool是限制为10的工作线程所有10个工作线程当前执

行正在等待回调执行的代码。回调可以永远不会执行,因为要排队发送至

ThreadPool的任何工作项被阻止,直到线程可用。

另一个潜在的源的争用是命名空间用来限制连接数不超过

maxconnection参数。通常情况下,此限制正常工作。但是,如果许多应用程

序尝试多请求对单个IP地址在同一时间,线程可以等待可用的连接。

解决方案

要解决这些问题,您可以以最适合您的具体情况在文件中

调整以下参数:maxWorkerThreads minWorkerThrea.要解决这些问题,您可以

以最适合您的具体情况在文件中调整以下参数:

maxWorkerThreads minWorkerThreads maxIoThreads minFreeThreads

minLocalRequestFreeThreads maxconnection executionTimeout要成功地解

决这些问题,请执行下列操作:限制在同一时间为每个CPU的大约12可以执行

的请求的数量。允许为自由地在ThreadPool中使用线程的Web服务回

调。选择为maxconnections参数的适当值。您的选择根据IP地址和使用的

AppDomain的数目。请注意要限制对每个CPU的12的请求的数量建议

有点任意。但是,此限制已证明和用于大多数应用程序。

maxWorkerThreads和maxIoThreads 使用限制工作线程和使用的

完成线程的最大数量的下列的两个配置设置:processModel

maxWorkerThreads="20"maxIoThreads="20"

maxWorkerThreads参数和maxIoThreads参数隐式相乘CPU数。是例如如

果两个处理器最大的工作线程数是:2*maxWorkerThreads minFreeThreads和

minLocalRequestFreeThreads 还包含在下面的配置设置,用于确定多

少工作线程和完成端口线程必须可用于启动远程请求或本地的请求:

httpRuntime minFreeThreads="8"minLocalRequestFreeThreads="8"

如果没有足够的线程可用,请求被排队,直到足够的线程都能够发出请求。

因此,不会执行多个下列数量的请求在同一时间:

(maxWorkerThreads*number of CPUs)的minFreeThreads请注意

minFreeThreads参数和minLocalRequestFreeThreads参数不隐式相乘CPU数。

minWorkerThreads 1.0 Service Pack 3和 1.1,

还包含以下配置设置,确定多少工作线程可能可用立即向远程请求提

供服务。processModel minWorkerThreads="1"

受此设置的线程可以创建速度比从CLR的默认"线程优化"功能创建的工作

线程更快得多。此设置可能会突然被填充后端服务器的队列中导致请求数的突

然上升的请求从客户端结束,或类似的突然爆发的slow-down由于在

请求队列的服务请求启用。minWorkerThreads参数,默认值为1。我

们建议您将minWorkerThreads参数的值设置为以下值。

minWorkerThreads=maxWorkerThreads/2

默认,minWorkerThreads参数不是在文件或

文件中存在。此设置隐式乘以CPU数。

maxconnection在maxconnection参数确定多少可以无法连接到特定的IP

地址。参数如下:connectionManagement add

address="*"maxconnection="2"add

address="65.53.32.230"maxconnection="12"/connectionManagement

所有在进程级别的讨论上文中的参数将设置。但是,该maxconnection参

数设置将应用于AppDomain级别。默认,因为此设置适用于该AppDomain级别

可以创建最多两个连接到特定的IP地址从每个AppDomain过程中。

executionTimeout 使用下面的配置设置限制请求执行时间:

httpRuntime executionTimeout="90"/

还可以通过使用TimeOut属性设置此限制。

请注意如果您增加executionTimeout参数的值,还可能必须修改

processModel responseDeadlockInterval参数设置。

建议

建议使用此部分中的设置可能无法对所有应用程序。但是,以下附加信息

可以帮助您进行相应调整。

如果您是一个Web服务调用,到一个单一的IP地址从每个ASPX页,

Microsoft将建议您使用以下配置设置:设置为100的maxWorkerThreads参数

和maxIoThreads参数值。设置maxconnection参数的值12*N(其中,N是必须

的CPU数)。设置minFreeThreads参数的值88*N,

minLocalRequestFreeThreads参数76*N。将minWorkerThreads的值设置为50。

请记住,minWorkerThreads不在默认情况下在配置文件。必须添加它。这些建

议的一些包括涉及在服务器上的CPU数的简单公式。该变量类型的代表公式中

的CPU数为N。这些设置,如果您有超线程启用,必须使用逻辑的CPU数而不

的物理CPU的数字。是例如如果四处理器服务器具有启用超线程,则公式中的

N值将为8,而不是4。

请注意当您使用此配置时,您可以执行每个CPU的12个请求最多

同时因为100 88=12。因此,至少88*N工作线程和88*的其他使用(例如为Web

服务回调)N完成端口线程可用。

是例如,您有一个服务器,而且四个的处理器并启用超线程。根据这些公

式,您将使用下列值这篇文章中提到的配置设置。processModel

maxWorkerThreads="100"maxIoThreads="100"minWorkerThreads="50"httpRunt

ime

minFreeThreads="704"minLocalRequestFreeThreads="608"connectionManagem

ent add

address="[ProvideIPHere]"maxconnection="96"//connectionManagement

此外时使用此配置,12连接可用每个CPU每个每个AppDomain的IP地址。

因此,在下面的情形中很少的争用请求正在等待连接,并ThreadPool不用完时

发生:网站承载只有一个的应用程序(AppDomain)。ASPX页的每个请求将一个

Web服务请求。所有请求都是相同的IP地址。但是,使用此配置时,涉及到下

列项之一的方案将可能使用连接太多:请求是多个IP地址。请求是重定向(302

状态代码)。请求要求身份验证。从多个AppDomain发出请求。在这些情况下,

很好用于maxconnection参数和/minFreeThreads参数和

minLocalRequestFreeThreads参数的更高值的较低的值。

这种现象是设计使然。这种现象是设计使然。

参考

有关详细信息,请访问下面的Microsoft Developer Network(MSDN)网站:

有关详细信息,请访问下面的Microsoft Developer Network(MSDN)网站:(这

篇文章中的信息适用于: Framework 2.0 Microsoft

1.1 Microsoft 1.0回到顶端关键字:kbmt kbprb KB 821268 KbMtzh