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


2016年7月20日

年始に膝の手術をしてやっと復活しました。はちです。
今回は「10万PV/日を、さくらVPSサーバーとApache2で耐えた」話:前編です。※最近あった実話
主にサーバーのスペックとか、ApacheのMPMの話を今回はする予定です。

4月19日は恐ろしい日だった

うちの会社のサイトが、LINEニュースやら、色んなメディアに取り上げられて(良い意味で)
Webサイトへのアクセスが物凄いことになってました。
後で統計を見たところ、全体で10万PVくらいを1日で稼いでいたようです。

た、たいへんだ、Apacheが息をしていない…(゚A゚;)

以前にもメディアに取り上げられて、サーバーが重くなる(落ちる)ことがありました。
その時に設定をそれなりに見なおして、落ちないようにしてはいたのですが
その時よりサーバーに乗っているサイトも増え、色々と当時とは環境が変わりました。

その時良かったApacheの設定が、今回のユーザ大量流入では耐えられなかったのです。
(ちなみに以前はトータルで4万PV/日くらいを耐えれるようにしたと思います)

こりゃいかんということで、サーバーのスペックと、空きリソースなんかを基に
再度Apacheの設定に使えそうな数字を計算しなおすことにしました。

サーバーのスペック

サーバー さくらVPSサーバー/4GBプラン/SSD100GB
構成 10ドメイン分のサイトを1箇所に集めているサーバー
半数がCMS系のサイト、残りはペラだったり、PHPが入り組んでいたり。
OS Ubuntu Server 12.04 LTS
その他 Apache 2.2、MySQL 5.6、PHP 5.2.x

ApacheのMPMについて

Apacheには、MPM(Multi Processing Module)という仕組みがありまして、主にリクエストを処理する部分のことを指します。
代表的なMPMは、Prefork、Worker、event(Ver2.4から実装)といったものがあります。

MPMの種類について

Prefork MPM

・1つのリクエストに対して、1プロセスを割り当てる
・負荷に応じて、子プロセスを増減させる
・スレッドMPMと比べメモリ消費量が多く、パフォーマンスが低い

Worker MPM

・スレッド対応型、リクエスト処理は、スレッドが対応する
・負荷に応じて、子プロセス数を増減させる
・1子プロセスあたりのスレッド数は固定になっている
・メモリ消費量が少なく、パフォーマンスが高い
・スレッドが不安定になると連鎖で不安定になる(メモリを共有しているため)

プログラムを並列に実行した時…
・子プロセスを複数立ち上げて並列に動かす=Prefork
・スレッドを複数立ち上げて並列に動かす=Worker
前者よりも後者のほうがメモリ消費量が少なくなるのと、スレッド単位での処理なので、クライアントへのリアクションが良いのです。
(例えばPreforkなどでは固まったり見えているところが、Workerだと一応動いているように見える)

上記のように、それぞれのMPMに強み/弱みがありまして、PHPを扱うならPreforkの方が早いという説なども昔から根強いです。

しかし、
ThinkITの参考記事(https://thinkit.co.jp/article/119/2?page=0%2C2)内の

>Apacheのpreforkとworkerを比較しても、workerがpreforkに比べ、接続時間や処理時間が短いことが確認できました。
>マルチプロセスで処理するpreforkに比べ、マルチスレッドで処理するworkerの方が身軽という結果となっています。

この検証結果を見た上で、弊社のサーバーではWorker MPMを採用することにした経緯があります。

後編に続く