2015-11-10 15 views
5

Windowsサービスを使用して、内部RESTサービス(20-40コール/秒)に対して非常に頻繁なHTTPコールを行っていますが、サービスが数分間実行された後に応答が得られるまでに時間がかかることに注意してください。HttpWebRequestポートの枯渇

netstatを見ると、「TIME_WAIT」状態のポートがかなりあり、ポートが不足しているようです。

ポートを再利用するにはどうすればいいですか?

+0

完了後にリクエストインスタンスを破棄していますか? –

+0

多くのスレッドも使用していますか? – CSharpie

+0

本当にこれはパフォーマンスに関する質問です...あなたの問題の原因としてこれをゼロにしました...私はそれが確信していません。私はそれが別の問題の症状である可能性がはるかに高いと言いたい。 – spender

答えて

1

送信HTTP同時接続数には制限があります。あなたは、これは、あなたがすることができます解決しない場合はそれは私が2

であると考えているデフォルトよりも高い値にこれを価値のある設定であるかもしれないHttpWebRequestオブジェクト

を作成する前に System.Net.ServicePointManager.DefaultConnectionLimit静的プロパティを使用してこれを制御することができますさらに多くのリクエストをより速く作成できるように、デフォルトの ThreadPoolサイズを増やしてください。スレッドプールは徐々にスレッド数を徐々に増加させるだけです - 新しい半二重のスレッド、IIRC

+0

おかげで、私たちは既にweb.configファイルに次のように設定しています* "maxconnection =" 1000000 "/ user2966445

+0

また、リクエストが送信されている間にトレースを実行し、GetRequestStream()の平均値は0〜1msですが、GetResponse ()メソッドは時々60,000ms +を要します。受信側では、応答を処理する時間が1,000ms未満であることが分かります。したがって、ボトルネックは送信側にあります。 – user2966445

+0

@ user2966445終了したら、返事などを確実に処分しますか?これを行うと、C#は既定で同じ基本ネットワーク接続を再利用する必要があります(同じ要求ではありませんが、これは不可能です)。我々はすでに設定ファイルに最大接続数を設定しようとしました –

0

どのようにしてポートを再利用することができますか?接続制限値を、そうでないことをほぼ保証する値に設定しないでください。

ある時点で、誰かがServicePointManagerでサルを持っているようです。私はこの起源のためにServicePointを制限します:httpパイプライニングと接続の再利用を奨励するため:

ServicePointManager.FindServicePoint(Uri).ConnectionLimit = someSensibleValue; 
+0

<アドレスを追加= "*" MAXCONNECTION = "1000000" /> user2966445

+0

user2966445 @だから、一時ポートが49152から範囲〜65535 ...または16383。このような高い価値を使いこなす可能性が考えられます。このホストのために10を超える必要があるのはなぜですか?最適なのは、未応答の同時リクエスト数ですか?通常の条件では、この値より多くの接続を必要とすべきではありません。接続は再利用できます(リモートホストがhttp1.0で、 'connection:close'ヘッダを発行したり、接続を強制終了しない限り)。このような高い価値は、接続の再利用がなくなり、TIME_WAITに近づいて終了するため、有害となります。 – spender

関連する問題