2012-04-19 72 views
3

私は一時的なポートの枯渇に遭遇している状況があり、例外が発生しています。私はこれを避けるために接続を抑制したいと思います。使用中の一時的なポートの数を検出する方法はありますか?あなたがクライアントであり、あなたはほぼ64kのアウトバウンド接続をオープンし、そして最後の2分以内にそれらを閉じていない場合使用中のエフェメラルポートの数を調べる方法は?

おかげで、 エリック

+0

、あなたのアプリケーションが開いたどのように多くのトラックを保持した場合、それは良い最初のレベルの近似値になるでしょう。 UDPとTCPは(ローカルIP、ピアIP、ローカルポート、リモートポート)経由でセッションを追跡しているため、一時的なポートの枯渇に苦しんでいるという強い疑問があります。単一のポートは何十万もの接続に使用できます一握りの同僚や数十万の同僚にこの問題を回避するコードを調べる前に、 'netstat'出力または' netstat'に相当するプラットフォームをデバッグしてください。たぶんファイル記述子やソケットの制限がありそうです。 – sarnold

+1

Azure上で、Azure VMのAzureストレージを使用してこの状況に遭遇しました。我々は、それがエラーからの一時的なポートの問題であることを確認しました。また、(5k - > 2kから)制限を増やし、再利用にかかる時間を短縮することで問題を解決しました。問題は、すべてのVMでこれを実行したくないということです。 –

+0

Azureはデフォルトでは既存の接続を再利用しませんか? – sarnold

答えて

1

を使用すると、一時的なTCPポートが不足することができる唯一の方法です。

これはテストシナリオで発生することがありますが、現実的なケースを表すものではありません。

これは、接続時のバインドエラーです。バインドエラーが発生していない場合は、この問題はありません。

+3

Azure上で、Azure VMのAzureストレージを使用してこの状況に遭遇しました。我々は、それがエラーからの一時的なポートの問題であることを確認しました。また、(5k - > 2kから)制限を増やし、再利用にかかる時間を短縮することで問題を解決しました。 Azure VMからAzureストレージに行くには、非常に近い(1ホップ)10 GigE接続を使用しています。各ストレージ操作では、新しいTCP接続が使用されます。デフォルトでは、ウィンドウは一時的なポートに対して5kポートしか予約しません。それを増やすことはできますが、レジストリの変更と再起動が必要です。私が限界に近づいたら、むしろスロットルをしたいと思う。 –

1

開いている接続のリストを取得するには、netstatコマンドを使用します。一般的な(他の回答の)信念とは対照的に、エフェメラルポートの数は限られています(Windows 2003では4000、それ以降のバージョンでは16000、ほとんどのLinuxでは16000)。ポートが未使用になった時点でポートを解放するのに4分かかりますので、実際に問題になる可能性があります。

それに対処するMSDNの記事があります:http://msdn.microsoft.com/en-us/library/aa560610(v=bts.20).aspx

関連する問題