Asp.net IIS 7.0 503通用处理程序(.ashx)实现IHTTPassynchandler时出错
我在使用实现IHTTPassynchandler的通用处理程序时遇到了一些性能问题。最简单的情况是,处理程序接收GET请求,20秒后在将“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> ...
<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个并发连接,没有问题。谢谢你的帮助谢谢分享这个解决方案,当一个站点因为某种原因有很多流量时,我得到了503个空白的空白屏幕,AppCMD修复了它。