質問

IHttpAsyncHandlerを実装する汎用ハンドラーを使用すると、パフォーマンスの問題が発生します。最も単純な場合、ハンドラーはGET要求を受信し、20秒後に '<!> lt;を書き込んだ後、応答を終了します。タイムアウト/ <!> gt; '応答へ。

.ashxを10000から20000の同時リクエストでハンマーすると、正確に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はかなり石に設定されているようです。 こちらそのappRequestQueueLimit 5000を超えることはできませんが、これに関するこれ以上の情報を見つけることはできず、これが誤った情報かどうか疑問に思います。

<!> quot; flood-control <!> quotの種類はありますか?単一のホストを5000以下の要求に制限している可能性があるIISの設定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));
            }

        }
    }
}
役に立ちましたか?

解決

OK。修正... このの投稿でいくつかの詳細を整理してくれたことに感謝します。

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同時接続、問題なし。助けてくれてありがとう!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top