障害例
- 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¥Parameters
の MaxUserPort
を確認
- 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側の制限値を引き上げる.
参考