« サーバ管理者にプログラミングスキルは必要か? | Main | IntelMACでwindowsが動くなら・・・ »

April 24, 2006

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以上なんてテスト環境を作るのも結構大変そうですよね。

|

« サーバ管理者にプログラミングスキルは必要か? | Main | IntelMACでwindowsが動くなら・・・ »

サーバ・OS」カテゴリの記事

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

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/32004/9747379

Listed below are links to weblogs that reference Windowsにおけるソケットの最大値とTIME_WAITの時間を修正しよう:

» Javaのエラー databaseに接続できなくなる。 [KIC]
20ミリ~110ミリ秒間隔で連続でTCPコネクションが張られるシステムが現在稼動中 なのだが、長々とエラーがでる。下のようなやつ。(エラーの一部) java.net.SocketException MESSAGE: java.net.BindException: Address already in use: connect STACKTRACE: java.net.SocketException: java.net.BindException: Address already... [Read More]

Tracked on May 10, 2006 at 02:55 AM

» ASP.NET スレッドプール枯渇の再現(3) - ソケットが先に枯渇 [Developer @ ADJUST]
ASP.NET スレッドプール枯渇の再現(2) の続き。 前回までで、自家製テスト用クライアントや、IEの同時接続数を増やすことができ、同時間帯の多数の Web 要求を送信できる環境がだいぶん整った。 ということで調子にのってガンガン要求送信を試していたら、またまたエラーが。 いろいろ試行錯誤しているうちに、netstat コマンドで TCP ソケットの状況を確認したところ、相当数の "TIME_WAIT" のままの TCP 接続が残っていることがわかった。 TIME_WA... [Read More]

Tracked on August 16, 2008 at 12:42 PM

» re: ASP.NET開発サーバーの使用リミット? [DHJJ [Hatsune's Journal Japan] blog]
re: ASP.NET開発サーバーの使用リミット? [Read More]

Tracked on January 19, 2010 at 01:41 AM

« サーバ管理者にプログラミングスキルは必要か? | Main | IntelMACでwindowsが動くなら・・・ »