前回の続きです。
http://httpd.apache.org/docs/2.0/ja/mod/prefork.html
スレッドを使わず、先行して fork を行なう ウェブサーバを実装しています。 スレッドセーフでないライブラリとの互換性をとるために、 スレッドを避ける必要のあるサイトでは、このモジュールの使用が適切でしょう。
本家のウェブにこんなことが書いてありますが、僕は基本的にスレッドセーフでないPHPを使用しているため、preforkの使用をしています。PHPを使用しない場合はworkerを使用した方がたぶんいいと思いますが、使用したことがないのでここでは説明をさけます。。
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxClients 256
MaxRequestPerChild 10000
StartServersはサーバが起動したときに生成される子プロセスの数です。
負荷があがると自動的に数は増えていくので特に設定する必要はないと思われます。
MinSpareServers/MaxSpareServersはアイドル状態の子プロセス数を制御するパラメータです。
MinSpareServersよりもアイドル状態の子プロセスが少なくなると親プロセスが新しい子プロセスを生成します。新しく生成されるのは1秒に一度のため、高負荷のウェブサーバの場合応答が間に合わなくなる可能性があります。
このパラメータはチューニングしがいのある部分で、高負荷サーバでは応答速度に変化が見られる場合がありますが、そこまで高負荷でない場合は触る必要のない項目であります。
ServerLimit/MaxClientsは、リクエストに応答するための子プロセスの最大数です。
preforkの場合は、この値が同時アクセス数の値になるので、チューニングができる項目になります。
デフォルト値は256となっていますが、メモリ容量とのからみもあるので安易に増やすとPHPが実行できないなどの状況に陥ってしまいます。
例えば、2Gのメモリを搭載しているサーバで、PHPのmemory_limitに32Mを当てている場合、OSに使用するメモリを考えて1.5Gをウェブサーバで使用させるとすると・・・
2G / 32M = 46プロセス
になります。256プロセスデフォルトのままで運用してしまうと、同時アクセスがマックスになるとPHPがメモリエラーをはいてしまう可能性もある感じになります。
(PHPがマックスまでメモリを使用していればの話ですが)
ServerLimit/MaxClientsの値と、memory_limitは連動してくるお話になるので、両方を注意しながら地道にチューニングしていくと、同時アクセス数も調整できて、サーバがどのくらいさばけるのかが把握できるのでとても幸せ気分になれます。
最後にMaxRequestPerChildですが、これは子プロセスが再起動する頻度を設定する項目です。
プロセス再起動には時間がかかるので、再起動の間に大量アクセスがきていたら大変です。
が、メモリリークがおこってしまった場合などの対処用に設定をしておいたほうがよい項目です。
デフォルトでは10000が設定されていますが、10000回プロセスにアクセスがされたらプロセスの再起動を行う設定になっています。
あまり設定する必要のない項目ではありますが、error_logでエラーが頻発しているようだったらこの値を変更してみて挙動をウォッチする手もあると思います。
ざっくりと書いてきましたが、ほとんど本家ウェブサイトに書いてあることの転載なので、詳しくはそちらを参照した方がいいかもしれません。
チューニングは実行するウェブアプリケーションによっても違ってきますし、搭載しているメモリ容量などにも関連してくるので、教科書通りにいかないというのが経験上いえることです。
ちょっとずつ値を変更して最適なパラメータを見つけるのも楽しみの一つであるので、地道にやるのが一番いいのかなーと。
次回は・・・なにをやりましょう。。。