my syntax suger

i have an unbeknown dictionary. everything is up to me.

TCP connection過多によるsocket通信が出来ない場合の対処 (Windows)

障害例

  • frontend, (clientからのrequestを受けるweb server等が乗っているserver), backend(forntend serverから渡ってきたdataを処理して返すDB等) serverの両者間における通信でTCP connectionが過剰となり、clientがエラーを経験した。
  • clientの体験としては、frontのserverにアクセスした際に、全requestではなく特定のrequestでデータを読み取れない旨のエラーが表示される。
  • frontendからbackendに向けdataを取得する為に多数のconnectionが発生(frontendにTIME_WAIT sessionが大量に残る)し上限に達している。

原因

  • 以下が考えられる。
    • TCP DynamicPort Rangeの上限に達した。
    • applicationの同時接続設定値の上限に達した。

調査

  • netstat -an でTCPの状況を確認する。
  • DynamicPort Range設定値の確認は以下の方法で行う。
    • HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥TCP/IP¥ParametersMaxUserPort を確認
    • powershell(以下)
PS> netsh int ipv4 show dynamicport tcp

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 49152
Number of Ports : 16384
  • TIME_WAIT数を確認する。
    • socketを閉じる際にclientからのdataを全て受信出来たか確認するためにWAITする時間
(netstat -an | Select-String "TIME_WAIT"|Measure-Object).Count

対策

  • connectionを再利用するconnection poolingを活用する(IIS, Application等)。
  • registory値(MaxUserPort)を変更する。
    • HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥TCP/IP¥Parameters > MaxUserPort
  • timeoutの時間を短くする。
    • HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥TCP/IP¥Parameters > TcpTimedWaitDelay
    • TIME_WAIT の量が減少することを確認する。
  • application側の制限値を引き上げる。

参考