さくらVPSで一日6万PVを処理するためにしたことさくらVPSで一日6万PVを処理するためにしたことサーバさくらVPSで6万PV程度のサイトを運用することになったので、その際の記録を残しておきます。さくらレンタルサーバ⇒さくらVPSさくらレンタルサーバで運用している時は、ちょくちょく503が発生しておりこれを解決するためにさくらVPSへの移行を行いました。レンタルサーバの時は、ログ解析や監視ツールなどを導入していなかったので503の頻度やパターンは不明です。(安易な判断でVPSに移行したので、この点は反省です)本来は原因を追及し、プログラムの改修やサーバ負荷の分散などをすべきですが時間の都合で省いてしまいました。運用するサイトはpukiwikiで構成されたサイトです。pukiwikiは、PHPで書かれており大量のデータをRDBを利用せずに構築できる点が大きなメリットです。今回は1サイトですが、複数のサイトを運用する可能性を考慮してVirtualHostも利用します。さくらVPSの性能OS:CentOSCPU:XeonQuadを共有利用(2コア)メモリ:512MApacheのインストールCentOSにはyumがあるのですが、不要なモジュールやパッケージをインストールを避け最新版のApcheを利用したかたったのでソースからインストールしました。Apacheの最新版configurepukiwikiに関わらず基本的なサイトであれば以下のオプションで動作するはずです。\httpd.conf次の設定ファイルのみ有効にします。conf/extra/httpd-default.confhttpd-mpm.confmpm_prefork_moduleのみに注目してください。mpm_worker_moduleはマルチスレッド対応のmpmですが不安定な一面があるのでpreforkに移行しました。2048MaxRequestsPerChildとMaxMemFreeについては後ほど説明したいと思います。Apacheは起動するとデフォルトで5個ぐらいのプロセスを起動するのですが6万PVを処理するには平均で70プロセス程度、ピーク時で100プロセス程度起動します。1プロセス1リクエストを処理した後にプロセスが終了するので、5⇔70プロセスの起動と終了を何度も繰り返すので非常にオーバーヘッドが大きくなってしまいます。Apacheプロセス起動と終了に生じるオーバーヘッドを下げるためにmpmで予めプロセスを起動しておきます。それがStartServers、MinSpareServers、MaxSpareServersの設定になります。2048</IfModule>httpd-default.confKeepAliveは諸刃の刃なので、ONにするときはよく検証しましょう。できるかぎりサーバの情報は伏せておきたいので情報表示はOffにします。OffPHPのインストールPHPもソースからインストールします。バージョン:5.2.14PHPダウンロードPHPも同様に必要最低限の機能のみインストールします。/usr/local/lib/php.inizlibがないとエラーがでますが、zlibなどはyumからインストールしていただいて結構です。上記の設定後、3日にロードアベレージが60程度まで上昇しサーバが停止しました。サーバ停止の原因を探るため、topを見たところ一部のApacheプロセスがメモリを30%程度占有していることが判明しました。同時にSWAPもどんどん増え、メモリ不足に陥りサーバが停止している事がわかりました。恐ろしいことになっていたのでApacheが平均的に使用しているメモリ+αのサイズを設定しました。16MAPCを入れてみるPHPの中間キャッシュを行うAPCを導入しました。その結果、極端にメモリを消費するPHPファイルを除き高速に処理されるようになりました。約、2倍ぐらい処理速度が向上しました。導入後、キャッシュ利用サイズが7M程度なのでAPCに8Mのメモリを割り当てる設定にしました。追記extension=apc.so追記後、Apacheを再起動してください。size”のエラーが一部のPHPファイルで発生しているのが確認できました。問題のファイル名を調べてみると、Wiki内にテーブルや内部リンクが多くある場合メモリリークが発生しやすいようです。この副作用で、どのプログラムが問題を起こしているのかを発見することができました。このプログラムに関しては、Pukiwikiに情報がありメモリリークを軽減させるパッチがあったので適用させることで、比較的テーブルや内部リンクが多いページでもメモリリークが発生することはなくなりました。Apacheのメモリを制限するPHP側のメモリリークはなくなったものの、Wikiのテーブルや内部リンクの多いページにアクセスされ続けるとApacheがどんどんメモリを利用して解放しない現象が発生しました。Apacheこのような動作をしているようでOSがメモリを要求しない限りlib(メインメモリーアロケータ)がメモリを解放しないので、OSがメモリを要求してこない限りApacheが使用するメモリはどんどん増えていきます。物理メモリに余裕があれば殆どの場合問題にはなりにくい問題なのですが512MしかないのでOSのメモリ要求とApacheのメモリ要求で使い果たしてしまうようです。ApacheにはMaxMemFreeという機能があります。主アロケータが保持できる空のメモリの最大値をキロバイト単位で設定します。設定されていないか、零に設定されているときは、無制限になります。なんとも難解な日本語で書かれているのですが、つまりlib(メインアロケータ)が保持できるメモリを制限し設定値以上のメモリはlib(メインアロケータ)はOSに返すのでApacheがメモリを食い続けるという現象がなくなりロードアベレージがかなり下がりました。メモリ使用量は多いがCPU使用量は低いプロセスが多くあったので、定期的にプロセスのメモリを解放することにしました。5000MaxRequestsPerChildは、プロセスが最大処理できるリクエスト数を設定するための物です。設定値以上のリクエストを処理するとプロセスを再起動させるので、効率よく負荷の高いプロセスにメモリを割り振ることが可能です。503発生回数:0回このような感じで現在も安定して動作しています。WikiはRDBを利用しないためメモリ使用量が抑えられましたが、MySQLを利用する場合は13%〜17%程度メモリ使用量が増加するのでmpmの設定でプロセス数を減らしメモリをどこかで浮かせる必要があります。SWAPSWAPが少し発生していたので、vmstatを見ていたところSWAPインが1日数十回発生するだけでSWAPアウトが発生していないのでメモリに置いていても利用頻度の低いデータはSWAPに移動されるのでそれが原因だと思われます。Analyzerを導入しました。Zabbixサーバは別のサーバに導入し、クライアントのみをインストールしています。コメントを書く投稿したコメントは管理者が承認するまで公開されません。スパム対策のためのダミーです。id:TakamiChie:20060921:1158851671。