JavaコードをGCPのCloud Profilerで分析してみる

この記事は GMOアドマーケティング Advent Calendar 2020 17日目の記事です。

こんにちは。
GMOアドマーケティングの@zakisanbaimanです。
GCPにプロファイラサービスがあるので試してみようと思います。

環境

  • GCP
  • CentOS7
  • OpenJDK8

Cloud Profilerとは

Cloud Profiler は、本番環境のアプリケーションから CPU 使用率やメモリ割り当てなどの情報を継続的に収集する、オーバーヘッドの少ないプロファイラ。
Cloud Profiler のドキュメント

対応言語はGo, Java, Node.js, Pythonとなっています。
(2020年11月現在)

確認したいこと

プロファイル設定手順とプロファイル結果がどう表示されるのか。

設定手順

Java アプリケーションのプロファイリング
こちらの手順に従って進めていきます。

1. Profiler API を有効にする

2. Profiler エージェントをインストールする

3. プロファイル対象のコードを配置

まずはシンプルにsleepで処理時間を変えてみます。

4. コンパイル&実行

Javaファイルの実行時にagentpathと共に先程インストールしたプロファイラのディレクトリを指定します。
agentpathフラグ

1分ほど流し続け(※)、その後Cloud Profilerの管理画面を見てみましょう。
※1回流すだけだとプロファイラに反映されませんでした。おそらく実行結果をいくつかサンプリングして反映しているものと思われます。

5. プロファイル結果確認

Java8において、指標は以下の2つをとることができます。
1. 経過時間
2. CPU時間

指標は各言語ごとに使えるものが決まっており、プロファイルの種類から確認することができます。

指標を「経過時間」にしてみると想定通りの時間配分になっています。

続いてCPU時間も確認したいのですが、sleepだけではCPU利用率は上がらないため、CPUを使う処理を別途作成しました。

指標を「CPU時間」にしてみると重い処理ほど大きく表示されます。

まとめ

ひとまずJavaプログラムをプロファイルすることができました。
どの処理にどれだけかかっているかが視覚的に捉えることができるので使いやすそうです。
クラウドサービスなので自前でサーバを構築する必要もないのも素晴らしいです。

このプロファイルツールを使って自社プロダクトのボトルネックを解消できればと思います。

ここまで読んで頂き、ありがとうございます。

参考

Cloud Profiler のドキュメント


明日は、H.Tさんによる「Rubyのデバッガ「Ruby Jard」についてご紹介」です。
引き続き、GMOアドマーケティング Advent Calendar 2020 をお楽しみください!

■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/

■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/