環境
- CentOS 6.8
- httpd-2.2.15-54.el6.centos.x86_64
Apache2.2 デフォルト
- MPM prefork
- MaxClients 256
メモリ1GBリバースプロキシの場合
$ ps aux | grep 'httpd' | egrep -v 'grep|root' | awk 'BEGIN{sum=0;} {sum+=$6} END{print sum/NR;}'
4480.3
このサーバーでMaxClients分の256コネクション使い切った場合、4.3MB x 256 = 1100.8MB
となり、メモリの割り当てが1GBの場合、スワップまたはOOMが発生してしまうと予想される。
また、ssh できるメモリも無く、制御不能になるだろう。
チューニング
MPMをworkerに変更するだけでとりあえずOK。他はデフォルトのまま。- MPM worker
- ServerLimit 16
- MaxClients 300
- ThreadsPerChild 25
MPMをworkerに変更したところ、1プロセスあたりのメモリが13MBになった。
MaxClientsが16で、ThreadsPerChildが25なので、最大プロセス数は12。
13MB x 12 = 156MB
メモリが1GBあれば全然問題なし。そればかり、preworkより最大コネクション数が44多い。
チューニング次第では、最大で1425コネクションくらいイケる。
メモリ2GB mod_wsgiの場合
$ ps aux | egrep 'USER|httpd' | egrep -v 'grep|root'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
apache 2560 0.0 0.3 188192 7628 ? S 06:36 0:01 /usr/sbin/httpd
apache 7832 0.0 0.3 188192 7624 ? S 07:10 0:01 /usr/sbin/httpd
apache 7833 0.0 0.3 188192 7624 ? S 07:10 0:01 /usr/sbin/httpd
apache 7834 0.0 0.3 188192 7624 ? S 07:10 0:01 /usr/sbin/httpd
apache 8145 0.0 0.3 188192 7624 ? S 07:13 0:01 /usr/sbin/httpd
apache 8438 0.0 0.3 188192 7628 ? S 07:14 0:01 /usr/sbin/httpd
apache 12965 0.0 0.3 188192 7624 ? S 07:45 0:01 /usr/sbin/httpd
apache 15250 2.9 3.8 1538260 74348 ? Sl May28 51:44 /usr/sbin/httpd
apache 15251 2.9 4.4 1543012 84260 ? Sl May28 51:45 /usr/sbin/httpd
apache 15412 0.0 0.3 188192 7628 ? S 08:00 0:00 /usr/sbin/httpd
apache 19639 0.0 0.3 188192 7624 ? S 08:28 0:00 /usr/sbin/httpd
apache 19797 0.0 0.3 188192 7552 ? S 08:29 0:00 /usr/sbin/httpd
これは、Apache + prefork + mod_wsgi + Djangoで、mod_wsgiをDaemon mode(processes 2, threads 20)で動かしている。RSSが大きい2つがmod_wsgi。
この場合でもやはり、MaxClients分の256コネクションで2GBをApacheが使い切ってしまう可能性がある。
チューニング
なので、以下のように設定。- MPM worker
- ServerLimit 16
- MaxClients 300
- ThreadPerChild 25
- mod_wsgi Daemon mode(processes 9, threads 25)
Apacheの設定は、MPMをworkerに変えただけで、他はデフォルトのまま。
staticのファイルは、Apacheがそのままレスポンスを返すので、mod_wsgiはDaemon modeのまま。access_logからmod_wsgiとstaticのアクセス比率が、3:1 だったので、MaxClients 300を1として、mod_wsgiが3になるようにしつつ、Apacheが2GBの8割以下になるように調整。
今後
Apacheの使っていないモジュールを外せば、最大コネクション数をもっと増やせそう。しかし、Nginxをリバースプロキシとして動かす場合、1GBメモリで最大で25,000コネクション捌けるらしい。
今のApacheがコネクションを捌ききれなくなったら、スケールする前に、Nginxへの切り替えを検討した方がコスト的にいいかもしれない。
0 件のコメント:
コメントを投稿