highlight.js

2017年7月14日金曜日

Apacheメモリチューニング

Apache2.2 をデフォルトのまま使用すると、メモリを使い切ってしまう可能性があるため、チューニングが必要になる。

環境

  • CentOS 6.8
  • httpd-2.2.15-54.el6.centos.x86_64

Apache2.2 デフォルト

  • MPM prefork
  • MaxClients 256

メモリ1GBリバースプロキシの場合


まず、現在の1プロセスあたりのメモリ使用量を調べる。
$ 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 件のコメント:

コメントを投稿