mod_bumpy_lifeを導入する

各apacheプロセスのMaxRequestsPerChildをランダム化するmod_bumpy_lifeモジュールを導入してみました。

mod_bumpy_lifeとは

メモリリークを開放する目的で利用されるApache(prefork)のMaxRequestsPerChild(設定したリクエスト数の処理後に子プロセスを終了する設定)は、規定値に達したプロセスが結果的に一斉終了→起動を行うため、Webサーバの反応が一瞬停止するデメリットがあります。

この問題を解決するのがhirose31氏がGitHubで公開している、MaxRequestsPerChildをランダム化するmod_bumpy_lifeモジュールです。

mod_bumpy_life導入準備

mod_bumpy_lifeの導入はダウンロードにgitコマンド、モジュールのコンパイルとインストールにapxsコマンド、apxsコマンドの実行にgccを利用します。apxsはhttpd-develパッケージに含まれているので必要に応じてインストールしてしましょう。

# yum install -y git httpd-devel gcc
mod_bumpy_life導入開始

ではさっそくmod_bumpy_lifeを導入してみます。
INSTALLATIONには書いてありませんが、ダウンロード後にap-mod_bumpy_lifeディレクトリに移動してからapxsコマンドを実行する必要があります。

# cd /usr/local/src/
# git clone git://github.com/hirose31/ap-mod_bumpy_life.git
Initialized empty Git repository in /usr/local/src/ap-mod_bumpy_life/.git/
remote: Counting objects: 15, done.
remote: Total 15 (delta 0), reused 0 (delta 0), pack-reused 15
Receiving objects: 100% (15/15), done.
Resolving deltas: 100% (4/4), done.

# cd ap-mod_bumpy_life/
# apxs -c -i mod_bumpy_life.c
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1   -c -o mod_bumpy_life.lo mod_bumpy_life.c && touch mod_bumpy_life.slo
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -o mod_bumpy_life.la  -rpath /usr/lib64/httpd/modules -module -avoid-version    mod_bumpy_life.lo
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' mod_bumpy_life.la /usr/lib64/httpd/modules
/usr/lib64/apr-1/build/libtool --mode=install cp mod_bumpy_life.la /usr/lib64/httpd/modules/
libtool: install: cp .libs/mod_bumpy_life.so /usr/lib64/httpd/modules/mod_bumpy_life.so
libtool: install: cp .libs/mod_bumpy_life.lai /usr/lib64/httpd/modules/mod_bumpy_life.la
libtool: install: cp .libs/mod_bumpy_life.a /usr/lib64/httpd/modules/mod_bumpy_life.a
libtool: install: chmod 644 /usr/lib64/httpd/modules/mod_bumpy_life.a
libtool: install: ranlib /usr/lib64/httpd/modules/mod_bumpy_life.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/sbin" ldconfig -n /usr/lib64/httpd/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/lib64/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_bumpy_life.so
#
mod_bumpy_lifeの設定

Exampleを見ると、MaxRequestsPerChildMinとMaxRequestsPerChildMaxでランダム幅を設定するようです。<IfModule bumpy_life_module>の中に書かなくても効果があるので、<IfModule prefork.c>の中のMaxRequestsPerChildの後に記述しても問題ありません。

/etc/httpd/conf/httpd.conf
# The following modules are not loaded by default:
#
+ LoadModule bumpy_life_module modules/mod_bumpy_life.so

<ifmodule prefork.c>
  StartServers      10
  MinSpareServers   10
  MaxSpareServers   10
  ServerLimit       10
  MaxClients        10
  MaxRequestsPerChild  400
+ MaxRequestsPerChildMin 350
+ MaxRequestsPerChildMax 400
  MaxMemFree 1024
</ifmodule>
mod_bumpy_lifeの動作確認

apacheの再起動後からmod_bumpy_lifeが有効になります。本当に有効になっているのか確認するにはphpinfoを見るのが確実そうです。

mod_bumpy_lifeモジュールの読み込みはapache2handlerのLoaded Modulesを確認します。
ランダム化はMax Requestsの値を見てMaxRequestsPerChildより低い値であること、phpinfoの再読み込み(F5)でPer Childが変化することで確認できます。
phpinfo_mod_bumpy_life

mod_bumpy_lifeの効果確認は・・・?

肝心の効果は?というと、muninでレスポンスタイムを確認した限りではプロセス再起動時のサイト読み込み遅延は無くなりました。apacheメモリ消費量の落ち込み量も減っています。ただしアクセス数が少ない現状では大きなメリットは無いようです。

スポンサーリンク
レクタングル (大)
レクタングル (大)