1

私は Windows 8.1 を実行しており、HostableWebCore を利用して分離された ASP.NET Web サーバー プロセスを起動する統合テスト スイートを使用しています。パフォーマンス上の理由から、これらのうち 8 つを一度に起動し、起動したら、それぞれに非常に単純な Web 要求を送信します。これは、それぞれにロードされた MVC アプリケーションによって処理されます。すべてのインスタンスは異なるポートでリッスンしています。

問題は、リクエストが HTTP.sys (または最近では何と呼ばれていても) で滞っていることです (私は信じています)。フィドラーを見ると、8 つのリクエストすべてがすぐに (数ミリ秒以内に) ServerGotRequest 状態になっていることがわかります。ただし、一度に並行して実行する数に応じて、リクエストはこの状態で 20 ~ 100 秒間待機します。

これが HTTP.sys の問題であると私が疑う理由は、それらのいずれかが応答するのを待たなければならない時間が、並行してスピンアップするホスティング アプリケーションの数とともに増加するためです。ホスティング アプリケーションを 1 つだけ起動すると、20 秒以内に応答が開始されます。2 をスピンアップすると、両方とも約 30 秒で応答を開始します。4回スピンアップすると、〜40秒。8 回スピンアップすると、〜 100 秒 (デフォルトの WebClient 要求タイムアウト) になります。

この長い遅延のため、デバッガーをアタッチしてコントローラー アクションにブレークポイントを配置するのに十分な時間があります。そのブレークポイントは 20 ~ 100 秒の遅延後にヒットし、プロセスがまだ要求を受け取っていないことを示唆しています。すべてのホストは、5 ~ 10 秒間のコールド スタート CPU チャーニングの後、20 ~ 100 秒間アイドル状態になります。すべてのホストが同時にリクエストを受信して​​いるように見えます。まるで何かがリクエストの通過をブロックていて、突然すべてを通過させたかのようです。

私の問題は、HTTP.sys のデバッグ方法に関する情報を見つけることができなかったことです。どうすればそれが何をしているのかを見ることができますか? ブロックの原因は何ですか?ワーカーへのリクエストの転送を待っているのはなぜですか? なぜ彼らはすべて一緒にやってくるのですか?

または、これを回避してリクエストをすぐに(待たずに)受け取る方法を誰かが知っている場合は、非常に感謝しています。

別のメモ: ホスティング アプリケーションが起動するとすぐに、システム (PID 4) が指定したポートをリッスンするように登録されていることがわかります。

追加情報: これは、私のホスティング アプリの 1 つが下のように見えるものですnetsh http show servicestate

Server session ID: FD0000012000004C
    Version: 2.0
    State: Active
    Properties:
        Max bandwidth: 4294967295
        Timeouts:
            Entity body timeout (secs): 120
            Drain entity body timeout (secs): 120
            Request queue timeout (secs): 120
            Idle connection timeout (secs): 120
            Header wait timeout (secs): 120
            Minimum send rate (bytes/sec): 150
    URL groups:
    URL group ID: FB00000140000018
        State: Active
        Request queue name: IntegrationTestAppPool10451{974E3BB1-7774-432B-98DB-99850825B023}
        Properties:
            Max bandwidth: inherited
            Max connections: inherited
            Timeouts:
                Timeout values inherited
            Logging information:
                Log directory: C:\inetpub\logs\LogFiles\W3SVC1
                Log format: 0
            Number of registered URLs: 2
            Registered URLs:
                HTTP://LOCALHOST:10451/
                HTTP://*:10451/

Request queue name: IntegrationTestAppPool10451{974E3BB1-7774-432B-98DB-99850825B023}
    Version: 2.0
    State: Active
    Request queue 503 verbosity level: Basic
    Max requests: 1000
    Number of active processes attached: 1
    Controller process ID: 12812
    Process IDs:
        12812
4

1 に答える 1

0

主に後世のためにこれに答えます。私の問題は HTTP.sys ではなく、ASP.NET であることが判明しました。ファイルをコンパイルしようとすると、共有ロックが開かれます。この共有ロックは で識別されSystem.Web.HttpRuntime.AppDomainAppIdます。私のアプリはすべて共通applicationHost.configファイルから動的に構築されているため、すべて同じ AppDomainAppId ( /LM/W3SVC/1/ROOT) を持っていると思います。これは、それらがすべてロックを共有し、実質的にすべてのページのコンパイルがすべてのアプリに対して順番に行われることを意味します。ただし、ロックからの出入りの性質上、すべてのページが同時に終了する傾向があります。これは、ページのいずれかがタイムリーにプロセスの最後に到達する可能性が低く、すべてのページが終了する可能性があるためです。同じ頃。そのうちの 1 つが通過すると、他の人がすぐ後ろにいて、すぐに終了する可能性があります。

于 2015-04-03T21:32:48.690 に答える