こんにちは、メディアチームで暮らしニスタの開発を行っている三島です。
春になって山菜が食べたいなと思う今日このごろです。
今回はメディアチームで開発を行っているメディアサイト「暮らしニスタ」のサーバ負荷軽減について書きます。
その他のパフォーマンス改善の記事についてはこちら
問題になっていたこと
メディアチームでは約3年前に暮らしニスタの大規模なリニューアルを行いました。リニューアル当時はサイトへのアクセスが少なかったため正常に処理することができていました。 最近になり高負荷時に一時的にサイトがダウンする事象が発生していました。 下図は高負荷時のサーバの負荷の様子です。ロードアベレージが増加しているため正常に処理が完了しなくなっています。 以上のことから高負荷時でも正常に処理が完了するようにプログラムを変更する必要がありました。
サーバー構成について
メディアチームで開発しているメディアサイトは、主に2つの役割を持つサーバで運用されています。
- APIサーバ
- DBからデータを取得し適切な形に変換し返却する
- アプリケーションサーバ
- APIサーバからデータを取得しHTMLを生成し返却する
調査方法
調査には、PHPのプロファイリングツールの「php-xhprof-extension」を使用しました。 このツールはCPUの実行時間やメモリの実行時間などをプロファイルすることができます。 github.com
調査結果
サーバ負荷について調査した結果、アプリケーションサーバからAPIサーバへ通信をする関数の「executeApi」がボトルネックになっていることが分かりました。 この関数はPHPのcurl_multi_execを行う関数です。処理内容を読んでいくと、APIへのリクエスト後curl_multi_selectを使用していなかったため、接続を待っている間のCPU使用率が高くなってしまっていた。この処理を修正することによりサーバ負荷を下げることにしました。
改修したこと
APIへのリクエスト処理を修正するにあたり「executeApi」のリファクタリングを行う必要がありましたが、処理が複雑になる可能性があったため改修するコストが高いと判断しました。そのため、処理を書き換えるのではなく外部のライブラリのguzzleを使用することにしました。このライブラリは通信の処理を簡単に記述することができます。ドキュメントが整備されていたため比較的かんたんに導入することができました。 github.com
改修結果
guzzleを使用した処理に変更することでCPUの使用率とロードアベレージが大きく改善しました。 CPUの負荷が改善することにより、急なリクエスト増加でも安定してリクエストを処理することができるようになりました。
今後について
アプリケーションサーバからAPIサーバへの通信の処理を変更することでアプリケーションサーバの負荷を下げることができました。 特に調査ツールの「php-xhprof-extension」は細かく関数ごとのプロファイルを記録してくれるため調査を簡単に行うことができました。 自分で予測して修正していくよりもデータを取り修正することで効率よく修正を行うことができたと思います。 今後もサーバの処理を正常に行っていけるように調査し修正を行っていきたいです。