Windowsにおけるソケットの最大値とTIME_WAITの時間を修正しよう
大規模サイトでは1台のサーバにものすごい数のTCPコネクションが張られます。そのような状況ではOSのチューニングをしないとすぐにリソースが枯渇してしまいます。そこで今回はWindowsにおけるソケットの最大値とTIME_WAITの時間を修正する方法をご紹介します。
【前提知識】
サーバにTCPコネクションが張られるとソケットが1つ消費され、そのときポート番号が1つ消費されます。サーバにはポート番号が65534しかないのでソケット(ポート番号)は限られたリソースということになります。しかし実際OSはTCPコネクションのために65534個全てをリソースと活用するかというとそうではなくて通常制限がかかっています。Windowsの場合は5000がデフォルト値です。すなわちチューニングをしないとWindowsでは最大同時接続5000までということになります。これは大規模サイトには小さすぎます。
ただし同時接続5000と言ってもそれは全てのソケットがTCPコネクションされることができた場合の話しです。netstat -anを実行したときにESTABLISHEDやTIME_WAITなどの表示を見たことがあると思います。TCP状態遷移の説明はここでは省きますが、簡単に言うとESTABLISHEDがTCPコネクション中、TIME_WAITがタイムアウトを待っている状態です。すなわちTIME_WAIT状態のソケットがたくさんあるとそれだけ同時接続可能数が減ってしまうということになります。問題はTIME_WAITがどの程度の時間継続するかなのですが、Windowsの場合はなんと4分がデフォルト値です。これまた大規模サイトには長すぎます。
【Windowsにおける設定変更方法】
「ソケットの最大数」、「TIME_WAITの時間」はそれぞれ以下のレジストリを変更して設定します。項目がない場合は追加します。
■ソケットの最大数(5,000~65,534の間で設定):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort (DWORD)
■TIME_WAITの時間(30~300秒の間で設定):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay (DWORD)
※設定後は再起動しないと設定が反映されません。
【余談】
今回の設定はあくまでも大規模サイトで必要になるものであり普通のサイトではデフォルト設定のままで十分です。同時接続5000以上なんてテスト環境を作るのも結構大変そうですよね。
「サーバ・OS」カテゴリの記事
- puttyをタブモードで使う (2011.06.17)
- Linuxで突然キー入力が受け付けられなくなる問題の対策(2011.05.26)
- WindowsXP HomeをPro化してリモートデスクトップを有効にする方法(2009.12.08)
- 「生きてる」自宅サーバー運用(2009.07.30)
- 古いログを別のディレクトリに自動的に移動する方法(2010.11.01)

Comments
大規模でなくとも、ASP or JSP等で、1ページ表示するだけで、
最近、結構ではまりました。
※やはり、同じ設定をレジストリに書いて解決しましたが。
具体的には、社内系で、
ポータル的には普通だとおもいますが、
ポートレットを複数埋め込んでいるので、
・クライアントからWebサーバへのセション
・Webサーバが自分自身上のポートレットへのHTTPセション
・Webサーバが他Webサーバ上のポートレットへのHTTPセション
・ポートレットから、DBへのセション等で、
・Webアプリのメールを朝一チェックするひと多数
そんなかんじなのです。
フレックスじゃなくデスクワーク系の顧客で、
朝8:30-8:45にある意味、出勤時間ストーム的に走ってます。。。。4分に200人ぐらいがアクセスしたら、なるかもしれません。
寧ろ自社のフレックスandが外出(SE・営業)多い系の企業だと、ちがうかもしれませんが
Posted by: Z | April 26, 2006 at 04:32 PM