ニクニクドットミー

カッコいいおっさんを目指すエンジニアの厳かなブログ

apacheのMaxRequestsPerChildを検証してみた

Apache logapacheの設定をちゃんとわかっていないので、configをいじってみたいと思います。

今回はMaxRequestsPerChildです。

この設定は個々の子サーバが稼働中に扱うリクエスト数の上限を決めるもので、子プロセスが捌くリクエスト数を指します。

MaxRequestsPerChild ディレクティブは、 個々の子サーバプロセスが扱うことのできるリクエストの制限数を 設定します。MaxRequestsPerChild 個のリクエストの後に、子プロセスは終了します。 MaxRequestsPerChild が 0 に設定されている場合は、プロセスは期限切れにより終了することはありません。

今回検証する環境はこんな感じです。 ・Apache/2.2.15 (Unix) ・CentOS release 6.5 (Final)

configはこんな感じ。


<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit        1
MaxClients         1
MaxRequestsPerChild  5
</IfModule>

MPMはpreforkとなっています。

MaxRequestsPerChildは子プロセスが設定されている数だけリクエストを捌いたら終了するので、このconfigでは5回リクエストを捌くと終了するはずです。

一度この状態で

ps aux | grep -v grep | httpd
するとこの様になりました。


[vagrant@localhost ~]$ ps aux | grep -v grep | grep httpd
root      1328  0.0  0.8 183648  4072 ?        Ss   14:47   0:00 /usr/sbin/httpd
apache    6147  0.0  1.1 185308  5292 ?        S    15:15   0:00 /usr/sbin/httpd

この状態で、

curl http://localhost/
を叩いて5回リクエストを送ってみます。 その後プロセスを確認すると、


[vagrant@localhost ~]$ ps aux | grep -v grep | grep httpd
root      1328  0.0  0.8 183648  4072 ?        Ss   14:47   0:00 /usr/sbin/httpd
apache    6169  0.0  1.1 185308  5292 ?        S    15:17   0:00 /usr/sbin/httpd

最初確認した時とプロセスIDが変わっているのがわかりました。子プロセスがMaxRequestsPerChildの数(今回は5)だけ捌いたので、終了して別の子プロセスが立ち上がったことがわかりました。 MaxRequestsPerChildを設定するメリットは以下の通りです。

MaxRequestsPerChild を非ゼロに制限することには、二つの利点があります: (偶発的な) メモリーリークが起こった場合に プロセスが消費するメモリの総量を制限できる プロセスに有限のライフタイムを設定することで、 サーバ負荷が下がった時にプロセス数を少なくすることができる

こう思った

子プロセスがリクエストを捌いて仕事したら、帰っていいよという事です。子プロセスが長く生き続けると太り始めてメモリリークの原因になってしまいます。 MaxRequestsPerChildの数が多いと子プロセスが長く生きてしまうので、設定する数は気をつけた方がいいと思います。短すぎると子プロセスが立ち上がるまで時間が掛かる?と思うので、その間はリクエストが受け付けられなくなってしまうのではないかと思います。

ちょこちょこapacheのconfigの検証をしていきたいと思います。