Ichizokuは日本唯一のSentry公認販売業者です。 日本語のドキュメント、動画、サポート窓口で日本のお客様のSentry活用を支援します。

Sentryのプロファイリング: コードレベルでパフォーマンスのボトルネックを特定し排除する

ユーザーからロードが遅いと言われたため、ログやトレース、メトリクスを通して分析をしました。

さらに、アプリケーションのパフォーマンスの原因を特定するために、利用可能なデータはすべて分析しました。

しかし、それでもボトルネックの原因を突き止めることはできませんでした。

もしかしたら、監視が十分じゃなかったのかもしれません。

あるいは、本番環境と大きく異なる環境でテストしているだけかもしれません。

いずれにせよ、根本的な原因を突き止めるのに、精神的負荷と時間がかかります。

このようなパフォーマンスの悩みを解決するために、プロファイリング機能を構築しました。

現在、Python、Node.js、iOS、Android、PHPでは、最新の料金プランで利用可能です。

プロファイリングは、パフォーマンスの問題を引き起こしているプログラムの行番号までピンポイントで特定するため、Sentryのパフォーマンスを向上させます。

プロファイリングは、関数の実行時にその実行時間に関する本番環境のデータを収集します。

そして、その結果を集計して、あらゆる環境におけるアプリケーションのパフォーマンスを把握することが可能になります。

実行時間を推測したり、パフォーマンステストを書いたりする代わりに、アプリケーション内で非常に多く実行されるコードを確認し、パフォーマンスのボトルネックを素早く特定することができます。

さらに、プロファイリングは手作業による計測にかかる時間を短縮するため、導入後すぐにパフォーマンスを計測することができます。

プロファイリングによってパフォーマンスチューニング作業がどれくらい楽になり、ボトルネックをどのように修正するのかをご紹介します。

また、SDKのサポートに関する最新情報についてもご紹介します。

パフォーマンスチューニング作業

こちらは、動作の遅い関数からアプリケーションフレームやコールツリーまで掘り下げて、問題の原因となっているプログラムの行番号を特定するデモ画面です。

 


プロファイリングを始める準備はできていますか?詳しくは価格ページをご覧ください。

トランザクションからプロファイルまで掘り下げる

Sentryパフォーマンスでは、トランザクションと期間ごとに、個々のサービスとそのサービスのパフォーマンスを表すトレースを収集することができます。

トランザクションを監視して、速度低下の原因となっている期間を特定するのに役立ちますが、多くのタスクで長時間実行される箇所の原因を特定するのは難しい場合があります。

長期間を小さく分割して計測するのではなく、プロファイリングを使用することで必要なコンテキストを提供することができます。

プロファイリングデータがあると、最も頻繁に発生するコールスタックが表示され、最適化すべきコードを教えてくれます。

以下の例では、特定のコールスタックが収集したサンプルの84.3%に、アプリ内関数の最上位がBigTableKVStorage.get_manyで、GCPのビッグテーブルクエリを実行していることがわかります。

詳細を見ると、その関数が定義されている正確なファイルと行番号がわかります。

プロファイリングデータ

さらにデバッグが難しいシナリオとして『一部のデータが抜けているケース』が挙げられます。

一部のデータが抜けているケース

観測できていない箇所を推測する代わりに、プロファイリングはその時間帯に実行されるコードを教えてくれます。

これによって、コードのどこを修正する必要があるかがわかるだけでなく、このプレビューによって、新しく監視する箇所を追加しなくても根本的な原因を見つけることができます。

この例では、観測できていなかった474msまでの間が、Redisクラスタへの接続をしていたことがわかります。

さらに、フレームチャートビューアでは、すべてのスレッドのデータを含むプロファイル全体を表示します。

フレームチャートビューア

トランザクションデータはプロファイリングデータとインラインで表示されるため、その時間に関連する機能をシームレスに関連付けることができます。

フレームチャートの操作方法と解釈方法についての案内を作成しました。

開発者のヴィトール・カリクストはプロファイルを利用して、Azos Segurosの顧客保険金の分割払いサービスのパフォーマンスを向上させています。

ヴィトールは、フレームチャートを使用して、パフォーマンスの問題に関連するプロファイルを掘り下げ、リクエストが遅くなっている原因の関数コールを特定し、迅速に対応しました。

これにより、リクエストの実行時間が大幅に改善されました。

フレームチャートを使って、顧客決済サービス内で最も遅いデータベースリクエストを見つけることができました。
プロファイリングを使用することで、リクエストの実行時間を1000msから300msに短縮することができました。アゾス・セグロス社  Vytor Calixto氏

プロファイリングで改善されるパフォーマンス問題

プロファイリングは、トランザクションデータをグループ化して、共通のパフォーマンス問題を検出するなど、パフォーマンス機能を補うものです。

プロファイリングデータが問題をコードレベルで可視化することによって、検出できることが増えます。

プロファイリング・データを活用する最初の新しい課題タイプは、iOSとAndroidでサポートされるJSON Decoding on Main ThreadImage Decoding on Main Threadの2つです。

