Slide 1

Slide 1 text

エンジニア 稲田修也 2021/05/14 TECH STAND #4 常時接続SNS ~ライブ配信基盤を支える技術 ~ LIVEの負荷対策と監視について

Slide 2

Slide 2 text

stand.fmの紹介


Slide 3

Slide 3 text

stand.fm


Slide 4

Slide 4 text

stand.fm
 LIVEで気軽に楽しく配信
 アイテムやハートをもらったり、
 リアルタイムでリスナーとコミュニケーションをし ながら配信できます。 
 リスナーをゲストに招待して最大5人で 
 一緒に配信する事も可能です。 
 
 ※ゲストで参加できるのは現在iOSアプリのみです 


Slide 5

Slide 5 text

自己紹介
 - Shuya Inada @inatonix 
 
 - 研究したいと思ってたのに気付いたらスタートアップ沼にズブズブ 
 
 - 3年くらい起業して放浪して現職 
 
 


Slide 6

Slide 6 text

負荷対策 and 監視


Slide 7

Slide 7 text

負荷対策


Slide 8

Slide 8 text

負荷??
 Live配信
 App (Host Speaker) CDN HLS Proxy WebSocket
 サーバー RTMP App (Guest Speaker) シグナリング サーバー


Slide 9

Slide 9 text

負荷??
 Live配信
 App (Host Speaker) RTMP App (Guest Speaker) シグナリング サーバー
 App (Listener)

Slide 10

Slide 10 text

負荷??
 Live配信
 App (Host Speaker) RTMP App (Guest Speaker) シグナリング サーバー
 App (Listener) ここの負担が大きい 


Slide 11

Slide 11 text

課題意識
 課題:音声ストリームをまとめてアップロードする分、ホストスピーカーの端末負荷が大きい 
 
 - 端末が重くなると、音声のアップロードが滞る 
 
 - 画面が固まってコラボ相手を選ぶなどの各種操作に支障をきたす 


Slide 12

Slide 12 text

対策
 負荷試験して計測して1つ1つ改善 


Slide 13

Slide 13 text

対策
 負荷試験して計測して1つ1つ改善 
 めっちゃ地道


Slide 14

Slide 14 text

負荷試験
 Harvest(社内ツール) 
 
 liveIdを指定するとlocustという負荷試験ライブラリが 
 k8s上で動いて、ライブに大量リクエストを飛ばす 
 
 locustはpythonでテストケースが記述できるのでXML形式で書く ものなどより柔軟
 複数コンテナで連携して動かすためのhelmも用意されてる 
 
 ※負荷対策を施す前の動画 
 - リクエストが大量に飛んでくるとJSスレッドのfpsがどんどん下がる 20くらいを下回り始めると、リクエストを 捌ききれなくなってくる 
 
 - さらに大量に飛んでくると、UIスレッドのfpsも落ちていって画面が固まり始める 


Slide 15

Slide 15 text

計測
 React Dev tools
 
 Reactのコンポーネントのレンダリング状況 などを可視化できる 
 
 
 負荷試験をしながら、こちらのツールを使っ て不必要にレンダリングされているものをあ ぶり出していく
 ※ locustにはデフォルトでエンドポイントごとのレスポンスタイムが計測できるダッシュボードがついているが、今回 locustから送っているリクエストはwebsocket通信のもののみで、今回のケースだと使用できなさそうでした 


Slide 16

Slide 16 text

修正
 計測フェーズで炙り出した無駄なレンダリング を、1つ1つ削っていく 
 
 
 具体的には、リスナーの数を更新するタイミン グで、コメント欄などの関係ないコンポーネン トも再レンダリングされていたりしたのでそう いう修正を積んでいく 


Slide 17

Slide 17 text

監視


Slide 18

Slide 18 text

課題
 - 「たまに落ちるな...」
 
 - 「たまに音聞こえなくない?...」 
 
 課題意識: リアルタイム複数人同時配信サービスでのエラーの検知が難しい 
 
 理由: 手元では気付きづらいケースが多い(音声インターフェイス、ネットワーク環境、状態遷移...) 


Slide 19

Slide 19 text

課題
 どれくらいの頻度でその現象が発生しているのか捕捉できていない 
 
 
 → あるリリースがきっかけでその不具合が増えていても分かりづらい 
 
 → 「たまたまユーザのネットワークが悪かっただけではないか、、」という邪念がちらつく 
 
 → 実際には少なくないユーザが不具合を被っていても対応が遅れる 


Slide 20

Slide 20 text

実際の監視
 1. 各問題のボリュームを把握する 
 
 - 「Liveの失敗」の分類 
 - Liveが接続終了してしまった 
 - Liveの音声が一定時間聞こえなくなった 
 
 - それぞれの「失敗」の原因点で分類 
 - webRTCが悪そう?
 - メディアサーバ (wowza)が悪そう? 
 - playerが悪そう?
 
 - 失敗の中でも分類
 - 最初から最後までずっと聞こえない 
 - 途中で一瞬聞こえなくなる 
 - 入った直後だけ聞こえない 
 - 配信者同士は会話できているがリスナーに聞こえない 
 - ホストの声だけ全員に聞こえない 
 - 特定のリスナーだけ聞こえない 
 - etc...
 Live配信
 App (Host Speaker) RTMP App (Guest Speaker) App (Listener)

Slide 21

Slide 21 text

実際の監視
 2. 原因を探るためのログ・メトリクス収集 
 
 - live/userに紐づく全体的な行動ログ 
 - backgroundにいった? 
 - AudioSessionの設定が変わった? 
 - ...etc
 - パフォーマンスメトリクス 
 - cpu usage / fps
 - network latency
 - その他エラー発生メトリクスも 
 


Slide 22

Slide 22 text

実際の監視
 3. 1つ1つのliveログを追いながら仮説を増やす 
 
 - この時音声では「アラームが鳴った」と言っていた 
 - この時networkの速度がガクッと下がっていた 
 - この時Live画面のあるモーダルを開いていた 
 - etc…
 
 1で分類した中で、同じ事象が発生してそうなLiveをまとめて複数サンプル照らし合わせたりしています 
 
 
 例:通話などのインタラプションが入るとAudioSessionを一時的に変える設定が入っていたが、コラボライブ中に それを起こされるとソロライブと同様のAudioSession設定に戻ってしまって、ホストの声しか聞こえなくなる 
 


Slide 23

Slide 23 text

まとめ
 - 地道だが、負荷を疑似的にかけて・計測して・コードと照らし合わせて修正していく作業が負荷対策を進 める上でとても効く
 
 - 地道だが、エラーが発生してそうなLiveの音源を聞きまくると事象を良く把握できて、LIVEモニタリング体 制を強化する上でとても効く 
 
 - 1つのエラー発生事象だけからログを見て修正できることは多くなく、まずはボリュームの監視を入れてエ ラーサンプルが複数ある状態で細かい行動ログを追っていくと原因判明することが多くな 
 った(はず)
 
 


Slide 24

Slide 24 text

We are hiring! エンジニア積極的に募集中です https://corp.stand.fm/recruit 詳細はこちら ● CTO候補 ● VPoE候補 ● クライアントエンジニア ● バックエンドエンジニア ● 機械学習エンジニア ● 配信基盤エンジニア ● QAエンジニア ● エンジニアリングマネージャー ● UI/UXデザイナー 積極募集しているプロダクト開発メンバー

Slide 25

Slide 25 text

No content