インフラ

Continuous Profilingとは|継続的プロファイリングの仕組み・フレームグラフ・導入判断を実装目線で解説

Continuous Profiling(継続的プロファイリング)は、本番稼働中のアプリケーションのコード実行状況を、低いオーバーヘッドで常時サンプリングし続け、どの関数がCPU時間やメモリをどれだけ消費しているかを継続的に可視化する手法です。メトリクスが「どれだけ遅いか」、分散トレースが「どのサービスの区間で遅いか」を示すのに対し、プロファイリングは「なぜ遅いのか=どの関数がリソースを食っているか」をコード単位で示します。この記事では、収集できるプロファイルの種類、統計サンプリングとフレームグラフの仕組み、eBPFとSDKの収集方式、Pyroscope・Parcaといったツールの選び方、そして「どんな時に導入し、どんな時は開発時プロファイルで足りるか」までを実装者の目線で判断できる形に整理します。

まとめ|継続的プロファイリングの価値・仕組み・導入判断の要点

継続的プロファイリングの価値は、本番でしか再現しない性能問題やコスト増を、コードの関数単位まで落として原因を突き止められる点にあります。開発環境で一度だけ取るプロファイルは、本番の負荷や実データを再現できず、実際にCPUやメモリを食っている箇所を取りこぼしがちです。常時サンプリングを本番で回すことで、遅延やクラウド課金の増加を関数レベルで裏づけられます。

仕組みの中核は、統計サンプリング(一定周期でスタックトレースを収集)と、それを集計して表示するフレームグラフです。収集方式は、eBPFでコード変更なしにホスト全体を取る方法と、言語別のSDKやエージェントを組み込む方法に分かれます。ツールはOSSのGrafana PyroscopeやParca、各クラウド・SaaSのマネージド機能があり、いずれもフレームグラフでの可視化を核にします。

導入判断は費用対効果で決まります。CPUやメモリのコストが事業的に無視できない規模、クラウド課金が計算資源に強く連動する構成、本番でしか出ない性能劣化を抱えている場合は、継続的プロファイリングで調査時間と計算資源の両方を削減できます。逆に、小規模で計算コストの圧力が薄く、開発時のプロファイルとAPMのトレースで原因を絞れているなら、常時プロファイリングまでは要りません。導入後の落とし穴は、サンプリング頻度を上げすぎてオーバーヘッドを招くこと、そしてフレームグラフを読む運用が根づかず宝の持ち腐れになることです。

本番環境の継続的プロファイリングが計測する対象と従来型プロファイラとの違い

プロファイリング自体は古くからある手法ですが、継続的プロファイリングは「本番で・常時・低負荷で」回す点が新しさです。まず何を計測し、従来のプロファイラと何が違うのかを押さえます。

CPU・メモリ・ブロッキングなど収集するプロファイルデータの種類

プロファイルには複数の種類があり、調べたい性能問題に応じて使い分けます。代表的なのは、関数ごとのCPU消費時間を測るCPUプロファイル、メモリ確保の量と発生箇所を測るヒープ/アロケーションプロファイル、待ち時間を測るブロッキング系のプロファイルです。用途を短く整理します。

種類 測る対象 効く問題
CPU 関数別のCPU時間 計算過多・高負荷処理
ヒープ メモリ確保量と箇所 メモリ肥大・GC多発
アロケーション 割り当て回数 過剰なオブジェクト生成
ブロッキング ロック・待ち時間 スレッド待ち・競合

言語ランタイムによって取れる種類は異なります。Goはgoroutineブロックやmutex競合まで取れ、JavaやPythonはCPUとアロケーションが中心、といった差があります。まずCPUとヒープの2種を押さえ、待ち系の問題が疑わしいときにブロッキング系を足す、という順で使うと迷いません。

統計サンプリングでスタックトレースを集める低オーバーヘッドの仕組み

継続的プロファイリングが本番で回せるのは、全実行を記録するのではなく統計サンプリングを採るからです。一定周期(例:1秒あたり数十〜100回程度)でプログラムのスタックトレースを瞬間的に記録し、「その瞬間どの関数を実行していたか」の標本を大量に集めます。標本が十分たまると、各関数が実行時間全体に占める割合を統計的に推定できます。

この方式なら、記録の負荷は周期に比例して抑えられ、オーバーヘッドは条件次第で数%以内に収まります(頻度と対象言語で変動するため、本番投入前に自環境で実測します)。従来のインストルメンテーション型プロファイラが全関数呼び出しを計測して負荷を跳ね上げたのに対し、標本抽出に割り切ることで常時稼働と低負荷を両立させた、というのが技術的な要点です。

オブザーバビリティにおける継続的プロファイルの位置づけと役割