プロファイリングデータ

例えば、画像のデコード処理(ファイルの解凍などのこと)をメインスレッドから別スレッドに移動させることで、メインスレッド時間を150ミリ秒程度短縮できたことがわかります。

さらに、UIジャンクの発生やスクロール性能の低下を防ぐこともできます。

今後、バックエンドプラットフォームの課題などを展開する予定です。

描画が重くなったり、フリーズする原因を突き止める

プロファイルがiOSとAndroidのUIフレームビジュアライゼーションに対応し、スローフレームやフリーズフレーム(フレームドロップ)箇所をプロファイリングデータとインラインで表示できるようになりました。

プロファイルがiOSとAndroidのUIフレームビジュアライゼーションに対応

この例では、黄色でハイライトされたGPUの遅いフレームレンダリングが観察され、レンダリングに約121msかかっていることがわかります。

通常、スムーズなUIインタラクションを維持するために、フレームは(60fpsで描画する場合)約16msでレンダリングされることが望ましいとされています。

つまり、このプロファイル内において、ユーザーがスクロール性能の低下やその他のUIジャンクが発生した可能性を表しています。

スローフレームの真下にあるフレームチャートを見ると、スローフレーム121msのうち87ms(72%)が、アプリのMovieDetailViewController.updateColors()関数の呼び出しに費やされていることがすぐにわかります。

そのため、この関数を最適化することで、UIパフォーマンスを大幅に改善し、より良いユーザー体験を提供することができます。

PHPをサポートするようになりました

ベータ版を終え、iOS、Android、Python、Node.jsに加えて、sentry-php、sentry-laravel、sentry-symfony SDKでPHPをサポートするようになりました。

そして、Rubyと.NETをサポート対象とするため、現在開発に取り組んでいます。

今後のリリースにご期待ください!

初日からパフォーマンスのトラブルシューティングを高速化

プロファイリングは、パフォーマンス監視にコードレベルのコンテキストを追加し、問題がどこで、なぜ発生しているのかを把握することができるため、問題に対応し、リソース消費を最適化することができます。

SpiffWorkflowを利用するユーザーにとっては、コードの正確な行を把握できることがトラブルシューティングの高速化に繋がりました。

Sentryを導入する前、SpiffWorkflowの開発者であるケビン・バーネットは、アプリのパフォーマンス問題を分析するために、手動でログを調べて、それらをスプレッドシートを管理していました。

しかし、プロファイリングを利用すれば、パフォーマンスのボトルネックを特定し、対処すれば良いのでずっと楽になりました。

巨大なJSONドキュメントをリレーショナルデータベースに移行した結果、MySQLのトランザクションが遅くなったことを、プロファイリングを利用したことによって、知りました。
Sentryのフレームチャートを使って、トランザクションの特定の部分が重くなっている原因であることを突き止め、問題を迅速に解決しました。 SpiffWorkflow ケビン・バーネット氏

また、プロファイリングを導入して結果が出始めるのに、何日も、何週間も、何ヶ月もかかるわけではありません。

ニュースレターのスタートアップであるParagraph社の創設者であるコリン氏のようなお客様は、プロファイルを導入してから数時間でパフォーマンスの問題を解決し、アプリの速度を向上させています。

getsentryの関数レベルプロファイリングを有効にしたところ、実行に5秒以上かかる超低速な正規表現があることがすぐにわかりました。これを修正したところ、目に見えて速度が大幅に改善されました。 パラグラフ社 コリン・アームストロング

 


プロファイリングデータの取得をすぐに開始するには、まずパフォーマンスモニタリングの設定(わずか5行のコードで可能)を行い、その後SDKを更新するだけです。


 

ここでは、プロファイリングを始めるのに役立ついくつかのサイトをご紹介します。

GitHubTwitterDiscordに公式アカウントがあります。

また、Sentryを初めてお使いになる方は、無料でデモをご利用いただけます

ぜひお気軽にお試しください。

Sentryは、アプリケーションコードの健全性を監視するために不可欠です。エラートラッキングからパフォーマンスモニタリングまで、開発者は、フロントエンドからバックエンドまで、アプリケーションをより明確に把握し、より迅速に解決し、継続的に学習することができます。

Sentryは、世界中の350万人以上の開発者と85,000以上の組織に愛され、Disney、Peloton、Cloudflare、Eventbrite、Slack、Supercell、Rockstar Gamesといった世界的有名企業の多くにコードレベルの監視機能を提供しています。

毎月、世界中で人気のサービスやアプリケーションから、数十億件の例外を処理し続けています。

 


 

IchizokuはSentryと提携し、日本でSentry製品の導入支援、テクニカルサポート、ベストプラクティスの共有を行なっています。Ichizokuが提供するSentryの日本語サイトについてはこちらをご覧ください。またご導入についての相談はこちらのフォームからお気軽にお問い合わせください。

シェアする

Recent Posts