10万PV/日を、さくらVPSとApache2で耐えた話(後編)


2016年7月26日

はちです。
前回の記事から随分と間が空いてしまいました…。
今回は「10万PV/日を、さくらVPSとApache2で耐えた話」の後編です。
■前編はこちら■ → https://www.alt-plus.jp/archives/1053

弊社のサーバーの現状

弊社のサーバーは、マルチドメインの構成で運営されており
1つのサーバーに10数個のWebサイトがある状態でした。

サイトの半分以上が、WordPressを用いたサイト構築をしておりまして、
サーバーを契約した当初に比べると、リソースを食いまくっている状態です。

流入が激しかった1日の流れ

20160420

参考文献

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
鶴長 鎮一
技術評論社
売り上げランキング: 90,143
今回対策するにあたって、この本を非常に参考にさせていただきました。
Apacheの負荷分散に関する記載なども少しあり、時間が空いた時に読んで理解を深めることが出来ます:)

Apacheに適用した設定

このような場合、もうさっくりとサーバーのスペックそのものを上げてしまったり、
Apacheのバージョンを上げてeventMPMで動かしたり、
そもそもApacheを捨ててnginx(エンジンエックス)などをぶち込んだほうがよっぽど早いんですが
とりあえずまずはApacheで頑張ることになったので、下記の設定を適用してみました。

/etc/apache2.conf StartServers: 起動時に生成される子サーバプロセスの数
MaxClients: リクエストに応答するために作成されるスレッドの最大個数
MinSpareThreads: アイドルスレッド数の最小個数
MaxSpareThreads: アイドルスレッド数の最大個数
ThreadsPerChild: 子プロセスそれぞれに生成されるスレッド数の上限
MaxRequestsPerChild: 個々の子サーバが稼働中に扱うリクエスト数の上限

サーバーのスペックの都合上、StartServersを2に設定し、上限を4にしています。
4GBプランでこの設定なので、1GBプランなどでは更に小さな設定をする必要がありそうです。
また、MaxClientsなどの値は、大量のリクエストを捌くのであればもっと大きな数字にするのがベストですが
こちらもサーバーに載せているWebサイトの数や平均メモリ消費量などと相談でこの値としています。

MaxRequestsPerChildはどの値に設定するか、非常に悩ましいところですが
100から様子を見て上下させていけば良いと思います。
どれくらいの頻度で、プロセスが生まれて、どれくらいの頻度でプロセスが死ぬか
これは実際にユーザの流入が多い時に目視して見ながら考えていくのが良いと思います。

また、MaxMemFreeについてですが、これは説明を見てもかなり難解な日本語での説明しかありません。
どういうことやねん?となりましたが、要するに
OSからメモリを、メインアロケータを通じて、Apacheに割当られるのですが
Apacheがこれを使い終わると、メインアロケータへメモリを返すような流れになっているようです。
この時、メインアロケータに帰ったメモリは、OSが要求しないかぎりはOSには帰りません。
なので、メインアロケータに帰ったメモリを解放してやることで、OSへメモリを返すことが出来ます。
この解放が呼ばれないかぎり、OSへはメモリを返せないので、MaxMemFreeに値をセットします。
MaxMemFreeに値をセットすると、メインアロケータの上限値を超えたメモリは、OSに帰ります。
OSに帰ることで、サーバーのロードアベレージが比較的下がり、余裕が出始めます。
この説明でなんとなくわかっていただけますでしょうか。

Apacheの設定は、あくまで欲張らずに組むのがベストです。
欲張って設定を組んで、メモリ不足などで落ちたら目も当てられないですから。。。