使用可能な TCP/IP ポートが存在しないことの回避

クライアントがサーバーとの TCP/IP ソケット接続を開始した場合、通常、そのクライアントはサーバー上の特定ポートに接続し、一時的な (短期) TCP ポートまたは UDP ポートを経由してクライアントに応答するようサーバーに要求します。Windows Server 2003 および Windows XP では、クライアント アプリケーションが使用できる一時的なポートの既定の範囲は、1025 ~ 5000 です。状況によっては、既定の範囲内のポートがすべて使われてしまい、使用可能なポートがなくなってしまうことがあります。

使用可能な TCP/IP ポートが存在しないことが原因で、BizTalk サーバーに接続するアプリケーションで予期しないエラーが発生したり、BizTalk アプリケーションがリモート サーバーに接続したときに予期しないエラーが発生したりする

使用可能な TCP/IP ポートが存在しないという現象は、特定のクライアント アプリケーション以外にもさまざまな側面に見られますが、通常、ネットワーク接続の失敗を示すエラーとして明示されます。使用可能な TCP/IP ポートが存在しないことが原因でネットワーク接続エラーが発生したのかどうかを判断するには、クライアント コンピューターで次の手順を実行します。

  1. Windows XP または Windows Server 2003 を実行しているコンピューターで、[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。次に、「cmd」と入力し、[OK] をクリックしてコマンド プロンプトを開きます。

  2. 次のいずれかの操作を行います。

    • Windows XP ベースまたは Windows Server 2003 ベースのコンピューターで、コマンド プロンプトに次のコマンドを入力し、そのコンピューターの TCP/IP プロトコルによって使用されているアクティブな接続を表示します。

      netstat -n
      これにより、クライアント コンピューターにバインドされている TCP/IP アドレス、およびリモート サーバーとの通信に使用している各 TCP/IP アドレスのポートが表示されます。使用可能なポートがすべて使用されている場合、使用可能な TCP/IP ポートが存在しない現象が発生します。

    • Windows Server 2003 ベースのコンピューターで、コマンド プロンプトに次のコマンドを入力し、TCP/IP プロトコルによって使用されているアクティブな接続を表示します。

      netstat -b
      これにより、クライアント コンピューターにバインドされている TCP/IP アドレス、リモート サーバーとの通信に使用している各 TCP/IP アドレスのポート、およびそれらのポートを使用しているアプリケーションが表示されます。この情報は、TCP/IP ポートを過度に使用しているクライアント アプリケーションを特定する際に役立ちます。

使用可能な TCP/IP ポートが存在しないことに関連する問題

クライアント アプリケーションが TCP/IP ソケットを使用して BizTalk Server に接続を試みたとき、または BizTalk アプリケーションが TCP/IP ソケットを使用してサーバーに接続を試みたときに、次のようなエラーが発生することが確認されています。

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.

- または -

Unable to connect to the remote server
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.

上記のエラーが発生した場合、次の問題も発生している場合があります。

  • クライアント アプリケーションが BizTalk サーバーに接続できません。

  • BizTalk アプリケーション サービスがリモート SQL Server に接続できません。

  • BizTalk Server アダプターがリモート サーバーに接続できません。

  • クライアント アプリケーションによって行われる各ポート予約によって、カーネル メモリが消費されています。クライアントのポート予約数が著しく多い場合、Windows カーネル メモリの使用量もそれに応じて増加します。

原因

TCP/IP ソケット接続数が著しく多くなった要因にクライアント コンピューターが関与している場合、クライアント コンピューターで使用可能な TCP/IP ポートが存在しなくなることがあります。これは、多数のクライアント アプリケーションが接続を開始しようとしたときに発生する可能性があります。

使用可能な一時的なポートがすべてクライアント アプリケーションに割り当てられると、クライアントでは使用可能な TCP/IP ポートが存在しないという状況が発生します。使用可能な TCP/IP ポートが存在しない状況が発生すると、クライアントのポート予約を行えず、TCP/IP ソケットを介してサーバーへの接続を試行するクライアント アプリケーションでエラーが発生します。

使用可能な TCP/IP ポートが存在しない状況は、通常の負荷状態のときよりも、高負荷状態のときの方が発生しやすい傾向にあります。

解決策

次の手順を実行して、使用可能な TCP/IP ポートが存在しない状況とそれに関連する問題を回避します。

  1. 1 つ以上のクライアント アプリケーションが過度に TCP/IP ソケット接続を作成していないことを確認します。これは、上で説明したように Windows Server 2003 ベースまたは Windows XP ベースのコンピューターで netstat -n を実行するか、Windows Server 2003 および 2008 ベースのコンピューターで netstat -b を実行すると確認できます。

    特定のクライアント アプリケーションが、TCIP/IP ソケット接続数が著しく多くなった要因に関与している場合、そのクライアント アプリケーションを設計し直して、より適切に TCP/IP ソケット接続を使用するようにします。

    Aa560610.note(ja-JP,BTS.10).gif
    BizTalk アプリケーション サービスのインスタンス (BTSNTSvc.exe) に割り当てられているクライアント ポート予約数が著しく多い場合、BizTalk アプリケーション サービスで実行するように構成されているカスタム コードによって過度に TCP/IP ソケット接続が行われていないことを確認します。

  2. 多数のクライアント アプリケーションが、予定されている数の TCP/IP ソケット接続を開始したときに、それらの接続要求を満たせる十分な数の一時的なポートがない場合は、次のうち、必要なレジストリ変更を行います。

    Aa560610.Caution(ja-JP,BTS.10).gif警告
    レジストリ エディターの操作を誤ると重大な問題が発生し、オペレーティング システムの再インストールが必要になる場合があります。レジストリ エディターの不適切な使用によって生じた問題については、解決を保証できません。問題が発生する可能性のあることを十分に認識したうえで使用してください。レジストリを変更する前には必ずバックアップを行い、問題が発生した場合にバックアップを復元する方法を確認しておきます。レジストリのバックアップ、復元、および変更の方法の詳細については、サポート技術情報の資料「Microsoft Windows レジストリの説明」(http://go.microsoft.com/fwlink/?LinkId=62729) を参照してください。

    クライアントの TCP/IP ソケット接続に動的に割り当てられる一時的なポートの上限を引き上げる。

    1. レジストリ エディターを起動します。

    2. 次のレジストリ キーを参照してクリックします。

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

    3. [編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。次のレジストリ値を追加して、クライアントに動的に割り当てることができる一時的なポート数を増やします。

      値の名前

      MaxUserPort

      値のデータ

      <ここに、5000 ~ 65534 の 10 進数値を入力します>

    4. レジストリ エディターを閉じます。

      Aa560610.note(ja-JP,BTS.10).gif
      変更内容を有効にするには、コンピューターを再起動する必要があります。

      Aa560610.note(ja-JP,BTS.10).gif
      クライアントの TCP/IP 接続に使用する一時的なポートの範囲を広げると、Windows カーネル メモリが消費されます。この設定の上限は、Windows カーネル メモリの不要な消費を最小限にとどめるために、クライアント アプリケーションのソケット接続に必要な値以下にする必要があります。

    クライアントの TCP/IP ソケット接続のタイムアウト値を既定値の 240 秒よりも短くする。

    1. レジストリ エディターを起動します。

    2. 次のレジストリ キーを参照してクリックします。

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

    3. [編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。次のレジストリ値を追加して、接続を閉じる際にその接続が TIME_WAIT 状態を維持する時間を減らします。接続が TIME_WAIT 状態の間は、ソケット ペアを再利用できません。

      値の名前

      TcpTimedWaitDelay

      値のデータ

      <ここに、30 ~ 240 の 10 進数値を入力します>

    4. レジストリ エディターを閉じます。

      Aa560610.note(ja-JP,BTS.10).gif
      変更内容を有効にするには、コンピューターを再起動する必要があります。

      Aa560610.note(ja-JP,BTS.10).gif
      この値の有効な範囲は 30 ~ 300 です (10 進数)。既定値は 240 です。

  3. Windows Server 2003 SP1 以降に実装されているサービスの拒否攻撃セキュリティ機能を無効にする場合は、「DBNETLIB 例外の回避」の推奨事項に従います。

    Aa560610.Important(ja-JP,BTS.10).gif重要
    これは、BizTalk Server コンピューターがインターネットに直接公開されていないイントラネット環境でのみ行う必要があります。

  4. メッセージ ボックス データベースが I/O バインドになる原因の状況を緩和する場合は、「DBNETLIB 例外の回避」の推奨事項に従います。

タグ :


Page view tracker