23

私たちは最近、私たちのウェブサイトで executionTimeout が機能しなくなったことに気付きました。昨年は間違いなく機能していました...いつ停止したかはわかりません。

私たちは現在実行中です:

  • Windows-2008x64
  • IIS7
  • 32 ビット バイナリ
  • マネージド パイプライン モード = クラシック
  • フレームワークのバージョン = v2.0

Web.Config は

<compilation defaultLanguage="vb" debug="false" batch="true">
<httpRuntime executionTimeout="90" />

Timetaken が最大 20 分まで表示される理由についてのヒント。DebugType (full と pdbonly) のコンパイル オプションは効果がありますか?

datetime       timetaken httpmethod Status  Sent    Received<BR>
12/19/10 0:10  901338    POST       302 456 24273<BR>
12/19/10 0:18  1817446   POST       302 0   114236<BR>
12/19/10 0:16  246923    POST       400 0   28512<BR>
12/19/10 0:12  220450    POST       302 0   65227<BR>
12/19/10 0:22  400150    GET        200 180835  416<BR>
12/19/10 0:20  335455    POST       400 0   36135<BR>
12/19/10 0:57  213210    POST       302 0   51558<BR>
12/19/10 0:48  352742    POST       302 438 25802<BR>
12/19/10 0:37  958660    POST       400 0   24558<BR>
12/19/10 0:06  202025    POST       302 0   58349<BR>
4

3 に答える 3

7

実行タイムアウトと所要時間は 2 つの異なるものです。とはいえ、矛盾の大きさは厄介です。

time-taken には、要求/応答のすべてのネットワーク時間が含まれます (特定の条件下で)。ネットワーク転送時間は、リクエストに実際にかかる時間を簡単に上回ります。とはいえ、通常、私は数分ではなく数秒の違いに慣れています。

実行タイムアウトは、ワーカー プロセスが要求の処理に費やした時間のみを指します。これは所要時間のサブセットにすぎません。debug 属性が false に設定されている場合にのみ適用されます。あなたが持っているように見えます。

もちろん、リストした最初のリクエストが許可されたタイムアウトの 90 秒を完全に使用したと仮定すると、基本的に 24k のデータを転送するために、時間枠に 13.5 分が残っています。深刻なネットワークの問題のようです。

したがって、深刻なトランスポートの問題があるか、リクエストが処理されているツリーのどこかに別の web.config ファイルがあり、デバッグを true に設定するか、実行タイムアウトを天文学的に増加させます。

別の可能性として、ページ自体に debug 属性が設定されているか、独自のタイムアウト値が設定されている可能性があります。

于 2010-12-20T15:10:34.960 に答える
0

理論はあるのですが、それを証明する方法がわかりません。私はcbcolinと同様のことを行い、リクエストがBeginRequestイベント ハンドラー内から開始された時刻をログに記録しました。次に、リクエストがタイムアウトすると (この場合は 1 時間後)、データベースにログが記録され、タイムスタンプが記録されます。

理論は次のとおりです。ASP.NET は、スレッドが実際に実行されている時間のみをカウントし、スレッドがスリープしている時間はカウントしません。

そのため、スレッドがスリープ状態になった後BeginRequest、POST 本文全体が IIS によって受信されるまで続きます。次に、スレッドが起動されて作業が行われ、executionTimeout時計が動き始めます。そのため、ネットワーク送信フェーズで費やされた時間は、executionTimeout. 最終的に、サイト全体の接続タイムアウトに達し、IIS が接続を閉じ、ASP.NET で例外が発生します。

BeginRequestさらに、POST 本文が Web サーバーに転送される前にPreRequestHandlerExecuteすべてが呼び出されます。次に、リクエスト ハンドラが呼び出されるまでに長いギャップがあります。したがって、.NET には 30 分間要求があったように見えるかもしれませんが、スレッドはそれほど長くは実行されていません。

リクエスト ハンドラが実際に実行を開始した時刻の記録を開始し、設定した制限を超えるかどうかを確認します。

URLごとに、このようにリクエストが送信フェーズにとどまることができる時間を制御する方法については、私にはわかりません。グローバル レベルでは、アプリケーションの webLimits でminBytesPerSecondを設定できます。私が見つけることができるUIはありません。これにより、送信フェーズで超低速クライアントが開始されます。

それでも、実際にデータを送信する DoS 攻撃の問題は解決しません。

于 2011-06-20T18:20:25.450 に答える