Webサーバーの運営者にとって怖いことは、アクセス数予測が出来ないこと。
例えば、この システム管理メモ サイト。変動はありますが一日に500ページくらいが、いろいろな理由でアクセスされています。本来は私の個人用途のメモを記録することが目的で、同じテーマで困っている人がいればお互い様ですから情報を利用してもらえるようにと公開しているのですが、ラジコの仕様変更などRadikaユーザー共通の出来事が起きると、ラジコ録音ソフト radika の一ユーザーである私のメモにアクセスが激増してしまいます。こんな感じ。
平常時 500 ページ/日 くらいが、2016/10/11PM のラジコ タイムフリーによる仕様変更後、Radika 再生・録音に不具合が発生し、アクセス数が1,000〜3,000 くらいの範囲に激変。
これくらいアクセス数が変動すると、私の足下にあるサーバーなのに、キーボードレスポンスがかなり悪くなります。
実は、この現象、今回が初めてではなく、ラジコの仕様変更の度に発生しています。1年に一度くらいの割合で、ラジコ や らじる が仕様変更してくれるもので、今回に関しては WP Super Cache という WordPress プラグインをインストールし、備えていました。(出来事を予期していなかった2014年の時は大変でした。)
今も随時調整を行っているものの、WP Super Cache のおかげで今回は乗り切れそうです。
今回は、その WP Super Cache の話。
ダイナミックページサイトの悩み
一般的にブログサイトは、アクセスがある度に、画面の枠組み情報とバックグランドで動いているデータベースからページを合成して、ダイナミックに画面表示データをユーザーに送り返しています。そのため、ユーザー毎に表示が異なるページを提供できる代わりに、リソースバカ食いで、アクセス許容範囲を越えるとWebサーバーが極端に遅くなります。
WP Super Cache の効果と欠点
WP Super Cache は、一度表示されたページデータをキャッシュに保存しておき、別のユーザーが同じページをアクセスした時に、合成済みデータをキャッシュから読み出して送るため、Webサーバーのレスポンス低下を防ぐことが出来ます。別の表現をするなら、動的ページを静的ページに置き換えてくれるため、Webサーバーが楽できるということです。
欠点は、サイトにアカウントを持っているユーザー毎に異なるページ情報を提供出来なくなることと(私のサイトの場合は全く問題なし)、WP Super Cache パラメータの調整が結構面倒ということ。
さらに、WordPress に限って言えば、サイト統計情報を集計する StatPressV との相性が悪いという点が上げられます。(キャッシュにヒットしたアクセスを集計できなくなる模様)
WP Super Cache の活用
しかし、今回のようなアクセスが急増してしまう場合、欠点には目をつむっても、WP Super Cache を利用してみたくなります。Super Cache をOff の時だと 1時間に100ページくらいがアクセス上限だったものが、300ページ/h くらいまで、なんとか対応できるようになります。
一応、今回の Radiko仕様変更の前から WP Super Cache プラグインをインストールして、テストは行い 統計情報集計プラグイン StatPressVとの相性が悪いことは把握していました。
WP Super Cache は豊富な設定項目を持っていて真面目に全部の項目をチューンしようとすると訳がわからなくなります。幸い、Super Cache はデフォルト値が適切に設定されているようで簡易設定でキャッシュをOn、詳細設定でCache Timeout (キャッシュする時間)を設定すれば、すんなり動いてくれます。
上にも書きましたが当サイトの場合は一日あたりのアクセスページ数が 500ページくらいなので、アクセスが増える午後だけにアクセスが集中すると仮定しても1時間あたり25〜50ページくらい。私のサーバーは、1時間に100ページ以上のブログページを処理できますので、キャッシュの設定をしたものの、その設定がちゃんと役割を果たしているのかどうか不明でした。普段はキャッシュOffにしています。
そして、radika のエラーが発生。
実際にアクセス集中が始まり
これは大変! と、WP Super Cache をOn に設定。
やがで、radika 関係のメモページに普段以上のアクセス集中が発生。
キャッシュ Timeout を2日くらい(毎日新しいメモを書けませんから、それくらいで十分)にしておいたのですが、StatPressVがほぼ停止状態になってしまいました。
アクセスが集中するページはわかっているので、 Cache Timeout を3600秒にしたところ、Radiko, Radika 関係と平時のアクセス対応の両立が出来ることがわかりました。
Super Cache はだいたい 150ページ/h くらい処理していました。初日ということもあり、Radiko のエラーに気づいた人が少なかったんでしょうね。そして22時を過ぎると・・・・最高で約200ページ/h くらい、それ以降は深夜、平日ということと、Radikaエラーの抜本対策を取ることも出来ないという事情もありそれ以上のアクセス数に達することもなく、WP Super Cache の効果で金曜日まで無事に乗り切ることが出来ました。
問題は土曜日。
Radika ユーザーの人がトラブルシューティングを始めたのか、私のサーバーは朝からHDDがガリガリうなっています。
1時間あたり200ページくらいのアクセスペースになると、ログの表示(Apacheログとファイヤーウォールログが食い違う)に違和感を覚えるようになり、ここでハタと、キャッシュではなく Apache パラメーターの上限に達していることが判明しました。
キャッシュOffの時に合わせて、Apacheの接続数を調整しており、キャッシュOn の時の接続数を考慮していませんでした。平時はWebサーバーに同時に20本の接続が発生するとそれ以上新しい接続を受け付けないように絞っています。これがサーバーパフォーマンスの上限でしたが、キャッシュをOnにしている今はもうちょっと接続数を増やせそう。30本にしてみたところ、サーバー負荷は上がったものの何とか耐えられそう。
調子に乗って40本にしたら・・・・スワップばかり発生してパフォーマンスが逆に低下。現在 Apache の接続許可数を30本で運営中です。ログだけなら、270ページ/h くらいまで到達したようです。実際にアクセスした人がちゃんとページを読めたのかどうかはわかりませんが。
アクセス集中時のサーバー負荷対策を想像して対策することは出来ますが、実際の突発アクセスは推測とは別物ですからいい経験になります。
キャッシュのまとめ
WordPress の場合、WP Super Cache を導入することにより、ハードウェアを増強することなく突発的なアクセス激増に対応できます。
ただし、Cache Timeout や Apache の “MaxRequestWorkers” パラメーターを調整する必要がありました。また、StatPressVプラグイン のデータが正しく更新されなくなるというマイナスポイントもあります。
キャッシュはあくまでも一時しのぎなので、定常的なアクセス増加にはキャッシュよりもシステム構成変更で対応すべきでしょう。
当サイトの場合は、偶然 Radika に関するメモが検索結果上位にくるため、突発アクセスはラジコに何かあった場合だけですが、外部サイトの運用にも関与しているため、過去次のようなケースがアクセス激増につながった経験があります。
- TV の30分くらいの特集番組で、ユニークな商品分野が紹介され、自社サイトでも同じ商品を扱っていた。
その後、数時間の間、直接紹介されたお店ではないのに、(恐らく同分野ということで)サイト全体に対するアクセス数が激増。(激増した割に実際にビジネスにつながったのは数件。)
半日後には落ち着きました。 - 大型掲示板に、サイト内画像が引用されてしまった。
リファラーで判明しましたが、特定画像へのリンクが掲示板から張られていました。基本的に画像はスタティックファイルなので、どんなにアクセス数が増えてもサーバー負荷にはあまり影響はないのでキャッシュは不要ですが、アクセス解析ログがボロボロになります。SPAM アクセスと同じで迷惑です。これも、2,3日で落ち着きます。 - 有名なゲームのリリース
有名で面白いゲームの英語版をプレイしたメモをブログに詳細に残しているサイトで、そのゲームの日本語版がリリースされるようなケース。
ゲームが噂に違わず面白い場合は、(ブログの品質にもよりますが)アクセス増が2,3ヶ月かそれ以上続く場合があります。 - Twitter や有名掲示板で自サイトのダイナミックページURLを拡散されるケース。
フォロアーが何百人もいる人がダイナミックページのURL付でつぶやかれると最悪で、Tweet 直後から2,3時間の間、サーバーが死にそうになる場合があります。
掲示板の場合、アクセスは増減は緩やかですが、アクセス増期間が 2,3 日続きます。
インターネットに公開しているWebサーバーは、様々な理由で予期せぬ突発的なアクセス増を招く場合があります。アクセス増が 2〜5倍くらいの範囲に収まるなら、WP Super Cache は出費を伴わないパフォーマンス向上効果がある素晴らしいプラグインと言えます。