Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アプリ起動時間高速化 ~推測するな、計測せよ~

gree_tech
November 11, 2021

アプリ起動時間高速化 ~推測するな、計測せよ~

GREE Tech Conference 2021 で発表された資料です。
https://techcon.gree.jp/2021/session/Session-11

gree_tech

November 11, 2021
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. REALITY 3 2020 2018 2019 8月 視聴アプリ 「REALITY」リリース 1 0月

    配信アプリ 「REALITY Avatar」リリース 3月 視聴/配信アプリ統合 現在の「REALITY」リリース 4月〜 配信コラボ/ガチャ チャットなど機能拡張が進む 1 2月 新Live配信基盤 低遅延モード配信実装 6月 YouTube視聴やLiveゲームなど Live機能類が拡充 11月 初の海外リリース 海外展開が加速。 2021 8月 ワールド機能のリリース メタバース事業に参入
  2. REALITY 4 Q1 Q2 Q3 Q4 Q1 Q2 Q4 2020

    2021 アクティブ配信者数 国内 15% 海外 85% ユーザ分布
  3. REALITY 5 Q1 Q2 Q3 Q4 Q1 Q2 Q4 2020

    2021 アクティブ配信者数 国内 15% 海外 85% ユーザ分布 絶好調!?
  4. 1. 障害原因の調査、改善、それを継続して行う仕組みづくり 1. スケーラブルなシステムの構築 サービスの成長に合わせた利用ツールや環境構築方法の選定 WebAPIの設計見直しによるリクエスト数の削減 1. 高速化 サーバのスループット改善 レスポンス速度向上

    1. 自動化 定常運用業務の自動化(Web, Nativeアプリ, Libraryのリリース作業など)による作業コスト削減 同様にヒューマンエラーの抑止 1. その他テスト文化の普及推進、定期的な進捗確認 REALITY SRE 8
  5. 半期に数件実施 エンジニアが企画・進行を担当し、仕様書作成や効果測定までを行う 品質改善プロジェクト 9 FY21上期終わりなき挑戦プロジェクト - 配信中フリーズ改善 - アセットバンドルロード時間改善 -

    音声の安定化 - 端末発熱改善 FY21下期品質改善プロジェクト - エコーキャンセル - エラーハンドリング改善 - 起動時間短縮 - 見かけ上のUX改善 FY22上期品質改善プロジェクト(WIP) - 通信速度向上のためのProtobuf対応 - 不正ユーザ対策 - メタバースに向けたアバター描画軽量化 - US通信速度改善 改善Week(半期ごと3回) - DevOps改善 - コードリファクタ
  6. 品質改善プロジェクト 10 FY21上期終わりなき挑戦プロジェクト - 配信中フリーズ改善 - アセットバンドルロード時間改善 - 音声の安定化 -

    端末発熱改善 FY21下期品質改善プロジェクト - エコーキャンセル - エラーハンドリング改善 - 起動時間短縮 - 見かけ上のUX改善 FY22上期品質改善プロジェクト(WIP) - 通信速度向上のためのProtobuf対応 - 不正ユーザ対策 - メタバースに向けたアバター描画軽量化 - US通信速度改善 改善Week(半期ごと3回) - DevOps改善 - コードリファクタ 半期に数件実施 エンジニアが企画・進行を担当し、仕様書作成や効果測定までを行う
  7. 半期に数件実施 エンジニアがPMを担当し、エンジニアが仕様書作成や効果測定までを行う 品質改善プロジェクト 11 FY21上期終わりなき挑戦プロジェクト - 配信中フリーズ改善 - アセットバンドルロード時間改善 -

    音声の安定化 - 端末発熱改善 FY21下期品質改善プロジェクト - エコーキャンセル - エラーハンドリング改善 - 起動時間短縮 - 見かけ上のUX改善 FY22上期品質改善プロジェクト(WIP) - 通信速度向上のためのProtobuf対応 - 不正ユーザ対策 - メタバースに向けたアバター描画軽量化 - US通信速度改善 改善Week(半期ごと3回) - DevOps改善 - コードリファクタ
  8. 品質改善プロジェクト 12 FY21上期終わりなき挑戦プロジェクト - 配信中フリーズ改善 - アセットバンドルロード時間改善 - 音声の安定化 -

    端末発熱改善 FY21下期品質改善プロジェクト - エコーキャンセル - エラーハンドリング改善 - 見かけ上のUX改善 FY22上期品質改善プロジェクト(WIP) - 通信速度向上のためのProtobuf対応 - 不正ユーザ対策 - メタバースに向けたアバター描画軽量化 - US通信速度改善 改善Week(半期ごと3回) - DevOps改善 - コードリファクタ 半期に数件実施 エンジニアがPMを担当し、エンジニアが仕様書作成や効果測定までを行う - 起動時間短縮
  9. プロジェクトの進行 15 1. 計測 アプリ起動処理の全体像の把握 問題箇所に目星を付け、対応項目別に優先度整理する 2. 実装 3. リリース後の計測・運用

    それぞれの項目別に調査・改善する 本番環境で実際に改善されているか確認する 継続的に監視できる基盤を整える
  10. プロジェクトの進行 16 1. 計測 アプリ起動処理の全体像の把握 問題箇所に目星を付け、対応項目別に優先度整理する 2. 実装 3. リリース後の計測・運用

    それぞれの項目別に調査・改善する 本番環境で実際に改善されているか確認する 継続的に監視できる基盤を整える
  11. REALITYはNativeアプリにUnityを ライブラリとして含む構成 -> 「Unityライブラリ初期化がボ トルネックかな?」 プロジェクト開始前の見立て 17 推測 Native Unity

    iOS アプリ起動時に初期化 -> 起動処理のボトルネックと推測 Android Unity画面起動時に初期化 -> なんらか起動処理の遅延に影響と推測 ※Unityライブラリ初期化について
  12. XCode:Instruments (Time Profiler, Signposts) iOSの起動シーケンスを確認 19 認証API ログインAPI Unity初期化 配信一覧取得

    アプリ起動処理の全体像の把握:iOS 認証API ログインAPI Unity初期化 配信一覧取得
  13. 20 アプリ起動処理 library(dlib)初期化等 重い。。。 認証API ログインAPI Unity初期化 配信一覧取得 XCode:Instruments (Time

    Profiler, Signposts) iOSの起動シーケンスを確認 アプリ起動処理の全体像の把握:iOS 認証API ログインAPI Unity初期化 配信一覧取得 重い?妥当? 要調査 遅い
  14. GCP:Cloud Trace • GCPの分散トレーシングシステム • ボトルネックの検出 • レイテンシ分布の可視化 28 改善前配信一覧取得APIのトレース

    • 処理のタイムシーケンスを可視化 • ボトルネックの可視化 並列化 できない? 不必要な処理が多い アプリ起動処理の全体像の把握:サーバ処理
  15. 1. [client] アプリの起動処理改善 Android最適化 : App Startup導入、キャッシュ改善など iOS最適化:謎のblankを削除、library初期化処理改善など 1. [server]

    配信一覧取得API高速化 並列処理、ボトルネック改善にて対応 1. [client] UnityLibrary初期化改善 (optional) 調査を行い、現実的な規模の改修で時間を短縮できれば改善を入れる 空シーン起動など 対応優先度を決定 29
  16. プロジェクトの進行 30 1. 計測 アプリ起動処理の全体像の把握 問題箇所に目星を付け、対応項目別に優先度整理する 2. 実装 3. リリース後の計測・運用

    それぞれの項目別に調査・改善する 本番環境で実際に改善されているか確認する 継続的に監視できる基盤を整える
  17. 34 起動処理のボトルネック検出手法 Jetpack Macro Benchmark • テストを実行する形で起動時間を計測可能 • cold/warm/hot start

    の計測 • テスト結果をトレースファイルとして閲覧 • Android 10(API 29)以上で利用可能 logcat • スタックトレースやシステムメッセージのログをダンプする コマンドラインツール • 起動処理のスタックトレースを細かく取れる
  18. 36 Androidの起動処理計測の例 Application onCreate Activity init Activity onCreate その他 inflate

    views etc アカウント認証 ログイン処理 etc 画面の生成 コンテンツ表示
  19. 37 Androidの起動処理計測の例 Application onCreate Activity init Activity onCreate その他 inflate

    views etc アカウント認証 ログイン処理 etc Displayed time Fully Drawn time
  20. 42 認証API ログインAPI Unity初期化 配信一覧取得 XCode:Instruments (Time Profiler, Signposts) iOSの起動シーケンスを確認

    アプリ起動処理の全体像の把握:iOS 認証API ログインAPI Unity初期化 配信一覧取得 今回細かく見たいのはここ
  21. 43 Androidの起動処理 Application onCreate Activity init Activity onCreate その他 inflate

    views etc アカウント認証 ログイン処理 etc Displayed time Fully Drawn time ここのボトルネックを探す
  22. 44 Androidの起動処理 Application onCreate Activity init Activity onCreate その他 inflate

    views etc アカウント認証 ログイン処理 etc Displayed time Fully Drawn time より細かく調べていく
  23. 45 Androidの起動処理 Application onCreate Activity init Activity onCreate その他 inflate

    views etc アカウント認証 ログイン処理 etc Displayed time Fully Drawn time より細かく調べていく
  24. 配信一覧取得APIの特徴 • View初期化のためアプリ起動処理に使用 • レイテンシがUXに直結 大まかな処理 • 最初の画面すべてのコンテンツを生成して返す • フォロータブ

    • おすすめタブ • … etc (計7タブ) • それぞれのタブをソートなど(パーソナライズ) • 配信リスト • 相互フォローリスト • ゲームリスト • … etc 配信一覧取得APIの高速化 58
  25. GCP:Cloud Trace • GCPの分散トレーシングシステム • ボトルネックの検出 • レイテンシ分布の可視化 59 改善前配信一覧取得APIのトレース

    • 処理のタイムシーケンスを可視化 • ボトルネックの可視化 並列化 できない? 不必要な処理が多い 配信一覧取得APIの高速化
  26. もともと配信一覧アイコンは 1024×1024 のpngを使用 • 256×256 のwebpに変換し軽量化 • サイズを 96~99 %

    程度カット Clientのクラッシュ率低下、CDN費用削減の副次効果も 画像読み込み高速化 68 https://developers.google.com/speed/webp
  27. 70 改善前の起動時間 全世界 日本 iOS 6.2 秒 5.2 秒 Android

    6.5 秒 4.2 秒 ユーザ環境における起動時間の中央値(2021/03)
  28. プロジェクトの進行 72 1. 計測 アプリ起動処理の全体像の把握 問題箇所に目星を付け、対応項目別に優先度整理する 2. 実装 3. リリース後の計測・運用

    それぞれの項目別に調査・改善する 本番環境で実際に改善されているか確認する 継続的に監視できる基盤を整える
  29. まとめ 起動時間短縮は泥臭い作業の積み上げにより実現 • 並列化、キャッシュ、処理の削減(遅延)など 本プロジェクトでは、計測により • 想定とは異なるボトルネックの存在確認 • 継続的に監視できる基盤を作成 計測・監視はパフォーマンス改善や不具合の早期検知をするためには必要

    「問題が生じてからログを入れる」のではなく、常日頃から「監視できる 仕組みを作る」ことが望ましい 81 本事例では、 「品質改善プロジェクト」として エンジニア主体で進行できたのが良 かったかな感
  30. 84