我使用实现IHttpAsyncHandler的通用处理程序遇到了一些性能问题。最简单的是,处理程序接收GET请求,20秒后写入'<<超时/>'回应。
当使用10000-20000个并发请求锤击.ashx时,在准确的5000个请求之后,503服务器无法使用它。当切换到同步模式并立即结束请求时,问题就消失了。
我已经修改了许多设置,但我唯一能够实现的是降低发生此错误的请求阈值。
以下是我玩过的设置的简要说明:
machine.config中:
<configuration>
...
<system.web>
...
<processModel enable="true" requestQueueLimit="10000"/>
...
的web.config:
<configuration>
...
<system.web>
...
<httpRuntime enable="true" appRequestQueueLimit="10000"/>
...
IIS管理器&gt; ApplicationPools&gt;高级设置
Queue Length : 65535
虽然我无法确定,但是如果请求是同步的,这些设置看起来好像很好,但是当异步时,在服务器开始告诉我消失之前,我似乎无法超越5000个请求。如果我把事情设置得更低(不能确切地记住上面的设置,但我已经尝试了所有设置),那么503计数会相应地上升,但是当负载严重时我永远不能阻止它超过5000
似乎有很多设置分散在无数的地方可能会影响到这一点,但5000似乎相当固定。我看到here appRequestQueueLimit不能超过5000,但是找不到关于此的更多信息,并想知道这是否是错误的信息。
IIS中是否存在任何类型的“泛洪控制”设置,可能会将单个主机限制为不超过5000个请求?如何让IIS处理超过5000个并发异步请求?
编辑2:是否有任何计数器或其他指标可能超出限制,我将如何进一步调查?
编辑:这是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));
}
}
}
}
答案 0 :(得分:6)
行。已修复...非常感谢this帖子清除了一些细节。
要消除503错误,需要3个不同的配置更改:
<强> machine.config中:强>
<configuration>
...
<system.web>
...
<processModel enable="true" requestQueueLimit="100000"/>
IIS管理器&gt; ApplicationPools&gt;高级设置
Queue Length : 65535
最后(拼图的缺失部分),命令行:
appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
主帖中提到的web.config设置无关紧要。
10000并发连接,没问题。谢谢你的帮助!