オブザーバビリティ(可観測性)は、システムの内部状態を外部から推測できる状態を指し、従来はメトリクス・ログ・トレースの三本柱で語られてきました。継続的プロファイリングは、これに続く「4本目の柱」として位置づけられます。メトリクスで異常に気づき、トレースで遅いサービス区間を絞り、プロファイルでその区間のどの関数がリソースを食っているかまで降りる、という切り分けの最終段を担う手法です。オブザーバビリティ全体の考え方と三本柱の整理はオブザーバビリティ(可観測性)とは:監視との違い・3本柱・主要ツールで扱っており、プロファイリングを「何のために足すのか」の上位設計から確認したい場合はそちらを先に読むと位置づけが明確になります。

混同しやすいのが分散トレースとの違いです。トレースは1リクエストがどのサービス・区間で時間を使ったかを示しますが、その区間の内部でどの関数が重いかまでは分かりません。トレースは「どこ(which service/span)」、プロファイルは「なぜ(which function)」を答える、と役割を分けて考えると両者は競合しません。トレース側の実践はAPM(アプリケーション性能監視)とは:仕組み・OpenTelemetry計装と導入判断で扱っています。

フレームグラフの読み方とeBPF・SDKによるデータ収集方式

集めたプロファイルは、フレームグラフという可視化で読み解きます。ここでは読み方と、データを集める2系統の方式を実装の観点で整理します。

フレームグラフの構造とボトルネックになる関数を読み解く手順まで

フレームグラフは、プロファイルの標本を関数の呼び出し階層で積み上げた図です。読み方の要点は2つあります。横幅は、その関数が消費したリソース(CPU時間やメモリ)の割合を表し、広い箱ほど多く消費しています。縦方向は関数の呼び出し階層で、下が呼び出し元、上が呼び出し先です。したがって「横に広い箱」を上の階層から探すと、最もリソースを食っている関数にたどり着きます。

実務では、最上部で幅の広い葉(それ以上呼び出しのない関数)が、実際に時間を消費している当事者です。手順としては、まず全体で幅の広い経路を選び、その先を上へたどって幅が狭まらない箇所まで降り、そこが自前コードなら改修対象、ライブラリ内部なら呼び出し回数を減らす設計変更の対象、と切り分けます。横幅は割合であって絶対時間ではない点に注意し、全体の負荷が上がっている時間帯のプロファイルを選んで読みます。

eBPFでコード変更なしにホスト全体をプロファイルする収集方式

収集方式の一つがeBPFを使う方法です。eBPFはLinuxカーネルに安全な小さなプログラムを差し込む仕組みで、これを使うとアプリのコードを一切変更せずに、ホスト上で動く全プロセスのスタックトレースをカーネル側で採取できます。エージェントをノードごとに1つ常駐させ、そのノード上の全プロセスをまとめてプロファイルする構成が取れるため、多数のサービスが動くコンテナ基盤と相性が良い方式です。

反面、eBPFはCやGoのようにコンパイル済みのネイティブコードには強い一方、実行時にシンボル情報が乏しいインタプリタ言語や一部ランタイムでは、関数名まで解決するのが難しい場合があります。カーネルのバージョン要件や特権も要るため、コンテナ環境では権限設計を含めて導入可否を確認します。言語を問わず横断的に、かつコード改変なしで基盤全体を見たいときに向く方式です。

言語別SDKエージェントとOpenTelemetryのプロファイルシグナル

もう一つが、言語別のSDKやエージェントをアプリに組み込む方式です。ランタイム内部から直接プロファイルを取るため、関数名や行番号の解決が確実で、インタプリタ言語でも関数単位まで読めます。Grafana Pyroscopeは、Go・Java・Python・Ruby・.NET・PHP・Rustなど向けのSDKとeBPFの両方を持ち、対象言語ごとに適した方を選べる構成です。コードへのSDK組み込みが要る分だけ手間はかかりますが、解像度は高くなります。

標準化の動きとして、OpenTelemetry(OTel)がプロファイルを4つ目のシグナルとして仕様策定を進めており、eBPFベースのプロファイラも含めて整備が進む段階にあります(2026年時点で発展途上のため、採用時は成熟度を確認)。OTelで計装しておけば、送信先を差し替える設計に寄せられます。OTelの各シグナルとOTLP・Collectorの詳細はOpenTelemetry(OTel)とは:3つのシグナル・OTLP・Collectorの解説にまとめました。クラウド上での計装基盤の組み方はAWSオブザーバビリティの実装:ADOT・CloudWatch・Container Insightsが参考になります。

継続的プロファイリングを導入すべき条件とツール選定の判断基準

ここからは判断の章です。継続的プロファイリングは入れれば必ず得をする道具ではありません。導入コストと運用負荷に見合う規模か、どの方式・ツールを選ぶかを、条件を付けて言い切ります。

継続的プロファイリングを導入すべき条件と見送る場面の切り分け

常時プロファイリングまで入れるべきなのは、次の条件に当てはまる場合です。計算資源のコストが事業的に無視できず、CPU・メモリの削減がそのままクラウド費用の削減に直結する。本番の実負荷・実データでしか再現しない性能劣化を抱え、開発環境の再現に手間取っている。分散トレースで遅いサービスまでは絞れるが、その中のどの処理が重いかで調査が止まっている。これらのうち複数が当てはまるなら、導入で調査時間と計算資源の両方を回収できます。

