small is beautiful

be the worst

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

障害例

  • 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側の制限値を引き上げる.

参考