Gunosy砲直撃時の負荷状況とその対策について
2014.11.24
前書き
一週間程前に書いたノンプログラマ向けの記事に思わぬ反響を頂きました。本当に嬉しいです。
「分かりやすい」というお言葉から貴重なアドバイス・フィードバックまで 本当に沢山のご意見をいただき、ありがとうございました。
今回の記事で頂いたフィードバックを基に 今後もご期待に添えるよう精進いたします。
(なお、次回の記事は「アジャイル開発 / ウォーターフォール開発 と アジャイル開発のよくある誤解」あたりを検討しております。よろしくお願いいたします)
ブログを始めて SICPの記事、Vagrantの記事やらでちょくちょく反響を頂くようになって意識し始めたのが「負荷」。
特に初めてホットエントリ入りを果たした時は「すごく嬉しい」という思いと同時に「サーバが落ちないか心配」という思いがありました。
そこで、同様に負荷対策を考えられている方の「個人のブログにおいて、どれくらいの負荷を見込んで対策を実施すれば良いのか」が少しでも明瞭になるよう Gunosy砲を受けた時のアクセス状況について 実際に一つのデータとして残そうと考えた次第です。
負荷の基準となるバイラル数
Vagrantの記事の時もちょくちょくGunosyからのアクセスがあったのですが、前日までのブックマーク数によってもGunosy砲の威力が若干変わってくるっぽい?(正確な裏付けが取れていない)ので、今回のデータの基準となるバイラル数を掲載しておきます。
Gunosy砲前日のはてぶ数: 300〜400までの間だったと記憶しております。
負荷状況
● Gunosy砲前日
ピーク時アクセス: 1時間あたり800弱、分間最大30アクセス(秒間0.5)程が継続。
ピーク時間帯: 13時に記事を掲載して18〜22時頃がピークでした。
秒間同時リクエスト数: Maxで 2〜3くらいだったと思います。
合計: 5007 アクセス
● Gunosy砲当日
ピーク時アクセス: 1時間あたり1500弱、分間最大50アクセス(秒間0.8)程が継続。
ピーク時間帯: 朝の6時あたりからぐわっと伸び始め、8時がピークでした。
秒間同時リクエスト数: Maxで 3〜4くらいかなという感じです(大体は秒間1〜2リクエスト程でした)
合計: 11240 アクセス
Gunosy砲というだけあり、所感として スマホユーザが圧倒的に多いです。スマホ対策は必須になりそう。
● Gunosy砲後日
ピーク時アクセス: 1時間あたり180アクセス程です。大分落ち着きました。
ピーク時間帯: 朝の8時〜9時頃。
秒間同時リクエスト数: Maxで1〜2くらいだったと思います。
合計: 1870 アクセス
負荷対策としてやった事
● 自分のサーバのスペックの調査
恥ずかしい話ですが、負荷を意識し始めるまではアプリケーションレイヤばかりを気にかけていたので、メモリやCPUの事を改めて勉強し直しました。
サーバ: さくらのVPS
メモリ: 1GB
ディスク容量: 100GB
CPU: 2コア
負荷対策の勉強をする中で、メモリ1GBって結構制約が大きいんだなあと感じました。
( ただ、このスペックで相当なアクセスをさばけるようにできる方も世の中には沢山いらっしゃるので 「制約が大きい」と感じるのは恐らく僕がサーバの性能を活かし切れていないだけです )
● リバースプロキシの導入
Nginxに関しては 実はVagrant上でテスト環境を再現して 色々と試していたのですが、Apacheからの乗り換えの場合 php-fpm 等との互換性周りの関係で 導入までに若干勉強が必要そうだったので以下のような構成にしています。
・ Apache (HTTPサーバ)
・ Varnish (リバースプロキシ)
ページキャッシュは色々試行錯誤の上 今回は導入を先送りし、Varnishでは一先ず静的なファイル(画像, CSS, JS, favicon周り)をキャッシュするようにしました。結構役に立っています。
● Apacheの調整
この辺りは同じ さくら1Gで負荷対策をされていた方の記事を参考にしました。
デフォルトの設定だと MaxClientsの数が とてもメモリ1Gでさばける数ではなかったので、Apacheの1プロセスあたりメモリ占有率、他のプロセスのメモリ占有率と相談しながら調整しています。
KeepAliveはOff、モジュールは検討の結果一先ずPreforkにしています。
※ この辺りはまだまだ不勉強なので、「こうした方が良い」「この設定はまずい」という点がございましたらどんどんご指摘いただければ幸いです。
KeepAlive Off <IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 40 MaxRequestsPerChild 1000 </IfModule>
● コンテンツの圧縮
圧縮周りも無視できないため、画像自体の圧縮やコンテンツのgzip化等色々と手を打ちました。
● その他
オンライン上で負荷を計測して 改善のためのアドバイスをしてくれるツールも沢山あるみたいです。
(例) GTmetrix
まとめ/反省点/御礼
・一先ずGunosy砲のアクセスはさばくことができました。ピーク時にスマホから見た際のレスポンス速度も悪くはない感じでした。
・スマホを意識した負荷対策が必須になりそうです。
・実際に打った対策について 具体的にどのくらいパフォーマンスの改善があったのか、ピーク時にどのくらいのレスポンス速度でさばけていたのか 等を具体的な数値として示す事ができていないのが本当に申し訳ないです。
今後は こうした負荷まわりの評価・計測周りに関しても客観性を持って人に伝えられるよう勉強を続けていきますので、引き続き何卒よろしくお願い申し上げます。
・今回記事をご覧下さった方、本当にありがとうございます。出来る限りご期待に添える形で 今後も良質な情報を提供できるよう精進いたします。