先に最終構成と成果を共有します。
昨年、マーケティング施策をホームページに公開した際に、公開ページに対するスパイクアクセスが発生し、ホームページが閲覧できない状況が数回発生しました。スパイクアクセスが発生するタイミングでサーバのリソースを消費しきっており、確認はしていませんが、同じクラスタ上で稼働している他のサービスにも影響を与えていた可能性もあります。
会社としてはLINEをマーケティングで活用していく方針で、ホームページへのアクセスは今後も増加する見込みであるため、ホームページはスパイクアクセスに耐えながらも、常に高いパフォーマンスを維持し続けることが求められています。
上記1と2の方針から、ホームページは既存GKEクラスタから切り出し、別クラスタで運用することとした。また、新クラスタではGKEの新しい運用モードであるAutopilotを選択しました。
AutopilotによりGKEノードの運用管理をGoogleに任せることでのノードの運用管理負荷の軽減、稼働したPod単位の課金となることで、利用状況に応じたコストの最適化が見込まれます。
パフォーマンスの改善に関しては、GKEのHPAにて対応することを想定しています。加えて、OPcache(バイトコードキャッシュ)、APCu(ユーザーキャッシュ)を使用するという指示も受けてました。
テスト環境にてab試験をpm.maxchildrenの値を変えて実施。pm.maxchildrenのほうがパフォーマンスが良い結果となりました。
Time taken for test:
pm.max_childrenの値が大きかったため、PHPのワーカープロセスが増え、それに伴いメモリ消費が増えていたと考えられる。新しい環境においては、Podのスペックに合わせて調整しました。
検証環境にて、ab試験をPod数を変えて実行しました。結果は以下のとおりです。
ab -n 1000 -c 100 "http://xxx.xxx.xxx.xxx/"
Pod数だけでなく、Podのスペックを変えることでも、アクセスのスパイク時に対応するための検証を行っています。例えば、CPU数を2倍にすれば、テスト時間が半分になるといったように、Pod数を増やすことと同じ効果を確認しています。
ただし、スペックを高くすることで、平常時にスペックを持て余し、Podあたりのコストが上がってしまうため、この時点では、小さいPodを稼働させ、アクセスが増えたときにPod数を増やすことで対応することにしました。
ここまで検証をしてきて、おそらく最初にあげた3つの改善の方針は達成できると思いました。
しかしながら、パフォーマンスについてはもっと効率的になる方法があるのではないかと思っていて、追加で調べてみることにしました。
Nginx + PHP-FPM + Wordpress 高速化といったキーワードで更に調査を進めると、FastCGIキャッシュというNginxのキャッシュ機能が効果が高いということがわかってきました。
まずはab試験の結果を共有します。
125倍高速化しました。。。Pod数を増やしたり、スペックを調整したりして色々検証していたのが吹っ飛ぶくらいのインパクトです。
FastCGIレスポンスを直接キャッシュする機能です。アクセスによりPHP-FPMが生成するWebページはNginxによって一定期間キャッシュされ、同じページへのアクセスに対してはこのキャッシュが返されます。キャッシュはNginxのメモリに保存され、メモリの容量がいっぱいになった場合、最も古いキャッシュが自動的に削除されます。また、キャッシュ保持時間も設定することができます。これにより、メモリがいっぱいになってPodがクラッシュすることを防ぐことができます。
以下のポイントでこのFastCGIキャッシュを即採用すべきと考えました。
詳細な導入方法は、ネット上にたくさんありますのでまるっと省きます。
旧環境と新環境に対して、以下の試験を実施した結果を共有します。
ab -n 1000 -c 100 "http://xxx.xxx.xxx.xxx/"
試験結果は旧環境では、Time taken for a test が 347.492秒、さらに1000回の試験に対して 143回の失敗という結果になりました。一方、新環境では、Time taken for a test が 4.621秒、1000回の試験に対して 0回の失敗という結果になりました。同じ試験に対して約75倍高速化し、失敗回数も0になり、信頼性も高まる結果となりました。
今回、FastCGIキャッシュを有効化することでホームページの高速化という結果を得ることができましたが、これは全てのケースで有効というわけではありません。Wordpressで運用していた当社のホームページの環境でNginx + PHP-FPM の構成でサーバー環境を構築していたこと、FastCGIキャッシュが動的ページのキャッシングと相性が良かったことなどいくつかの条件が重なり、大きな成果に繋がりました。設定を誤ってしまうと、こちらの記事のような情報漏えいにつながる危険性もあります。とはいっても、環境によってはメリットが非常に大きいと思いますので、FastCGIキャッシュを利用していない場合は、導入を検討してみてはいかがでしょうか。