関連記事

ISUCONアプリをローカルで構築してみる



ローカルで Pyroscope を動かして、実際にプロファイリングしてみたいと思います。
Pyroscope は、Continuous Profling を実現するための OSS になります。

Grafana Pyroscope | Grafana Pyroscope documentation
Grafana Pyroscope is an open source software project for aggregating continuous profiling data.
Pyroscope を使うことで、パフォーマンスのボトルネックを探し出したり、CPU やメモリに関する問題を特定したりすることができます。
特徴としては、下記のようなことがあげられます。
プロファイルを Pyroscope に送る方法は 下記の 2 つがあります。
公式ドキュメントより
サポートされている言語やセットアップの容易さ、カスタマイズしたいかを考慮して、どちらを利用するか選ぶことができます。

Configure the client to send profiles | Grafana Pyroscope documentation
Learn how to configure the client to send profiles from your application.
Continuous Profiling は、意図しないタイミングで発生した問題や再現性のない問題でも Profiling できるように、継続的に Profiling をし続けることです。

What is continuous profiling?
Community post by Uchechukwu Obasi Coming from a background working as a frontend developer at Grafana I’m no stranger to open source performance monitoring. I was part of a team that was responsible…
下記のサンプルを使って、ローカルで Pyroscope を試していきたいと思います。
unknown linkサンプルには 5 つのコンテナが含まれており、アプリケーションは 3 つの Region に分かれています。
/car、/bike、/scooterの 3 つのエンドポイントを持つ
公式ドキュメントより
5 つのコンテナを Docker Compose を使って、起動します。
1docker compose up -dhttp://localhost:4040から Pyroscope の UI が確認できます。
アプリケーションの選択から "rideshare.java.push.app" -> "process_cpu
" を選択すると、対象のアプリケーションの CPU のプロファイル結果を確認できます。
フレームグラフを確認すると、orderBikeやorderScooterよりordeCarが圧倒的に CPU を使っていることが確認できます。

タグを設定していると、タグごとに結果をフィルタリングすることができます。
今回は、orderCarが怪しいので、"car"で絞り込んでおきます。

他にも"region"というタグがあるので、それを使ってフレームグラフの比較をしてみます。
"region"タグを使って比較してみると、"eu-north"のみcheckDriverAvailabilityメソッドが CPU を多く使っていることがわかります。

差分をみても、"eu-north"以外ではcheckDriverAvailabilityでmutexLockを呼び出していないことが確認できます。ちなみに、赤い部分は baseline と比較してリソースが増えた箇所、緑の部分は baseline と比較してリソースが削除されている箇所になります。

実際にコードを確認すると、"eu-north"のみmutexLockを呼び出しているのが確認できます。