web-dev-qa-db-ja.com

Windows Server 2012 R2は一時的なポートを使い果たしますが、必要ありません

専用サーバーのネットワークで奇妙な問題が定期的に発生しています。 Xeon E5620でWindows Server 2012 R2 x64を実行し、16 GB RAMおよびIntel 82575EBネットワークアダプターを搭載しています。

すでに調整済みであることに注意してくださいHKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersキー値TcpTimedWaitDelayおよびMaxUserPortをそれぞれ30および65530に。

ランダムな時点で、ローカルデータベースに接続できないという理由で、Webサイトが応答を停止します。この問題が発生し始めるのは、約2週間の稼働時間です。システムログは、TCPIP警告4227および4231を取得し始めます。「グローバルTCPポートスペースからのエフェメラルポート番号を割り当てる要求は、そのようなすべてのポートが使用中のため失敗しました。」と述べています。

走れば

Get-Counter -Counter \TCPv4\*

または

Get-Counter -Counter \TCPv6\*

または

netstat -abn | find /c ":"

私は常に500〜1500接続の妥当な値を取得しています。これは65Kの制限にさえ近づいていません。

さらに、「localhost」はローカルで:: 1への解決を停止し、127.0.0.1に戻ります
強制的なマシンの再起動のみが状況を解決できます。

ネットワークアダプターの問題でしょうか?

更新1

メールサーバーを再起動すると、再度発生し、解決したようです。奇妙なことに、すべてのカウンターは、現在〜500がアクティブである〜1000接続を示し、メールサーバーとは何の関係もないデータベースに接続しようとすると、10055ソケットエラーを示します。

PDATE 2これはIS奇妙ですが、メールサービスを毎日再起動すると問題が完全に修正されます。

13
CamaroSS

WinSvr 2012R2 x64でTCP/IPポートのプールが使い果たされて同様の問題がほぼ1か月あり、サーバーが新しい接続およびTCP=接続の受信を停止しました。私にとって安定:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005
  • TcpTimedWaitDelay-30
  • MaxUserPort-65534
  • TcpNumConnections-最大に引き伸ばされたデフォルトの状態である必要があります= 16777214は、サーバーが一時的なポートを使い果たすことを防ぎます。
  • TcpMaxDataRetransmissions-タイムアウト制限TCP実際の接続での未確認のデータセグメントの再送信= 5。

結果はあなたと同じです。アプリケーション/スクリプトのパフォーマンスの動作を監査することを検討する必要があると思います。すべてが問題なく、何も解決しない場合は、Webアプリケーションサーバーの前にプロキシサーバーを配置して、同じ静的コンテンツを共有し、同じデータベースに同時にアクセスするWebサーバー(IIS、Apacheなど)で2つのノードを作成することができます。時間(会社に十分なリソースがある場合)。

多分この記事は何らかの形であなたを助けるでしょう: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does- when-it-s-important.aspx

9
MyKE

Tcpipドライバーの設定に加えて、エフェメラルTCPポート範囲はnetshコマンドを使用してWindows Serverで管理されます( ソース )。

次のコマンドを使用して、動的ポート範囲を表示できます。

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp
  • netsh int ipv6 show dynamicport tcp
  • netsh int ipv6 show dynamicport udp

ポート範囲を変更するには、次のコマンドを使用します。

  • netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

例えば:

netsh int ipv4 set dynamicport tcp start=49152 num=16384

設定(start =49152num =16384)もdefaultWindows Server 2008以降。

4
rustyx

Windows Server 2016でこれと同じ問題があり、chromewebdriverを使用して大量のSeleniumテストを実行していました。このPSスクリプトは、上記で共有された@Mykeの設定を自動的に構成します。 TCPスタックの変更には再起動が必要であるため、shutdownコマンドが追加されました。

エフェメラルのプールサイズを増やすTCPポート

_Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name MaxUserPort -Value 65534 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpTimedWaitDelay -Value 30 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpNumConnections -Value 16777214 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpMaxDataRetransmissions -Value 5 -Force | Out-Null

shutdown -r -t 0
_

これは、Webdriver.Quit()で受け取ったエラーメッセージであり、TCPアドレスが使用中であったことを通知しています。

エラー:ClientRequestでEADDRINUSE接続EADDRINUSE 127.0.0.1:12843。 (\ node_modules\Selenium-webdriver\http\index.js:238:15)
From:タスク:WebDriver.quit()

3

データベース接続オブジェクトをリークしていないことを確認しましたか?明示的に(try-finallyを使用して)、またはusing {}ブロックを使用して、開かれているすべてのデータベース接続を閉じる必要があります。これは、ASPが直接通知しない一般的な問題です。

1
James