Asp.net IIS 7.0 503通用处理程序(.ashx)实现IHTTPassynchandler时出错

Asp.net IIS 7.0 503通用处理程序(.ashx)实现IHTTPassynchandler时出错,asp.net,iis-7,ashx,ihttpasynchandler,http-status-code-503,Asp.net,Iis 7,Ashx,Ihttpasynchandler,Http Status Code 503,我在使用实现IHTTPassynchandler的通用处理程序时遇到了一些性能问题。最简单的情况是,处理程序接收GET请求,20秒后在将“”写入响应后结束响应 当用10000-20000个同时请求敲打.ashx时,它会失败,因为在5000个请求之后,503服务器不可用。当切换到同步模式并立即结束请求时,问题就消失了 我已经修改了许多设置,但我唯一能做到的是降低发生此错误的请求阈值 下面是我玩过的一些设置: machine.config: <configuration> ...

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

当用10000-20000个同时请求敲打.ashx时,它会失败,因为在5000个请求之后,503服务器不可用。当切换到同步模式并立即结束请求时,问题就消失了

我已经修改了许多设置,但我唯一能做到的是降低发生此错误的请求阈值

下面是我玩过的一些设置:

machine.config:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="10000"/>
        ...
<configuration>
    ...
    <system.web>
        ...
        <httpRuntime enable="true" appRequestQueueLimit="10000"/>
        ...
<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="100000"/>
虽然我不能确定,但如果请求是同步的,这些设置似乎可以很好地工作,但是如果是异步的,在服务器开始告诉我离开之前,我似乎不能得到超过5000个请求。如果我把事情设置得更低(我记不清上面的设置是什么,但我都试过了),那么503计数也会相应地升高,但我永远无法阻止在严重负载下超过5000的情况发生

似乎有许多设置分散在无数可能影响这一点的地方,但5000个似乎是固定不变的。我看到appRequestQueueLimit不能超过5000,但找不到关于此的进一步信息,不知道这是否是错误信息

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

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

编辑:以下是loadgenerator代码:

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));
            }

        }
    }
}
使用系统;
Net系统;
使用系统线程;
名称空间时间
{
班级计划
{
专用静态整数计数器=0;
静态void Main(字符串[]参数)
{
var限值=5000;
ServicePointManager.DefaultConnectionLimit=限制;
对于(int i=0;i
好的。固定的。。。非常感谢《邮报》澄清了一些细节

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

machine.config:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="10000"/>
        ...
<configuration>
    ...
    <system.web>
        ...
        <httpRuntime enable="true" appRequestQueueLimit="10000"/>
        ...
<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="100000"/>
最后(拼图中缺失的部分),命令行:

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
本文中提到的web.config设置与此无关


10000个并发连接,没有问题。谢谢你的帮助