Facebookのパフォーマンストレーサー「Profilo」がリリース。開発秘話を聞いてみた。

facebookのフィード
ENGINEER

世界中で何十億人ものユーザーに使用されているFacebookのモバイルアプリ。その高品質な快適さを担保するのは、応答性とスムーズな動きです。とりわけ迅速かつ効率的に解決する必要があると考えているのが、パフォーマンスの問題です。

こうした問題を解決するため、同社はProfiloというパフォーマンストレーシングライブラリをオープンソースとして発表しました。

Profiloはなぜ開発されたのか

モバイルパフォーマンスについての取り組み

Facebookのエンジニアリングチームは、フレームワークやツールを使用してモバイルアプリのパフォーマンスをモニターするように推奨されています。つまり、中央集中型レポート、データパイプライン管理、集合体データのためのツールなどの新機能によって、たった数行のコードでテレメトリングによって得られた情報を集めることができるのです。

モバイルパフォーマンスについての取り組みのうちで重要なのが、リグレッションをモニターし経時変化を探るアビリティです。パフォーマンスの経時変化をチェックすることができるツールをはじめて開発したとき、アプリがどのように動作するのかを把握し、解決可能な問題をいくつも発見することができました。しかし同時に、パフォーマンストラッキングについていかに無知だったかということも明らかになりました。すぐに突き止められなかった問題については、調査が非常に困難だったのです。全体的にメトリックが退行していることはわかりましたが、その理由がわかりませんでした。

テストと現実の違いからみえる課題

さらに、テストではなく現実の世界で確認されたパフォーマンスのコンディションとシステム挙動の変化は、もっとも時間がかかる、やっかいな課題でした。

初期段階では、単純なワークフローに従って回帰テストをおこなっていました。ベータリリースやプロダクションリリースでリグレッションを発見すると、ただちにそれを分離するための実験や構成を模索します。しかし、すべてのリグレッションについて簡単にサーバー主導の構成で対処できるわけではないので、そのような場合はモニタリングテレメトリーに没頭することになります。

残念ながらこうした難しい問題を診断するにはCPU時間などの持続期間のデータを集めるだけでは不十分で、プロファイラー(Systraceなどのローカルツール)を使用してリグレッションをローカルに再現し、根本的な原因を特定するしかありません。

多くの調査を停滞させたのがこの最後のステップです。特に、モバイルデバイスラボでは簡単に再現できない、少数のデバイスだけが減速しているような異常値のリグレッションを発見した場合には、調査の停滞が顕著でした。こうしたデバイスやシステムの状態をローカルに再現することができなかったことにより、ターンアラウンドタイムが長くなり、設定の変更やコードの確認にとても手間がかかりました。

そして、問題を解決してパフォーマンスを向上させるためには、モバイルアプリからより詳細なテレメトリーを収集して分析するツールを作ることが必要であることに気づいたのです。

オープンソースとして公開した理由

こうした課題のために開発されたのが、ハイスループットなAndroidライブラリ、Profiloです。より多くのモバイルエンジニアがパフォーマンスのトレースを効果的におこない、よりよいワークフローと分析システムを構築できるようになってほしいという考えから、Profiloはオープンソースとして公開されています

Profiloとは

 

Profiloはどのように機能するのか

Profiloは、アプリをさまざまな側面から測定する複数のソースからのデータストリームを効果的に管理するための基盤を提供します。これにより、インタラクションが測定されているあいだにアプリとシステムの重要な部分を再構築することができます。ハイスループットに焦点を当てることによって、インタラクションの混乱やゆがみを最小限に抑えながら、毎秒3000件以上の速度でテレメトリーを収集することを可能にしました。

また、ユーザーのアプリに負担をかけることなく特定のデバイスからのテレメトリーを収集することができる、強力な構築システムも提供しています。チームがリモートでトレース設定を変更できるようにすることで、重要なワークフローを可能にしました。オンデマンドでA/Bテストのサンプル数を上げたり、リグレッションをデバッグする際にオーバーヘッドが大きいデータプロバイダを使用したり、ニーズが発展するにつれてトレースボリュームとコンテンツを全体的に微調整する、などがその例として上げられます。

Profiloは、数ミリ秒のCPU時間のようなリグレッションの根本原因を理解するための精密さによって、パフォーマンスリグレッションのターンアラウンドタイムを大幅に改善しています。豊富なテレメトリーストリームを収集することで、新しいタイプの因果関係分析や「スクロールの流動性」や「アプリのレスポンシブネス」などのメトリクスのより正確な理解を実現しているのです。

Profiloが開発される以前、アプリのコールドスタートは理解して維持するのが非常に難しいメトリックでした。サブセクションの長さについてはだいたい察しがついていましたが、リグレッションは根本的な原因とトリアージに長い時間を要し、何ヶ月も未解決のままになることもあったのです。

トレースによる豊富なテレメトリーは、リリースからリリースまでのCPUスタックトレースを集計して比較するためのツールを構築し、その特定のリグレッションタイプの根本原因分析を一時間もかからずに実行することを可能にしました。他のテレメトリーストリームにより、多くのコードがロードされたり、頻繁にパスが遅くなるなど、さまざまなタイプのリグレッションに取り組むことができます。

Profiloのユニークな機能

Profiloのユニークな機能のうちのひとつは、カスタムJavaスタックアンワインダーです。Profiloは、VM構造を理解して正式なJava APIを使用せずにスタックトレースを収集することを、はじめて可能にしたAndroidのパフォーマンスライブラリなのではないでしょうか。

Profilo自体の内部にアンワインダーを実装することにより互換性を犠牲にして、トレースデータ自体の中でクラスや関数名を使用しない、より効果的なスタックトレースを作成する機能を得ました。また、実際のCPU使用率のスタックトレース(CPU時間に関してスタックトレースをおこなうものであり、経過時間ではない)を収集する機能も得ています。

仮想マシンとAndroidフレームワークがわれわれに代わっておこなうことをよりよく理解するために、プロダクションでの「systrace」テレメトリー(より正確にはアプリの「atrace」用法)をキャプチャする方法も開発しました。これにより、ガベージコレクションや他のVM固有のイベント、またそれらがアプリにおよぼす影響を調べることができます。たとえば、UIスレッド上の意図しない入出力操作の原因、アプリの重要な部分のまれなロック競合などです。

function-image

上の画像では、インタラクション中に実行されるガベージコレクションのタイプの変更を集計していることがわかります。この変化は継続時間ではなく頻度がほとんどですが、平均的に「partial」から「sticky」まで約1000分の15秒以内でシフトします。

テレメトリーストリームによって、モバイルアプリのリグレッション検出とパフォーマンス分析についての考えかたが変わりました。リソース使用率(CPU時間)の大部分を説明するための綿密なテレメトリーを作り、VMとの関係をより深く理解し、「アプリのレスポンシブネス」などのハードパフォーマンスメトリクスの複雑で新しい分析を可能にしたのです。

おわりに

Facebookはオープンソースのリリースの一環として、トレースを扱うためのベーシックなツールと、ワークフローの感覚をつかむためのサンプル解析もいくつかリリースしています。同社がモバイルのパフォーマンスをより扱いやすい課題にするために、これらのアイデアやツールをどのようにいかすのか、今後の動きが注目されます。

(翻訳:Asuka Nakajima)

SHARE

  • 広告主募集
  • ライター・編集者募集
  • WorkshipSPACE
週2日20万円以上のお仕事多数
Workship