逆に、単一の小規模アプリで計算コストの圧力が薄く、性能問題が起きたときだけ開発環境やステージングでプロファイルを取れば足りる規模なら、常時プロファイリングの基盤構築は過剰です。まずAPMの分散トレースで遅い区間を絞れる状態を作り、それでも関数レベルの原因特定に時間を取られるようになってから継続的プロファイリングへ進む方が、基盤の運用コストを先送りできます。導入は段階を踏むのが実務的です。

eBPF方式とSDK方式・SaaSと自前OSSの選び分け基準

方式とツールの選定は、2つの軸で整理できます。1軸目は収集方式で、コード変更を避け言語横断で基盤全体を見たいならeBPF、インタプリタ言語で関数レベルの高い解像度が要るならSDKを選び、多くの現場は両方を併用します。2軸目は運用形態で、自前で基盤を持つOSSか、マネージドのSaaSかです。

観点 自前OSS マネージド/SaaS
代表例 Pyroscope・Parca 各クラウド・SaaSの機能
立ち上げ 基盤構築が必要 エージェント投入で開始
費用構造 運用人件費が主 データ量の従量課金
データ管理 自社内に保持 外部へ送出

OSSの代表格は、Grafana傘下のPyroscope(2.0系・2026年に大規模運用向けへ再設計された版が公開)と、Polar Signalsが開発しeBPFを軸に据えたParcaです。Pyroscopeは多言語SDKとGrafana連携やアラートに強く、ParcaはeBPFとPrometheus流の連携に寄っています。運用チームが小さく早く立ち上げたいならSaaS、送信データを社外に出せない要件やデータ量が読めないほど大きい構成なら自前OSSで基盤を持つ、という切り分けが指針です。バージョンや対応言語は移り変わるため、採用前に各公式で現時点の対応状況を確認します。

導入プロジェクトでよくある失敗パターンと設計段階での主な回避策

導入プロジェクトが空回りする典型を、条件付きで挙げます。第一に、サンプリング頻度を上げすぎて本番のオーバーヘッドを招くパターン。解像度を求めて周期を細かくすると、プロファイリング自体が負荷源になります。第二に、プロファイルは取れているのに、フレームグラフを読んで改修へつなげる運用が根づかず、誰もダッシュボードを見ない状態です。第三に、eBPF方式でシンボル解決が効かず、関数名が読めないまま放置されるパターンです。

これらは、サンプリング頻度の実測・読み解きから改修までの運用フロー・シンボル情報の確保、の3点を設計段階で決めておけば防げます。既存システムへの後付け計装や、プロファイリングを含む性能改善・運用の内製化に踏み込む際は、システムの保守運用・内製化支援で、計装方針の策定からフレームグラフを回す運用体制づくりまで併走できます。プロファイリングを「入れて終わり」にせず、コスト削減や性能改善という成果へ結びつけるところまでが設計の対象です。

よくある質問

継続的プロファイリングの導入検討でよく挙がる質問に、実装の観点で簡潔に答えます。

継続的プロファイリングとAPM・分散トレースは何が違うのですか?

分散トレースは1リクエストがどのサービス・区間で時間を使ったかを示しますが、その区間の内部でどの関数が重いかまでは分かりません。継続的プロファイリングは、まさにその関数レベルの消費を示します。トレースは「どこが遅いか」、プロファイルは「なぜ遅いか(どの関数がリソースを食うか)」を担い、両者は補完関係にあります。

本番環境で常時プロファイリングを回して負荷は大丈夫ですか?

継続的プロファイリングは全実行を記録せず統計サンプリングを採るため、条件次第でオーバーヘッドを数%以内に抑えられます。ただし負荷はサンプリング頻度と対象言語で変動するので、本番投入前に自環境で実測し、必要な解像度と負荷が釣り合う頻度に調整するのが前提です。

フレームグラフはどこを見ればよいのですか?

横幅がリソース消費の割合、縦方向が関数の呼び出し階層です。上の階層から横に広い箱を探し、幅が狭まらない箇所まで上へたどると、実際にリソースを食っている関数にたどり着きます。横幅は絶対時間ではなく割合である点に注意し、負荷が上がっている時間帯のプロファイルを選んで読みます。

eBPF方式とSDK方式はどちらを選べばよいですか?

コード変更を避け、言語をまたいで基盤全体を見たいならeBPFが向きます。インタプリタ言語で関数名まで確実に解決し、高い解像度で読みたい場面ではSDK方式が向いた選択です。多くの現場は、基盤全体をeBPFで広く押さえ、重点サービスにSDKを足す併用構成を採ります。

継続的プロファイリングでコストは下げられますか?

CPUやメモリの消費が大きい関数を特定して改修すれば、必要な計算資源が減り、計算資源に連動するクラウド課金の削減につながります。効果が出やすいのは、課金がインスタンス数やコンテナのリソース割り当てに強く連動している構成です。まず消費の大きい関数から手を付けると費用対効果を測りやすくなります。

関連記事

資料請求

RELATED POSTS 関連記事