System.Web.HttpException: 服务器太忙
从发生错误的情况判断应该是服务器的处理队列达到限制,因此抛出异常。
之前曾经调整过对应Framework版本的machine.config文件,主要涉及processModel节的maxWorkerThreads、maxIoThreads和minWorkerThreads,情况有所好转,但是一直未能根除,感觉只是提升了WEB服务器自身的处理极限,但当外部数据源缓慢的时候,需要处理的事务依然会排长队,超出队列长度,进而报错。
最近看到篇介绍machine.config配置的文章:《ASP.NET 设置架构参考》,很详细,这才发现,原来已经距离答案很近,只是没留意,请注意学习processModel章节。
首先在machine.config中是可以配置整个WEB服务器的请求队列长度(processModel节requestQueueLimit,默认5000)和单个站点默认的请求队列长度(httpRuntime节appRequestQueueLimit,默认100);考虑到其他站点访问量没有这么大,并且整个WEB服务器的请求队列长度5000也应该足够,那我们需要的就是单独修改该站点的队列长度;鉴于httpRuntime节是可以在对应站点下的web.config中配置的,所以我们只需要改动这个站点的web.config即可,增加一行配置,指定队列长度为1000(未修改之前是对应Framework版本下的machine.config中httpRuntime节appRequestQueueLimit决定默认值的),问题有明显改善,今天在一度极端缓慢的情况下,也没有观察到服务器太忙的错误重现。
<system.web>
...
<httpRuntime appRequestQueueLimit="1000"/>
...
</system.web>
附:
1、怎么知道我的站点是用的哪个版本的Microsoft.NET Framework:IIS中对应站点鼠标右键>属性
2、machine.config文件在哪里:一般<WINDOWS安装目录>\Microsoft.NET\Framework\对应版本号\CONFIG\
3、网上看到另外一种说法是修改对应站点归属应用程序池的“请求队列限制”来解决相同问题,我之前单独修改试过,观察不到效果;不过我想可以双管齐下,现在也是这么做的;这个的默认值是4000
4、怎么知道某个站点用的哪个应用程序池:IIS中对应站点鼠标右键>属性