2006-02-01
■[perl] Apache + mod_perl - MaxClients の値に注意
やっちまった……。きっとだれもが通る道。というかとっくに FAQ か。
恥ずかしながら、知らなかったッス。これって mod_ruby でもありうる話だよね?
Apache で mod_perl を使用する時は MaxClients 設定に注意!
- Apache の MaxClients(子プロセスの最大数) デフォルト設定は 150。
- 他のモジュールにも影響されるが、mod_perl 組み込み時、子プロセス1つのメモリサイズが 20〜30MB 程度になる。
- よって、同時接続数 150 までアクセスされると 3G から 4.5G メモリを喰うことになる。
そんなメモリねぇ〜www なので、スワップ・スワップ(SWAP x SWAP と書いてみたがヤな感じだった)。swap もオーバーしちゃったり。
対策:
- MaxClients は「総メモリサイズ / Apache 子プロセス1つのメモリサイズ」(ドンブリ勘定)にする。
- できれば KeepAlive は Off
- Apache モジュールを減らして、子プロセスのメモリサイズを減らす
$ ab -c 100 -n 1000 -k http://example.com/hoge
テスト機で試した。MaxClients 調整前はめっさ重くなる(SSHまで!)。MaxClients 調整後はなんとか耐えられる。
総メモリサイズ は /proc/meminfo からわかるとして、1子プロセスのメモリサイズは ps の出力の VSZ で良いのかな?
$ ps auxww | grep ^www USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND www 2783 2.2 2.7 33080 24456 ? S 11:26 0:02 /usr/local/apache/bin/httpd ...
モジュール入れすぎ!もあるけど、VSZ と RSS じゃ大分変わるんだよなぁ。
わかったような、わからんような説明だな(←わかってない)。
あと、スライドにある Apache の Shared_RAM_per_Child (子プロセスの共有メモリ量)ってどうやってわかるんだろ? むー。
追記:
Shared RAM per Child は RSS - SHARE. 正確に知りたければ GTop を使うと良いです。
とのこと。リモート親切だぁね。
kounoike さんのトラックバックによると、linux カーネル 2.6.11.7 以降は /proc/プロセスID/smaps でわかるらしい。
御二方サンクス!
コメントしてくれた id:lyokato さんもサンクス!
追記2:
WebプログラマのためのCopy On Write解説:mod_perl/FastCGIでメモリを節約する方法 | Typemiss.net
linux では fork(2) の Copy on Write 機能のおかげで、高速 fork&効率的なメモリ共有ができているんだって。"Copy on Write" は「(差異が生じる時の)書き込み時に初めてコピーされる」機能ってとこか。
- 200 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=MaxClients
- 192 http://d.hatena.ne.jp/hogem/20080506/1210073173
- 177 http://www.typemiss.net/blog/kounoike/20060202-61
- 158 http://www.google.co.jp/search?q=MaxClients&lr=lang_ja&ie=utf-8&oe=utf-8&rls=org.mozilla:ja:official&client=firefox
- 133 http://ime.nu/d.hatena.ne.jp/babie/20060201/p3
- 123 http://www.typemiss.net/blog/kounoike/20060212-64
- 110 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=遅レス&num=50
- 75 http://old.typemiss.net/blog/kounoike/20060202-61
- 71 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=mod_perl+組み込み&btnG=Google+検索&lr=lang_ja
- 61 http://www.google.co.jp/search?hl=ja&q=MaxClients&lr=

