B3S
menu close

サーバー関連

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を採用することにした経緯があります。

後編に続く