Article by: Will McMullen
本番環境で何かの動作が遅くなった場合、古い習慣に陥りやすいものです。ログをいくつか追加し、メトリクスを送信し、ローカルで問題の再現を試みます。意欲があれば perf や py-spy に手を伸ばすかもしれません。トレースは役立ちますが、特にスタックの深い部分では、「なぜ遅いのか」を説明するには不十分なことがあります。
つまり、開発者がアプリケーションの挙動を、直感に頼って推測せざるを得ない場面が生じます。たとえば、プロパティドリルによってレンダリングが肥大化していたり、状態変更によって不要な再レンダリングが発生していたり、あるいはサードパーティ製のライブラリが静かに 500 個のイベントリスナーを起動していたりするかもしれません。
こうしたときにこそ、プロファイリングが役に立ちます。プロファイリングは症状を指摘するだけでなく、CPUを消費している関数呼び出しやファイル、行番号を正確に表示します。
本日、私たちは Continuous プロファイリング と UI プロファイリング の2つの強力なプロファイラーをリリースします。実行時の動作を関数レベルで可視化し、ボトルネックを迅速に特定して解決するための機能を提供します。
バックエンドのボトルネックを特定して解決する Continuous プロファイリング
開発マシンでは問題なく動作していました。ステージングテストも問題なし。しかし、本番環境で実際の負荷がかかると、その重要な API エンドポイントが突然遅くなったり、バックグラウンドワーカーが予期せず大量のメモリを消費したりすることがあります。ログは正常に見え、トレースによってサービスがアクセスされたことも確認できているのに、内部のボトルネックが特定できない…。そのようなとき、開発者は再現が困難な問題や、隠れた非効率性を推測するしかありません。
継続的プロファイリングは、このような状況において、バックエンドの実行状況を常時可視化を提供します。長時間実行されるワークロード、リアルタイム API、「ローカルでは問題なかった」と片付けられがちなコードパスの解析に最適です。
特に、以下のような場合に役立ちます。
- CPU ホットスポット:あるエンドポイントが突然 CPU 使用率が3倍に急増し、原因が分からない場合、プロファイリングは機能レベルのボトルネックを直接特定できます。
- バッチジョブ:何時間も静かに実行される(時にはクラウド請求を倍増させる)あの夜間処理。いまでは、それが どこで時間を費やしているのかを正確に確認できる ようになりました。
- ML パイプライン:あるモデルパイプラインで発生していたレイテンシのスパイクを、プロファイリング を使ってわずか 10 分ほどで、10 秒短縮しました。調べてみると、パイプラインの一部が「想定以上の処理」をしていたのです。詳細はこちらをご覧ください。
- アナリティクス:あなたの「インサイトエンジン」が、実際には数百万行を回すだけのループにすぎないこともあります。プロファイリングは、ログやメトリクスでは見えない非効率を、プロダクション環境に影響が出る前に発見する手助けをします。
バックエンドサービスのパフォーマンスは、ブラックボックスのままである必要はありません。Continuous プロファイリング を使えば、インフラコストの最適化、API レスポンスの遅延削減、スループットの向上が可能になり、Slack が通知であふれる前に非効率を簡単に見つけられます。
現在、Node.jsとPythonを標準でサポートしています。
UIのカクつきや遅延をUIプロファイリングで解消
フロントエンドはスタックの中でも特にシビアで、たった50ミリ秒の差が「なめらか」か「イライラ」かを分けます。モバイルでは期待値はさらに高く、バッテリー制約や、古いデバイスを使用するユーザーがいることでトラブルシューティングは難しくなります。ある瞬間にはリストビューが完璧に動作していても、次の瞬間にはネットワーク呼び出しでブロックされ、ユーザーが「ラグだらけのゴミ 😡」とレビューに書き込みながら怒りのタップをしているかもしれません。
UI プロファイリングは実際のユーザーセッションにおけるコード実行をキャプチャし、応答性を低下させているものを正確に把握できるようにします。その結果、実際に使い心地の良い高速なアプリを提供できます。
UI プロファイリングでできること
- メインスレッド上のすべての関数をキャプチャし、入力遅延、フレーム落ち、アニメーション不良を引き起こすコードを特定する
- 実際のユーザーフローにおいて、レンダリング関数・イベントハンドラ・非同期コールバックが遅くなっている箇所を検出
- サードパーティの SDK、広告ライブラリ、UI コンポーネントによる繰り返し実行や肥大化した処理を特定
次回、チェックアウト画面が停止したり、ログインページの応答がユーザーを戸惑わせるほど遅くなった場合でも、UI プロファイリングがその原因を正確に特定するのに役立ちます。起動時にアプリがリソースを消費している場所(肥大化したアセットやブロックするスクリプトなど)を明らかにし、画面遷移のカクつき、レイアウトのズレ、タッチ応答の遅さといった、ユーザーを苛立たせる UI の不具合を解消する手助けをします。
iOS と Android で利用可能。ブラウザ向けの JavaScript プロファイリングも近日対応予定です。
パフォーマンスの全体像を可視化
トレーシングは、サービス全体にわたるパフォーマンスをマッピングし、遅延がどこで発生しているのかを把握できる、高レベルな概要を提供します。プロファイリングはこれを補完し、遅延を引き起こしている具体的な関数呼び出しに深く踏み込み、正確なファイルや行番号まで特定します。問題のおおよその場所がわかるだけでなく、正確な場所を特定できます。
プロファイリングはすでにあるのでは?
ご存じの方もいるかもしれませんが、Sentry におけるプロファイリングはまったく新しい技術というわけではありません。2022年にはじめてプロファイルの可視化と監視のためのツールをリリースし、現在では約3万の組織が Sentry プロファイリングを利用して、アプリケーションのデバッグを行っています。初期バージョンでも典型的なトランザクションの問題は検出できましたが、30秒の制限があったため、バックグラウンドジョブや AI 推論チェーンといった長時間タスクには必ずしも理想的ではありませんでした。
この課題を解決するために、プロファイリングの仕組みを根本から見直しました。従来の時間制限を完全に撤廃し、プロファイルをトランザクションから切り離したうえで、新しい設定コントロールと SDK の API により、ユーザー自身が制御できるようにしています。
Start/stop(start_profiling() と stop_profiling())を使うことで、コード内でプロファイルの境界をどこに定義するかを決めることができます。ML トレーニング、ビッグデータ解析、長時間の API リクエストといった処理に対して、必要に応じて細かい粒度(あるいはそうでない粒度)で制御できます。
セッションベースサンプリング(profile_session_sample_rate)
各トランザクションごとではなく、ユーザーセッション単位で一度だけプロファイリングするかどうかを決定します。これによりサンプリングがより予測可能になり、完全なプロファイルを確保できます。フレキシブルなライフサイクル管理(profile_lifecycle)
手動の start/stop 制御か、トレースイベントに連動した自動プロファイリングを選択できます。どの程度の粒度でインストゥルメンテーションを行いたいかに応じて、プロファイリングの挙動を調整するのに最適です。非推奨のコンフィグ
profiles_sample_rate と profiles_sampler は廃止され、セッションを意識した代替手段に置き換えられました。プロファイリング時間の無制限化
プロファイルはもはや 30 秒で制限されません。バッチジョブ、ML パイプライン、モバイルセッション全体といった長時間タスクの分析に有効です。明瞭な料金体系
利用量に基づいて課金されます。バックエンドでは Continuous プロファイル時間、フロントエンドでは UI プロファイル時間 で計測されます。隠れた追加料金やあいまいな計算はありません。これらの改善により、プロファイルを継続的に実行しつつ、生成・利用・保存するプロファイリングデータの量を細かく調整できるようになりました。
導入は簡単
Sentry でのプロファイリングを始めるには、パッケージをインストールし、3~5行のコンフィグコードを追加するだけです。
プロファイルデータを取得する最も簡単な方法は、Sentry.init() で「trace lifecycle profiling(トレースライフサイクルプロファイル)」を有効にすることです(Node.jsの例)。
これにより、span に囲まれたされたすべての操作(HTTPリクエスト、アセットの読み込みなど)がプロファイルされ、Sentry 上に集約されます。より細かく制御したい場合は、profileLifecycle を manual に設定し、コード実行前に Sentry.profiler.startProfiler() を、実行後に Sentry.profiler.stopProfiler() を追加してください。
すでに Sentry を利用している場合は、設定画面から無料の プロファイリングトライアルを開始できます。セットアップの詳細についてはドキュメントをご確認ください。ご意見やご質問は Discord のディスカッションにぜひご参加ください。
Sentry をまだ利用していない方は、いつでも無料でお試しいただけます。またデモをリクエストして始めることも可能です。
Original Page: Debug App Performance Down to the Function Call–Introducing Continuous Profiling & UI Profiling
IchizokuはSentryと提携し、日本でSentry製品の導入支援、テクニカルサポート、ベストプラクティスの共有を行なっています。Ichizokuが提供するSentryの日本語サイトについてはこちらをご覧ください。またご導入についての相談はこちらのフォームからお気軽にお問い合わせください。