「QAアナリティクスを入れるとサイトが重くならないですか?」
よく聞かれる質問です。 直接のご回答は、ホーム画面に表示されている「ページ表示速度」の項目を見てもらうと、皆さんのサーバーでどのくらい時間がかかっているか表示されています。
▼右下の「QAのページ表示速度」
画像のサイトは一般的な月額1000円程度の共用サーバーですが10msec、つまり1000分の10秒であり、重いプラグインと比べると非常に軽い処理となっています。
QAアナリティクスは、なるべくサーバー負荷が軽くなるように考え下記のポリシーで作っています。
とはいえ、WordPressのプラグインでCPUの負荷を下げるのは簡単ではなく、少しずつ改善を試みて今に至ります。 今日は、そんなQAアナリティクスが実装する「CPU負荷の下げ方」についてご説明します。
※プラグイン重くなる原因は一つだけではなく、CPU外にもデータベースの使い方がまずいなどが挙げられますが、今日は特にCPUに絞ってお伝えします。
目次
QAの工夫をお伝えする前に、あまり知られていない、ちょっとした前提知識を共有させてください。
WordPressでは、admin-ajaxという2006年から存在するajax通信の仕組みが存在しており、現在数多くのプラグインやテーマが利用しています。
そしてビーコン型のアクセス解析プラグインの場合も、解析タグが稼働するとサーバーとajax通信を行い、アクセスデータを記録する仕組みになりますので、通常はadmin-ajaxが利用されます。
そして、それが重い原因となっていきます。
admin-ajaxがひとたび稼働すると、利用しているすべての処理が起動されます。したがってアクセス解析のプラグインでこれを使うと、アクセスを記録する度にadmin-ajaxが起動し、関係ない処理も全部起動します。イメージでいうと、アクセスがある度にWindowsの再起動をしているようなものです。1分間に100ページビューがあれば100回の再起動。そりゃ時間もかかるし、重そうですよね。
本来アクセス解析プラグインを作る側としては、自分が稼働するだけならなるべく無駄な処理は行わないようにしサーバー負荷を軽くしたいと考えますが、admin-ajaxを使うと、それは不可能です。したがって、アクセス数が多くなってくると、どんどんCPU負荷があがってしまいます。
CPU負荷を下げるにはWordPress標準のadmin-ajaxを使わずかつWordPressのルールに従ってajax処理を行わなければなりません。なぜならWordPress公式ディレクトリに公開するプラグインにおいて独自処理は許されていないからです。実際、QAアナリティクスのリリース初期はこの問題でずっと悩んでいました。しかしそれから3年の経験を経て、現在のQAアナリティクスでは下記2つの対策が行われています。
以下ご説明します。
WordPressの起動にはSHORTINITモードという、Windowsのセーフモードのような起動モードがあり、そのモードで起動することでCPU負荷を下げることができます。
QAアナリティクスはこのSHORTINITを活用することでCPU負荷を下げ、快適にサーバーを使えるようにしています。
ちなみに、このSHORINITについて、WordPressの書籍も出されている野村圭さんやAutomattic社にスポンサーされてWordPressに携わっているBenさんやJonathanさんに聞いてみました。
「日本にはほとんど情報がないよね」という見解で一致ですが、Pluginで利用するのは問題ないという見解を頂いています。またJonathanさんも過去に在籍したDelicious Brains でadmin-ajaxの負荷で困ってベンチマークをしたことがあるらしく、こんな記事を共有してくれました。ダークホースとしてmust-useを使う方法があるみたいです。
▼WP REST API vs admin-ajax.php vs Must-Use Plugin: Handling AJAX Requests in WordPress
https://deliciousbrains.com/comparing-wordpress-rest-api-performance-admin-ajax-php/
あとSHORTINITは注意点もあって、WordPress本体のバージョンに左右されるため検証が必須です。このあたりをコントロールしやすいプロダクトをWordPress界隈で有名なJJJさんが作成しているみたいです。
https://github.com/JJJ/chelsea
もしadmin-ajaxで困っている方がいれば参考にされてください。
※情報提供を頂いたみなさん、ありがとうございました。
QAアナリティクスではなるべく正確なデータを記録するため、最初にアクセス情報(ページビュー)を記録した後、Defaultでは3秒毎にページ位置やマウスクリックなどのイベントデータをサーバーに送信しています。
しかしサーバー負荷があがったことを検知した場合、ブラウザは3秒ごとの送信を停止し、データを自分自身に貯めます。そして再度3秒ごとのチェックでサーバー負荷が下がったことを検知するか、ページ遷移やフォームへの入力など特定のタグがクリックされた時のみ、貯めていたイベントデータを送信します。これをキュー処理といいます。
このキュー処理により、ページ遷移したりコンバージョンするような重要なユーザーのデータを記録しながらも、サーバーへの通信頻度を減らし、サーバーの安定稼働を優先することができます。
QAアナリティクスでは、不要かも知れないデータをとるためだけにお客様のサイト表示速度が遅くなるのは本末転倒だと考えています。従って高負荷時においては、アクセス情報(ページビュー)は確実に記録するようにし、残りのイベント計測は、より将来の分析に役立つユーザーの行動データ取得を優先しながら稼働します。
弊社の検証環境において行った調査の結果を共有します。初期バージョンと比べ、速度は10倍、メモリの使用量は6分の1程度になっています。
応答速度が10倍になったことからCPU負荷についても10分の1程度になっていると想定されます。実際負荷テストを行った結果において、1CPU(1core)での処理数において、admin-ajaxでは秒間20セッション程度でしたが、SHORTINITバージョンでは200セッションでも余裕がありました。CPUはレンタルサーバーによってまちまちなので一概にはいえませんが、負荷は10分の1になったといえます。
なお、CPU以外にもQAではDBを使用しないなど様々な負荷対策を行っています。詳しく知りたい方はこちらの記事もご覧ください。
これは各レンタルサーバー会社の涙ぐましい努力のおかげです。サーバースペックの表をみると、毎月1000円程度でもCPUが6コア保証など、かなり贅沢なサーバー構成になっていることがわかると思います。
つまりWordPressでプラグインや複雑な処理をたくさん入れることで、実はCPU負荷はあがっているのですが、それでも十分動くようなハイスペックなサーバーが裏で用意されているのです。
「このままCPU負荷があがるなら、いつかサーバー料金の値上げをしなきゃいけないかも。。。」
あるレンタルサーバー会社の人と話した時の本音です。 もし他国で同様のサーバーを借りたら、毎月5,000円程度はくだらないそうです。感謝ですね。
著書:無料でできる!世界一やさしいGoogle Analytics-アクセス解析-入門 Twitter