Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

Share

ニコニコを支える Erlang / Elixir

Download to read offline

〜 大規模運用して初めて見えたアレやコレ

(Elixir conf 2017発表資料)

ニコナレが終わるのでこっちに退避。
オリジナル: https://niconare.nicovideo.jp/watch/kn2397

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

ニコニコを支える Erlang / Elixir

  1. 1. ニコニコを支える Erlang / Elixir 質問 → #elixirjp
  2. 2. はら @kojingharang ドワンゴ 基盤開発本部 コンテンツ配信基盤開発部 先端サービス基盤セクション セクションマネージャ 略歴 S社 JPEG2000, ProRes 等のコーデック実装 on Cell/B.E. G社 Blink Web IDL compiler D社 ニコキャス iOS アプリ, DMC TopCoder maximum rating 1754 自己紹介
  3. 3. 第一部 ニコニコとDMC
  4. 4. コンテンツ配信システムを作っています
  5. 5. ニコ動, ニコ生の全体構成
  6. 6. サーバ製品を頑張って10年運用してきたが 規模がデカくなりいろいろしんどくなってきた 〜 これまでのあらすじ 〜 スケール リソース融通
  7. 7. 〜 これまでのあらすじ 〜 世の中いろいろ変わったし そろそろ新サービス出したいし → 理想的なコンテンツ配信システムを作ろう ! スマホ 脱Flash 映像合成
  8. 8. Erlang 2,400 ファイル, 55 万行 C++ 400 ファイル, 6万行 Rust 120 ファイル, 2万行 開発者 20 人 インフラ 4 人 サーバ たくさん DMC の規模
  9. 9. ニコ動の新規投稿動画すべて + ニコ生の一部 を DMC で実現 稼働状況
  10. 10. ニコ動の新規投稿動画すべて + ニコ生の一部 を DMC で実現 すこぶる安定して動いています 1台で同時数千動画配信 Erlang VM すごい 稼働状況
  11. 11. 第二部 DMC開発の舞台裏
  12. 12. 2014/12 プロジェクトスタート ( 2014/12 高橋みなみAKB卒業発表 )
  13. 13. まず要求分析 自分ならどう作るか、 考えながら聞いてみてください !
  14. 14. ニコ動, ニコ生の基本機能が一通り実現できる 投稿, 配信, 高中低画質トランスコード, タイムシフト記録, 視聴, ... 様々なコンテンツを統一的に扱える 柔軟な映像合成ができる 要求
  15. 15. スケールする リソースの有効活用 動画と生放送が同一ノードで配信できるとか オフピーク時間帯は高画質視聴できるとか 要求
  16. 16. 2015/1〜 設計 / 実装
  17. 17. 様々なコンテンツを統一的に扱えるように 「レシピ」を設計した
  18. 18. レシピ = データフローを抽象化したグラフ構造
  19. 19. レシピの形式的定義 600行のテキスト DMCの全てが書かれている
  20. 20. 利用者が書いたレシピを解釈実行する DMC の基本動作
  21. 21. API
  22. 22. レシピ(JSON or XML)の 登録, 変更, 削除を受け付ける API
  23. 23. 保守が面倒なので めっちゃ自動化した!!!!! API
  24. 24. レシピ定義からいろいろ全自動生成 ● C++/Erlang モデル ● XML/JSON と C++/Erlangモデルの変換器 ● C++/Erlang モデルの部分更新処理コード ● C++ モデルの Lua binder ● Validator, getElementById みたいなユーティリティ ● Doc 生成物は 6 万行くらい API
  25. 25. レシピの仕様を変更したければ 定義を変更して make するだけ API
  26. 26. レシピの仕様を変更したければ 定義を変更して make するだけ 完全勝利 API
  27. 27. レシピの仕様を変更したければ 定義を変更して make するだけ 完全勝利 完全勝利 完全勝利 API
  28. 28. レシピの仕様を変更したければ 定義を変更して make するだけ 完全勝利 完全勝利 完全勝利 API
  29. 29. リソースの有効活用
  30. 30. 処理を抽象化した「タスクグラフ」を定義 生放送 動画
  31. 31. 録画 旧システムへの送出 放送 受付 トランス コード 配信 投稿 受付 トランス コード 配信 処理を抽象化した「タスクグラフ」を定義 生放送 動画
  32. 32. Assign 関数がタスクグラフをクラスタに割り当てる Assign : G, C -> G’
  33. 33. Assign 関数がタスクグラフをクラスタに割り当てる Assign : G, C -> G’ G タスクグラフ C クラスタ状態 G’ 割り当て済みのタスクグラフ
  34. 34. 詳細設計, 実装 OTP を素直に使う ハマりポイント supervisor にメッセージを送りすぎてボトルネックになったり 互いに gen_server:call してデッドロックしたり テストは eunit, ct
  35. 35. 中間まとめ 大規模システムではグランドデザインが超大事
  36. 36. ElixirConf だった
  37. 37. Elixirで作った周辺システム のご紹介
  38. 38. DMC gateway DMC 旧配信 システム DMC gateway 同じインターフェース Elixir で書いた
  39. 39. ● Elixir, Erlang 初めてのエンジニア1人で3ヶ月程度 ● Elixirのここが良い ○ 変数への再束縛ができるので、var1, var2, var3 と書かなくていい ○ 特別にハマることがなくerlangライブラリも利用できた ○ ExUnitによる単体テスト → DocTestができるのは結構便利 ○ (漠然とした印象になるが) Erlangよりは書きやすい印象 ○ RPM生成もErlangより楽かもしれない (exrm-rpmと言うドンピシャのも のがある) DMC gateway
  40. 40. DMC gateway ● 大変だったところ ○ ErlangとElixir両方を触ってるとatomや変数の書き方などで混乱する ○ パイプ演算子に手こずった
  41. 41. 本当にあった怖い話
  42. 42. レビューはしてるんだけど テストもしてるんだけど 大規模運用してると いろんなことが あるんだなぁ み○を
  43. 43. binaryがGCされない リリース前の性能試験中に ErlangVM が OOM Killer で殺された erlang:garbage_collect/0 を比較的こまめに呼ぶことで解決
  44. 44. Shared heap Process private heap ProcBin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin Refc bin ProcBin ProcBin ProcBin ProcBin ProcBin ProcBin ProcBin ProcBin ProcBin こっちは余裕なので GCされない 容量オーバー! 1つ1つがデカい
  45. 45. ある機能の deploy 後、1 時間に 2GB 程度メモリリーク もともと緩やかにリークしてたことが判明 再現コードを書いていろいろ試行錯誤した結果、 %% close/1 時に未送信データのフラッシュを行わない inet:setopts(Socket, [{linger, {false, 0}}]) で直った TCPセッションがリークする
  46. 46. 動画視聴プロセスが終了 → monitor 元に DOWN が飛ぶ → 動画や生放送の視聴カウンタが減る という処理がある 稀にリモートノードの視聴プロセスが終了しても DOWN が来ず 視聴カウンタが減らないことがあった 書いたコードを良く見てみたが使い方は正しそう monitor したプロセスが死んでも DOWN がこない
  47. 47. 結局、そういうこともあるという前提で monitor_with_polling 関数を書いて解決 :( monitor したプロセスが死んでも DOWN がこない
  48. 48. まとめ
  49. 49. 開発手法
  50. 50. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者
  51. 51. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が !
  52. 52. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が ! 「なるはや」案件がいっぱい
  53. 53. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が ! 「なるはや」案件がいっぱい 優先度がころころ変わる
  54. 54. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が ! 「なるはや」案件がいっぱい 優先度がころころ変わる 口頭のやり取りでいろいろ決まる
  55. 55. 開発プロセス(当初) ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が ! 「なるはや」案件がいっぱい 優先度がころころ変わる 口頭のやり取りでいろいろ決まる 隠れ要求の発覚 → 手戻り
  56. 56. ニコ生, ニコ動, PC, スマホ, ゲーム機, TVなど多くの関係者 各チームからいろんな要求が ! 「なるはや」案件がいっぱい 優先度がころころ変わる 口頭のやり取りでいろいろ決まる 隠れ要求の発覚 → 手戻り 開発プロセス(当初)
  57. 57. 今は余裕 開発プロセス(今)
  58. 58. モデル化, 自動化 なぜ余裕ができたか?
  59. 59. キューの様子を 他チームに公開する なぜ余裕ができたか? 要求 要求 要求 要求 要求 開発チームが 処理 要求 要求要求 要求 要求 要求 優先度付きキュー
  60. 60. プロジェクトごとに状態をdocで管理 要求fix → 設計完了 → 実装完了 → 開発環境で提供 → 本番環境で提供 → 運用開始 docを見ると次にやることが分かる docに書いてないことはやらない プロジェクト主担当は要求分析からデプロイまで全行程をやる →カオス度減 & スキルアップ & 楽しい ! なぜ余裕ができたか?
  61. 61. 開発プロセス(今) 40プロジェクトのスケジュールをスクリプトで自動生成 Assign : プロジェクト情報, メンバー情報 → スケジュール 「この件はいつ着手できる予定だよ」と即答できる ガントチャート?
  62. 62. 自動生成された開発スケジュール
  63. 63. 便利ツール類もちゃんと時間を取って作る
  64. 64. リポジトリ名 クラスタ状態把握ツール レシピ可視化ツール エラーログの集計ツール 便利ツール類もちゃんと時間を取って作る

〜 大規模運用して初めて見えたアレやコレ (Elixir conf 2017発表資料) ニコナレが終わるのでこっちに退避。 オリジナル: https://niconare.nicovideo.jp/watch/kn2397

Views

Total views

1,791

On Slideshare

0

From embeds

0

Number of embeds

1,592

Actions

Downloads

1

Shares

0

Comments

0

Likes

0

×