IIS 7.0 503 错误与实现 IHttpAsyncHandler 的通用处理程序 (.ashx)

Posted

技术标签:

【中文标题】IIS 7.0 503 错误与实现 IHttpAsyncHandler 的通用处理程序 (.ashx)【英文标题】:IIS 7.0 503 errors with generic handler (.ashx) implementing IHttpAsyncHandler 【发布时间】:2010-10-11 08:47:22 【问题描述】:

我在使用实现 IHttpAsyncHandler 的通用处理程序时遇到了一些性能问题。最简单的情况是,处理程序收到一个 GET 请求,并在 20 秒后在响应中写入 '' 后结束响应。

当使用 10000-20000 个并发请求锤击 .ashx 时,它会在恰好 5000 个请求后失败,503 服务器不可用。当切换到同步模式并立即结束请求时,问题就消失了。

我已经修改了一些设置,但我唯一设法实现的是降低发生此错误的请求阈值。

以下是我玩弄过的设置的概要:

ma​​chine.config:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="10000"/>
        ...

web.config:

<configuration>
    ...
    <system.web>
        ...
        <httpRuntime enable="true" appRequestQueueLimit="10000"/>
        ...

IIS 管理器 > 应用程序池 > 高级设置

Queue Length : 65535

虽然我不能确定,但​​如果请求是同步的,这些设置似乎工作得很好,但是当异步时,在服务器开始告诉我离开之前,我似乎无法超过 5000 个请求.如果我把事情设置得更低(不记得上面到底是哪个设置,但我都试过了),那么 503 计数会相应增加,但在严重负载下我永远无法阻止它超过 5000 .

似乎散布在无数地方的许多设置可能会影响这一点,但 5000 似乎相当固定。我看到here appRequestQueueLimit 不能超过 5000,但找不到更多关于此的信息,想知道这是否是错误信息。

IIS 中是否有任何类型的“洪水控制”设置可能将单个主机限制为不超过 5000 个请求?如何让 IIS 处理超过 5000 个并发异步请求?

Edit2:是否有任何计数器或其他指标可能超出限制,我将如何进一步调查?

编辑:这是负载生成器代码:

using System;
using System.Net;
using System.Threading;

namespace HammerTime

    class Program
    
        private static int counter = 0;
        static void Main(string[] args)
        
            var limit = 5000;
            ServicePointManager.DefaultConnectionLimit=limit;
            for (int i = 0; i < limit;++i )
            
                StartWebRequest(i.ToString());

            
            Console.ReadLine();
        

        private static void StartWebRequest(string channelId)
        
            string uri = "http://spender2008/test/Test.ashx?channel="+channelId;
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
            request.BeginGetResponse(responseHandler, request);
        

        private static void responseHandler(IAsyncResult ar)
        
            try
            
                HttpWebRequest state = (HttpWebRequest)ar.AsyncState;
                HttpWebResponse response = (HttpWebResponse)state.EndGetResponse(ar);

            
            catch(Exception e)
            
                Console.WriteLine(e.Message);
            
            finally
            
                Console.WriteLine(Interlocked.Increment(ref counter));
            

        
    

【问题讨论】:

【参考方案1】:

好的。已修复...非常感谢this 帖子澄清了一些细节。

要消除 503 错误,需要进行 3 次不同的配置更改:

ma​​chine.config:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="100000"/>

IIS 管理器 > 应用程序池 > 高级设置

Queue Length : 65535

最后(拼图的缺失部分),命令行:

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

主帖中提到的 web.config 设置无关紧要。

10000 个并发连接,没问题。感谢您的帮助!

【讨论】:

感谢分享解决方案,当网站由于某种原因流量很大时,我得到了空白的白色 503 死屏,appcmd 修复了它

以上是关于IIS 7.0 503 错误与实现 IHttpAsyncHandler 的通用处理程序 (.ashx)的主要内容,如果未能解决你的问题,请参考以下文章

IIS HTTP 错误 503。服务不可用

在 IIS 7 中创建自定义 503 页面

IIS8 显示错误 503

IIS 7 服务不可用 503 错误

IIS 503 错误解决方案

IIS 强制 https 重定向导致 503 错误