$30 off During Our Annual Pro Sale. View Details »

CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~

CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~

CEDEC 2021 の講演資料です。
ノートに講演で話した内容をそのまま記載ありますので、
講演内容を完全に把握したい方はダウンロードしての閲覧をお勧めします。

株式会社セガ 開発技術部 山田英伸/竹原涼

SEGADevTech

July 15, 2022
Tweet

More Decks by SEGADevTech

Other Decks in Programming

Transcript

  1. ダウンロード時間を⼤幅減︕
    〜⼤量のアセットをさばく⾼速な実装と運⽤事例の共有〜

    View Slide

  2. © SEGA
    ゲームコンテンツ&サービス事業本部 技術本部 開発技術部
    ⽵原 涼
    ⾃⼰紹介
    【登壇歴】
    CEDEC 2020 「技術同⼈作家になろう 〜働き⽅改⾰時代におけるエン
    ジニアのレベルアップの⼀例〜」
    Unite Tokyo 2019 「⼤量のアセットも怖くない︕〜HTTP/2による⾼
    速な通信の実装例〜」
    CEDEC 2018、CEDEC 2016、CEDEC 2015 プロダクション関連のラ
    ウンドテーブル
    GDC2016 報告会 「GDC16にみる⾃動化技術とテストのトレンド」
    祝・HTTP/3 RFC発⾏(間近)︕

    View Slide

  3. © SEGA
    ゲームコンテンツ&サービス事業本部 技術本部 開発技術部
    ⼭⽥ 英伸
    ⾃⼰紹介
    【登壇歴】
    CEDEC 2020
    「技術同⼈作家になろう
    〜働き⽅改⾰時代におけるエンジニアのレベルアップの⼀例〜」
    Unite Tokyo 2019
    「⼤量のアセットも怖くない
    〜HTTP/2による⾼速な通信の実装例〜」

    View Slide

  4. © SEGA
    • 本講演内容の撮影、SNS投稿は OK
    • 後⽇、CEDIL で資料を公開
    • 講演中の質疑が可能です。
    コメントに書き込んでください
    • 資料に記載されている会社名、システム名、製品名、サービス名は各社の登録商標または商標です
    • Android ロボットは、Google が作成および提供している作品から複製または変更したものであり、
    クリエイティブ・コモンズ表⽰ 3.0 ライセンスに記載された条件に従って使⽤しています

    View Slide

  5. © SEGA
    • CDN に配置したアセットを端末にダウンロード
    • HTTP/1.1 と HTTP/2 の差に注⽬
    効果を先にお⾒せします

    View Slide

  6. © SEGA
    • HTTP/2 なら接続数が少なくても、
    HTTP/1.1 より圧倒的に早い (待ち時間短縮)
    HTTP/2による効果
    プロトコル 速度 完了までの時間 備考
    HTTP/2 約 280 Mbps 約 3.6 s 1 Connection
    HTTP/1.1 約 110 Mbps 約 9.2 s 6 Connection
    HTTP/1.1 約 59 Mbps 約 17.2 s 3 Connection
    諸条件
    Pixel3 (Android10) 使用
    AWS CloudFront 使用(国内リージョン)
    総数 2000 ファイル / 1ファイル64KB
    ※ 300-340Mbps が出る回線にて Wi-Fi 接続状態

    View Slide

  7. © SEGA
    • ゲーム開発者向け HTTP/2 仕様の説明
    • HTTP/2 を使うための実装について
    • HTTP/2 導⼊時の勘所
    • HTTP/2 トラブル集
    • HTTP/2 の採⽤によるインターネット全体への波及効果
    • まとめ
    本講演の流れ

    View Slide

  8. © SEGA
    ゲーム開発者のための HTTP/2

    View Slide

  9. © SEGA
    • HTTP/2 2015年 標準化完了&公開
    – HTTP/1.1 を基本的に継承
    • 現在の普及率 約45.6% (w3techs.com 2021/06時点)
    ゲーム開発者のための HTTP/2

    View Slide

  10. © SEGA
    • 多重化
    • HPACK
    • バイナリフレーム
    (ゲームと関連性の深いものに限定)
    HTTP/2 の仕様

    View Slide

  11. © SEGA
    HTTP/2 多重化

    View Slide

  12. © SEGA
    • 1つのコネクションに複数の HTTP リクエスト
    多重化 – HTTP/2 の仕様
    GET
    GET
    GET
    APP SRV
    Connection
    ストリーム

    View Slide

  13. © SEGA
    • HTTP の Head of Line Blocking:HoLB (HTTP/1.1)
    – 何らかの要因で先⾏リクエスト処理に時間が掛かると
    後続のリクエスト処理が遅れてしまう
    HTTP/1.1の課題 - 多重化 – HTTP/2 の仕様
    1.png
    2.png
    3.png
    この分の遅れが後続に響く
    1.png

    View Slide

  14. © SEGA
    • HTTP/2 は HTTP の HoLB を回避
    – 複数ストリームの多重化により
    後続のリクエストを並⾏に処理可能
    多重化でHoLB回避 - 多重化 – HTTP/2 の仕様
    1.png この分の遅れは
    他のリクエストに影響しない
    1.png
    2.png
    3.png

    View Slide

  15. © SEGA
    • HTTP/1.1 と HTTP/2 通信状態の⽐較
    帯域の利⽤ - 多重化 – HTTP/2 の仕様
    HTTP/1.1 HTTP/2
    時間
    使⽤可能な
    回線帯域
    時間
    HTTP/1.1 は Keep Alive 有効を想定.
    但しファイルサイズが⼩さいと広帯域を活⽤できない.

    View Slide

  16. © SEGA
    • HTTP/2 は使える帯域を有効活⽤
    帯域の利⽤ - 多重化 – HTTP/2 の仕様
    HTTP/1.1 HTTP/2
    時間
    使⽤可能な
    回線帯域
    時間
    帯域を活⽤できていない 多重化で帯域をしっかり活⽤

    View Slide

  17. © SEGA
    l 細かいアセットダウンロードに有効
    ü 効率的に回線帯域を使⽤
    l クライアント・サーバ間通信
    ü RTT による待ち時間削減
    (モバイル回線 など)
    ゲームとの関連 – 多重化 – HTTP/2の仕様
    RTT
    RTT
    APP SRV
    SRV
    APP
    1RTT 分で複数リクエスト
    RTT
    HTTP/1.1
    HTTP/2

    View Slide

  18. © SEGA
    HTTP/2 HPACK

    View Slide

  19. © SEGA
    • HTTP ヘッダを圧縮する仕組み (RFC 7541)
    • 技術要素
    ü Huffman coding
    ü Indexing Table
    uStatic Table
    uDynamic Table
    HPACK – HTTP/2 の仕様

    View Slide

  20. © SEGA
    • 出現頻度の⾼い⽂字に短いビット列を割当てて圧縮
    Huffman coding - HPACK – HTTP/2 の仕様
    HTTP/1.1 HTTP/2
    10 BYTES
    から
    8 BYTES へ

    View Slide

  21. © SEGA
    • 出現頻度の⾼い⽂字に短いビット列を割当てて圧縮
    Huffman coding - HPACK – HTTP/2 の仕様
    ※ < > 内はパディング. オクテット境界に揃える

    View Slide

  22. © SEGA
    • 出現頻度の⾼い⽂字に短いビット列を割当てて圧縮
    Huffman coding - HPACK – HTTP/2 の仕様
    HTTP/1.1 HTTP/2
    59 BYTES 48 BYTES
    ※ 参考値です。実際に送信されるバイト数とは異なります
    約 81.4% に削減
    HTTP/2
    63 BYTES

    View Slide

  23. © SEGA
    • インデックス値を⽤いた圧縮機構
    – Static Table
    – Dynamic Table
    Indexing Table - HPACK – HTTP/2 の仕様

    View Slide

  24. © SEGA
    • 事前定義されているテーブルのインデックス値を使う
    Static Table - Indexing Table - HPACK – HTTP/2 の仕様
    HTTP/2
    ※ 参考値です。実際に送信されるバイト数とは異なります
    31 BYTES
    63 BYTES
    約 49.2% に削減

    View Slide

  25. © SEGA
    • 通信に使⽤したデータをテーブルに登録し、
    テーブルのインデックス値を使う
    Dynamic Table - Indexing Table - HPACK – HTTP/2 の仕様
    ※ 参考値です。実際に送信されるバイト数とは異なります
    5 BYTES
    約 8.4% に削減
    テーブルに登録
    同内容でリクエスト時

    View Slide

  26. © SEGA
    • フレーム: ストリーム上を流れる最⼩単位
    • バイナリデータ送受でテキストより効率が良い
    バイナリフレーム – HTTP/2の仕様
    フレームヘッダは 9Bytes
    フレームの構造

    View Slide

  27. © SEGA
    • HTTP/1.1 の場合
    • テキストベースのプロトコル
    • 解釈の処理で負荷が⾼め
    ゲームとの関連 – HPACK/バイナリフレーム
    HTTP/1.1 200 OK
    Date: Wed, 30 Jun 2021 02:19:48 GMT
    Content-Type:image/jpeg
    Transfer-Encoding: chunked
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    456
    Chunk1のデータ ....
    0
    : の後に空⽩を許可
    ヘッダ領域との区切り
    ヘッダ名は
    ⼤⽂字⼩⽂字区別なし
    Chunk終了の CRLF
    データサイズはまだ不明

    View Slide

  28. © SEGA
    • HPACK, バイナリフレーム
    ü API 通信のデータ削減・処理負荷軽減
    ゲームとの関連 – HPACK/バイナリフレーム
    HTTP/1.1 200 OK
    Date: Wed, 30 Jun 2021 02:19:48 GMT
    Content-Type:image/jpeg
    Transfer-Encoding: chunked
    Trailer: Expires
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    456
    Chunk1のデータ ....
    0
    データサイズは先頭
    HPACKで圧縮
    データサイズは先頭

    View Slide

  29. © SEGA
    • TCP, RUDP を使えば︖
    – HTTP/2をトランスポートレイヤーに持つ
    gRPC や WebSocket
    – サーバ設定や導⼊コストの圧縮が⾒込める
    – 対応したサーバレスコンテナの登場
    • Cloud Run (Google)
    閑話 : API 通信に HTTP を⽤いるメリット

    View Slide

  30. © SEGA
    HTTP/2 を使う実装
    Client
    Server
    クライアント
    サーバ

    View Slide

  31. © SEGA
    • ⾃⼒で全て実装は現実的ではない
    • ゲームエンジンが内蔵しているもの
    &オープンソースの利⽤
    HTTP/2 を使う実装 Client

    View Slide

  32. © SEGA
    • C/C++による
    ⾃社製ゲームエンジンやミドルウェアを利⽤
    ü C/C++製の OSS は選択肢が豊富
    ü 中でも libcurl, nghttp2 がお勧め
    ケース1 - HTTP/2 を使う実装 Client

    View Slide

  33. © SEGA
    • Unity を使⽤している場合
    ü Unityが採⽤している C#ランタイム/クラスライブラ
    リでは HTTP/2 が利⽤できない
    ü 前述のC/C++製OSSを⽤いた
    ネイティブプラグインを実装
    ケース2 - HTTP/2 を使う実装 Client

    View Slide

  34. © SEGA
    • Unreal Engine4 を使⽤している場合
    ü Windows で WinHttp 使⽤時のみ HTTP/2 対応
    ü C/C++製OSSを⽤いて対処を考える
    ケース3 - HTTP/2 を使う実装 Client

    View Slide

  35. © SEGA
    • C#による
    ⾃社ゲームエンジンやミドルウェアを利⽤
    ü C# 標準 API (HttpClient) が HTTP/2 対応
    • .NET Framework 4.6
    • .NET Core は注意. .NET Core 3.0 で対応(*1)
    ü 但し、パフォーマンスに懸念
    ケース4 - HTTP/2 を使う実装 Client
    *1 : https://docs.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-core-3-0#http2-support

    View Slide

  36. © SEGA
    • CDN の選定
    • サーバソフトウェアの選定
    HTTP/2 を使う実装 Server

    View Slide

  37. © SEGA
    • 主要なCDNは全て HTTP/2 対応済み︕
    ü CloudFront (Amazon)
    ü Cloud CDN (Google)
    ü Azure CDN (Microsoft Azure)
    ü Fastly (Fastly)
    ü Akamai CDN (Akamai)
    ü CloudFlare (CloudFlare)
    CDNの選定 - HTTP/2 を使う実装 Server

    View Slide

  38. © SEGA
    • サーバソフトウェアの選定
    – 主要なサーバプログラムは全て HTTP/2 対応済み︕
    • IIS, nginx, apache など
    – 前段にあるロードバランサに注意 (ADC含む)
    • HTTP/2を終端する可能性
    ソフトウェア選定 - HTTP/2 を使う実装 Server

    View Slide

  39. © SEGA
    HTTP/2 導⼊時の勘所

    View Slide

  40. © SEGA
    • ダウンロードするデータサイズや順序によっては
    期待した結果が出ない
    ü ファイルサイズが⼤きいものが⽀配的な場合
    ü ファイルサイズでソートされている場合
    パフォーマンスが出ない① Problem!

    View Slide

  41. © SEGA
    • プロジェクトに有効かをまず判断︕
    ü ファイルサイズのヒストグラム
    • ダウンロードリストの作り⽅に⼯夫が必要
    パフォーマンスが出ない① Solution!
    私たちが遭遇したので、
    後で詳しく説明します

    View Slide

  42. © SEGA
    • コネクション数に応じて、
    逐次的にリクエスト発⾏をしている場合
    – HTTP/1.1 を意識した実装の場合、
    3〜6程度でリクエストを送信となることが多い
    パフォーマンスが出ない② Problem!

    View Slide

  43. © SEGA
    • リクエストを束で受け取る設計
    – 多くのリクエストを同時に発⾏する
    – ライブラリを作るときに意識する
    パフォーマンスが出ない② Solution!

    View Slide

  44. © SEGA
    • リクエスト数が数万になることも︕
    – ファイル保存時、ファイル I/O のコスト
    – メモリに展開時、メモリ使⽤量が爆発
    ⼤量リクエストを捌くために Problem!

    View Slide

  45. © SEGA
    ü ファイル保存時、分散書込みなど、負荷軽減策が必要
    ü メモリに展開時、⼀旦ファイルに保存
    ü 実装によっては、思わぬボトルネックを⽣むので注意
    ⼤量リクエストを捌くために Solution!
    私たちが遭遇したので、
    後で詳しく説明します

    View Slide

  46. © SEGA
    • HTTP/1.1 時
    「コネクションエラー=通信エラー」だったが、
    考え⽅を改める必要あり
    エラーへの考え⽅ Problem!

    View Slide

  47. © SEGA
    • HTTP/2 ストリーム単位でのエラーは
    復帰できる可能性がある
    ü 即、通信エラーにしてはいけない
    エラーへの考え⽅をアップデート Solution!
    APP SRV
    Connection
    正常なストリームは通信中

    View Slide

  48. © SEGA
    • 1 Connection内に複数ストリームで通信
    – ⾼パケロス環境では
    複数Connection HTTP/1.1 より速度が劣ることも
    パケットロス率に注意 Problem!
    APP SRV
    他のストリームも
    再送の影響を受ける
    パケットロスで
    通信エラーが発⽣

    View Slide

  49. © SEGA
    • HTTP/2 を悪環境で利⽤時
    ü ⼀定のパケットロス環境では
    HTTP/1.1 にフォールバックする対策
    ü フォールバックする場合の割合は、
    各プロジェクトで計測して判断が必要
    パケットロス率に注意 Solution!

    View Slide

  50. © SEGA
    • 本番・テストのサーバは対応しているか︖
    • サーバ側の HTTP/2 機能を有効にし忘れていないか︖
    • このような事態が発⽣すると、
    HTTP/2 使っても速くない、と誤解される恐れがある
    サーバの対応を確認 Problem!

    View Slide

  51. © SEGA
    • HTTP/2 の誤った認識をさせないため
    ü HTTP/2 通信できているかの
    チェックツールを⽤意しておくのも良い
    サーバの対応を確認 Solution!

    View Slide

  52. © SEGA
    • 優先度(プライオリティ)の仕様がある
    • 各ストリームに重みづけや依存関係を設定し、
    先に欲しいリソースをサーバに通知する仕組み
    HTTP/2 の優先度設定

    View Slide

  53. © SEGA
    • ダウンロードの順序制御に
    HTTP/2 の優先度制御を使うことはできない
    – CDN 実装の問題で事実上使えない
    – HTTP として優先度オプションの協議
    – 現状 RFC 策定されていない
    優先度制御の課題 Problem!

    View Slide

  54. © SEGA
    • リクエスト順を制御したい場合には、
    ⾃前で実装するのが無難
    優先度制御 Solution!

    View Slide

  55. © SEGA
    • TLS 1.2 以上が必要 (サーバ)
    – 仕様上 HTTP/2では TLS1.2
    • AWS ロードバランサ
    – ALB の https 通信で HTTP/2 が使⽤可能
    その他

    View Slide

  56. © SEGA
    HTTP/2 トラブル集
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  57. © SEGA
    ダウンロード速度が出ない①
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  58. © SEGA
    • 通信速度が⼀定を超えるとそれ以上のダウン
    ロード速度にならない問題が発⽣
    ダウンロード速度が出ない① Problem!
    C

    View Slide

  59. © SEGA
    • 受信バッファが満タンになった際に待ちが発⽣
    ü 送受信処理をメインループに同期させていた為
    ダウンロード速度が出ない① Cause
    C
    HTTP/2ライブラリ
    受信処理
    ゲームメインループ
    同期 同期
    受信バッファ満タン
    パケット
    受け取れないので待つ

    View Slide

  60. © SEGA
    • 受信を別スレッドに分離し、取りこぼしを抑制
    ダウンロード速度が出ない① Solution!
    C
    HTTP/2ライブラリ
    受信処理
    ゲームメインループ
    取得
    パケット
    受信バッファ
    保存

    View Slide

  61. © SEGA
    ダウンロード速度が出ない②
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  62. © SEGA
    • 前項の「通信速度が⼀定を超えるとそれ以上の
    ダウンロード以上にならない問題」が特定の端
    末でのみ再発
    ダウンロード速度が出ない② Problem!
    C

    View Slide

  63. © SEGA
    • 下位グレードの端末で以下の逆転現象が発⽣
    ü 通信速度 > ファイルI/O速度
    • 特にファイル I/O の回数がボトルネックに
    ダウンロード速度が出ない② C Cause

    View Slide

  64. © SEGA
    • メモリマネージャの実装により解消
    ü ⼀定のサイズまではメモリに書き溜めておく
    ü 上記サイズを上回った段階でファイルに書き込む
    • ⼀定のサイズの設定値には注意が必要
    ü ⼤き過ぎるとこれまたボトルネックに
    ダウンロード速度が出ない② Solution!
    C

    View Slide

  65. © SEGA
    ダウンロード速度が出ない③
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  66. © SEGA
    • 特定のタイトルでダウンロード速度が安定しな
    い問題が発⽣
    ダウンロード速度が出ない③ Problem!
    C S

    View Slide

  67. © SEGA
    • 帯域を使い切ることができないケースがある
    ü リスト上に⼩さいファイルが固まっている時
    ダウンロード速度が出ない③ C Cause
    使⽤可能な回線帯域
    ここが使えていない︕

    View Slide

  68. © SEGA
    • ダウンロードリストの作り⽅を⼯夫する
    ü ランダムに⼊れ替えるだけでも効果あり
    ダウンロード速度が出ない③
    ここの部分を使えるようになった
    Solution!
    C

    View Slide

  69. © SEGA
    • ソートしてもダメなケース
    ダウンロード速度が出ない③ C Cause
    使⽤可能な回線帯域
    (⾼速)
    帯域次第で使い切れないケースが発⽣

    View Slide

  70. © SEGA
    • ファイルの同時ダウンロード数はサーバ固有
    ü HTTP/2的にはストリーム最⼤数と表現
    ü RFC的にはMAX_CONCURRENT_STREAMS
    • クライアントとサーバで別
    ü お互い⾃分の受付可能なストリーム最⼤数を送り合う
    ダウンロード速度が出ない③ C S Cause

    View Slide

  71. © SEGA
    • コネクション数を増やすことにより解決
    ü 使⽤していたCDNのストリーム最⼤数が変更不可
    • 最⼤3コネクションまで張る仕様とした
    ü 300〜400ストリームで安定感のある速度になった
    ü 例 : 200Mbps ÷ 384 (stream) → 65kb (1filesize)
    ダウンロード速度が出ない③ Solution!
    C

    View Slide

  72. © SEGA
    主要なCDNのストリーム最⼤数
    ダウンロード速度が出ない③ Appendix
    S
    Amazon CloudFront 128
    Azure CDN 100
    Google Cloud CDN 100
    akamai 128
    Fastly 100
    Cloudflare 256
    実測値 + 一部 https://netsec.ccert.edu.cn/files/papers/ndss-2020-cdn-judo.pdf を参考

    View Slide

  73. © SEGA
    • .Net 6のHTTP/2の機能でも同様の議論有り
    ü ストリームが上限に達したらコネクションを追加する
    ü https://github.com/dotnet/runtime/issues/35088.Net
    ダウンロード速度が出ない③ Appendix
    C

    View Slide

  74. © SEGA
    ダウンロード速度が出ない④
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  75. © SEGA
    • 特定のタイトルでのみダウンロード速度が極端
    に低下する問題が発⽣
    ダウンロード速度が出ない④ Problem!
    C

    View Slide

  76. © SEGA
    • ファイル処理負荷が⾼い構成だった
    ü 1ディレクトリ下に⼤量のファイルを保存
    ü ハッシュ化した⻑めのファイル名を使⽤
    ダウンロード速度が出ない④ C Cause

    View Slide

  77. © SEGA
    • ⼀時ファイルの処理を変更して回避
    ü 専⽤のディレクトリを⽤意
    ü 短いファイル名(内部的なリクエスト番号)
    ダウンロード速度が出ない④ Solution!
    C

    View Slide

  78. © SEGA
    速度出ない問題との闘いに終⽌符

    View Slide

  79. © SEGA
    ダウンロード速度が出すぎた
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  80. © SEGA
    • とあるタイトルの⼤型アップデート時に、CDN
    のデータ転送レート設定上限値を超える通信量
    が発⽣することが判明した
    ダウンロード速度が出すぎた Problem!
    C S

    View Slide

  81. © SEGA
    • CDNによってはデータ転送レートに制限が掛
    かっていることがある
    • Amazon CloudFrontの旧制限は40Gbps (※)
    ü 200Mbps出る端末の同時ダウンロード可能数
    Ø 40Gbps ÷ 200Mbps = 200 (端末)
    ダウンロード速度が出すぎた S Cause
    ※2020/5/20に150Gbpsに更新された

    View Slide

  82. © SEGA
    • 混雑時間帯のみHTTP/1.1へダウングレード
    • お⾦で解決するのも⼿
    ü 制限があるCDNも転送レート上限の引き上げが可能
    な所がほとんど
    • CDN選定条件にデータ転送レートも考慮しよう
    ダウンロード速度が出すぎた Solution!
    C

    View Slide

  83. © SEGA
    ファイルオープンエラー発⽣
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  84. © SEGA
    • タイトル側でファイル上限エラーが発⽣
    • HTTP/2ライブラリは以下の80%を上限に使⽤
    ü Windows (VCRUNTIME) : _getmaxstdio
    ü Android/iOS : /proc/self/limits
    ファイルオープンエラー発⽣ Problem!
    C

    View Slide

  85. © SEGA
    • iOS11でファイルオープン上限数が256に
    • 結果、タイトル側でファイルリソースが枯渇
    ü 256 * 0.2 = 51 ファイル
    ファイルオープンエラー発⽣ C Cause

    View Slide

  86. © SEGA
    • 上限数の変更を⾏う実装に修正
    ü setrlimit/getrlimitを使⽤
    • タイトルのファイル使⽤上限を受け取るように
    ü setrlimit/getrlimitが効かない端末対策
    • ファイルオープン数の削減
    ü オープンタイミングの⾒直し
    ファイルオープンエラー発⽣ Solution!
    C

    View Slide

  87. © SEGA
    ファイルのrenameに失敗
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  88. © SEGA
    • 特定の端末でのみダウンロード完了後のファイ
    ルのrenameに失敗する問題が発⽣
    ファイルのrenameに失敗 Problem!
    C

    View Slide

  89. © SEGA
    • Android11からExternalStorage境界をまたぐ
    rename(POSIX)呼び出しが禁⽌
    ü Javaはコピー&削除にフォールバックされる
    • 以下の境界をまたぐとNG
    ü PublicDirectory(Download), Cache, Files,
    Files(Download), Media
    ファイルのrenameに失敗 C Cause

    View Slide

  90. © SEGA
    • Android11でも必ず再現する訳ではない
    • sdcardfs採⽤のカーネルでは発⽣しない
    ü cat /proc/filesystems の結果にsdcardfsがあれば発
    ⽣しない
    ファイルのrenameに失敗 C Cause

    View Slide

  91. © SEGA
    • ファイルのrenameが失敗する端末ではコピー&
    削除にフォールバック
    • renameに⽐べパフォーマンスペナルティあり
    ü ExternalStorageの境界を跨がない設計をお勧め
    ファイルのrenameに失敗 Solution!
    C S

    View Slide

  92. © SEGA
    タイムアウトしない
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  93. © SEGA
    • データを全くダウンロードできないにも関わら
    ず、タイムアウトが発⽣しない問題が発⽣
    タイムアウトしない Problem!
    C S

    View Slide

  94. © SEGA
    • HTTP/2特有のコネクションクローズ問題
    ü コネクション切断時に送信されるGOAWAYフレーム
    がロストしたことが原因と推測
    • 複数のストリームが⾮同期に絡むのでHTTP/2の
    コネクションクローズの実装は複雑となりがち
    タイムアウトしない C S Cause

    View Slide

  95. © SEGA
    • 独⾃のタイムアウト処理を追加した
    ü タイムアウト判定時にはハンドシェイクからやり直し
    • graceful shutdownに対応したサーバやライブ
    ラリを使っていれば不要
    ü サーバ側が担保できなかったので独⾃に実装
    タイムアウトしない Solution!
    C S

    View Slide

  96. © SEGA
    iPhoneで通信中に不正終了
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  97. © SEGA
    • ダウンロード中に極稀に不正終了が発⽣
    ü 検証環境では7万回に⼀回程度発⽣
    iPhoneで通信中に不正終了 Problem!
    C

    View Slide

  98. © SEGA
    • 利⽤しているOSSの不具合だった
    ü HTTP/2のconnection reuse発⽣時に加えていくつか
    の条件を満たした時のみ発⽣
    ü 数千〜数万ファイルを⼀気にダウンロードするのは
    ゲームくらいなのでレアなものを踏む
    iPhoneで通信中に不正終了 C Cause

    View Slide

  99. © SEGA
    • その後OSSの更新で無事に修正された
    • HTTP/2のゲーム活⽤も枯れてきている
    ü 他社の⼤型タイトルでも採⽤が増えてきた
    iPhoneで通信中に不正終了 Solution!
    C

    View Slide

  100. © SEGA
    HTTP/2独⾃の設定をしたい
    C
    S
    クライアント事例
    サーバ事例

    View Slide

  101. © SEGA
    • 5G時代に備え、もっと速度を……︕
    ü HTTP/2独⾃の設定をカスタマイズすればいけそう︖
    • 設定例
    ü HPACK Dynamic Table設定
    ü ストリームの初期ウィンドウサイズ
    HTTP/2独⾃の設定をしたい Problem!
    C S

    View Slide

  102. © SEGA
    • 諦めた
    ü 利⽤しているOSSは設定を内部パラメータとして隠蔽
    ü CDNも設定できない場合が多い
    • OSS選定のタイミングで考慮しておこう
    HTTP/2独⾃の設定をしたい Solution!
    C S

    View Slide

  103. © SEGA
    インターネット全体への波及効果

    View Slide

  104. © SEGA
    インターネット全体への波及効果
    コネクション数削減による効果

    View Slide

  105. © SEGA
    ゲームはコネクションを多数⽤いる
    アセットダウンロード
    ランキング
    ゲーム通信
    チャット

    View Slide

  106. © SEGA
    • コネクション数の増加はそのままインターネッ
    ト上に存在する中継器の負荷増⼤に繋がる
    コネクション数による負荷増⼤

    View Slide

  107. © SEGA
    • ⽇本をはじめ全世界に余裕がない状態
    インターネットは社会全体の資源
    総務省 :我が国のインターネットにおけるトラヒックの集計・試算 2020年11⽉分の集計結果 より

    View Slide

  108. © SEGA
    • HTTP/2であれば従来に⽐べてコネクション数を
    ⼤幅に削減可能
    ü 多重化
    ü コネクションの再利⽤
    HTTP/2によるコネクション数削減

    View Slide

  109. © SEGA
    • Webブラウザや動画ストリーミングサービス等
    の⾮ゲーム分野ではコネクション数は減少傾向
    ⾮ゲーム分野では既に導⼊が進んでいる
    Web Almanac 2020 HTTP/2 - HTTP/2のインパクト より

    View Slide

  110. © SEGA
    HTTP/2のゲームへの導⼊のメリット
    開発者 ユーザ体験の向上(離脱率低下)
    ユーザ ダウンロード待ち短縮
    インターネット 負荷軽減

    View Slide

  111. © SEGA
    コネクション数削減による効果
    HTTP/2を使って
    開発者、ユーザ、インターネット
    に優しいゲーム作りを⽬指そう︕︕

    View Slide

  112. © SEGA
    インターネット全体への波及効果
    ゲームのデータ配信とトラフィック

    View Slide

  113. © SEGA
    • AAAタイトルの発売⽇や⼤型アップデートの⽇
    にインターネットトラフィックが⾮常に混雑す
    るというのが最近問題になっている
    ü CEDEC 2020 [JANOG×CEDECコラボセッション]
    インターネットとゲームトラフィック でも話題に
    ゲームのデータ配信の影響

    View Slide

  114. © SEGA
    • ゲーム業界はインターネットを使わせてもらっ
    ている⽴場
    ü 少しでもインフラへの負荷を減らすべき
    • 必要になったタイミングで都度ダウンロード
    ü モバイルゲームでは採⽤しているタイトルも多い
    ü ⾮モバイルゲームは⼤型パッチが主流
    データ配信⽅式の転換の提案

    View Slide

  115. © SEGA
    • ゲームの適正とよく相談する必要はある
    ü ジャンル
    ü プラットフォーム
    • 採⽤メリットも
    ü 従来に⽐べ管理や差し替えが容易になる
    パッチ配信とトラフィック

    View Slide

  116. © SEGA
    まとめ

    View Slide

  117. © SEGA
    • HTTP/2はアセットダウンロードに効果⼤
    • HTTP/2はクライアントサーバ間の通信の効率
    化にも効果⼤
    • HTTP/2はインターネットにも優しい
    HTTP/2を使おう︕︕

    View Slide

  118. © SEGA
    ご清聴ありがとうございました

    View Slide