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