サーバー関連
10万PV/日を、さくらVPSとApache2で耐えた話(前編)
はち
更新日:2021/08/10
年始に膝の手術をしてやっと復活しました。はちです。
今回は「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を採用することにした経緯があります。