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

グラブル流運用術〜1700万人を満足させるためのシステム構成、PHPプログラムの考え方〜

Cygames
October 10, 2017

 グラブル流運用術〜1700万人を満足させるためのシステム構成、PHPプログラムの考え方〜

2017/10/08 PHPカンファレンス2017

Cygames

October 10, 2017
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. © Cygames, Inc.
    © Cygames, Inc. 1 / 120

    View Slide

  2. 2 / 120

    View Slide

  3. 3 / 120
    自己紹介
    【自分の目指すところ】
    最速のシステムを
    作りたい

    View Slide

  4. 4 / 120
    Cygamesについて

    View Slide

  5. 5 / 120
    Cygamesについて
    【Cygamesのビジョン】
    最高のコンテンツを作る会社

    View Slide

  6. 6 / 120
    グランブルーファンタジーとは
    • 1700万ユーザーを超えたRPG
    • ブラウザゲーム
    • 30人が同時に戦うマルチバトル

    ※2017年10月8日現在

    View Slide

  7. 7 / 120
    グラブルの技術的特徴
    大量のアクセスがある!

    View Slide

  8. 8 / 120
    グラブルの技術的特徴
    サーバ
    攻撃ボタンやアビリティボタンを
    押下するたびにリクエスト
    (約3秒に1回)

    View Slide

  9. 9 / 120
    グラブルの技術的特徴
    大量のアクセス
    1日の総PV数10億PV強

    View Slide

  10. 10 / 120
    グラブルの技術的特徴
    騎空団(ギルド)同士のバトルイベント中
    PV数 :20億PV/日
    バトル数:1100万回/日
    ※最大値

    View Slide

  11. 11 / 120
    大量アクセスをさばくシステム構成
    Web Server 1
    twemproxy
    memcached 1

    Application
    Servers
    Cache
    Servers
    Database
    Servers
    Master
    MySQL MHA Cluster 1
    Apache + mod_php
    Node Server 1
    Layer4 Load Balancer(BIG-IP)
    Client N

    Web(HTTP) static data access
    Memcached Servers
    Client (Apps or Web Browser) 1
    Akamai
    CDN

    Nginx 1

    Application Load Balancers
    WebSocket(WS)
    Nginx N
    Redis 1

    Redis
    Servers
    Redis N
    10G Ethernet 10G Ethernet
    Node
    Server N
    Web Server
    N

    WebSocket (WS)
    Web(HTTP)
    Access
    Load
    Balancer /
    Proxy
    Sharding (水平分割)
    … N
    Node.js
    twemproxy
    memcached N
    Slave
    1
    Slave
    2
    MySQL MHA Cluster 2 MySQL MHA Cluster 3
    Master
    Slave
    1
    Slave
    2
    Master
    Slave
    1
    Slave
    2
    mysqli
    Web Server 1
    twemproxy
    Apache + mod_php
    mysqli
    local
    memcached
    local
    redis

    View Slide

  12. 12 / 120
    大量アクセスをさばくシステム構成
    データベースがたくさんある!
    アクセスが多いテーブルは水平分割してる
    大量のアクセスをさばくためにDBを細かく分ける
    ※DBサーバーは100セット以上

    View Slide

  13. 13 / 120
    グラブルは多くのユーザーがプレイ
    トータル1日10億オーバーのPV

    View Slide

  14. 14 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例

    View Slide

  15. 15 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例

    View Slide

  16. 16 / 120
    今回の改修の目標
    グラブルのシステムを
    もっと早くする!!

    View Slide

  17. 17 / 120
    今回の改修の目標
    • グラブルはたくさんの人が遊んでいて、大量のアクセスがある
    「最高のコンテンツを作る会社」なので
    「サーバーサイドエンジニア」として
    「レスポンス改善」を目標にした

    View Slide

  18. 18 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例

    View Slide

  19. 19 / 120
    改修するところを探す
    具体的にどうするのか検討するために
    下記の観点で調査した
    ・APIの特定
    ・処理の見直し
    ・具体的な改修箇所

    View Slide

  20. 20 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • APIの特定
    • 処理の見直し
    • 具体的な改修箇所
    • 実際に改修してみた例

    View Slide

  21. 21 / 120
    APIの特定
    • 重いAPIはどれだろう
    APIの重さが相対的にわかるツールが必要
    New Relicで調査しました

    View Slide

  22. 22 / 120
    APIの特定
    【New Relicからわかったこと】
    バトル処理全般に対して下記の現象が判明しました
    ・レスポンスタイムが高い
    ・throughputが高い
    ・most time consumingが上位

    View Slide

  23. 23 / 120
    New Relicとは
    サーバでの処理時間がリアルタイムでわかるツール

    View Slide

  24. 24 / 120
    レスポンスタイムが高い
    Transaction項目をみると
    各APIごとの平均レスポンスタイムの
    ランキングが表示されている
    上位にバトルのAPIが入っていた

    View Slide

  25. 25 / 120
    throughputが高い
    throughput項目を見ると
    ほかの処理に比べて、バトルAPIはthroughputが高いの
    で高頻度にたたかれる

    View Slide

  26. 26 / 120
    most time consumingが上位
    Most time consumingの観点で
    バトルのAPIが上位2位であった
    (全体の3割強)
    相対的にバトルソースが
    Webサーバに負荷を与えている

    View Slide

  27. 27 / 120
    APIの特定
    ・バトルの処理回数が多い
    ・バトルの処理時間が長い
    以上のことがわかったので、
    バトル処理全般を改修することにした

    View Slide

  28. 28 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • APIの特定
    • 処理の見直し
    • 具体的な改修箇所
    • 実際に改修してみた例

    View Slide

  29. 29 / 120
    処理の見直し
    • バトルの中の処理はどうなっているんだろう
    実際に自分で処理を見直した

    View Slide

  30. 30 / 120
    処理の見直し
    特にバトル処理中のスキル計算処理の中で
    ・多くのスキルを判定している
    ・計算数が多い箇所がある

    View Slide

  31. 31 / 120
    処理の見直し
    特にバトル処理中のスキル計算処理の中で
    ・多くのスキルを判定している
    ・計算数が多い箇所がある
    具体的に数値で回数を見たい
    プロファイラを使って処理を分析

    View Slide

  32. 32 / 120
    処理の見直し
    今回はXHProfを使いました
    XHProfとは、PHPのプロファイラ
    処理時間や関数のcall数、メモリ使用など詳細に数値で把握できる

    View Slide

  33. 33 / 120
    処理の見直し
    下記のことがわかりました
    ・スキル計算処理がメモリを消費し、処理時間も長い
    ・CSV取得処理のcall数が多く処理時間が長い

    View Slide

  34. 34 / 120
    スキル計算処理の負荷が高い
    スキルの評価部分が処理時間が長く、
    メモリ消費が激しかった

    View Slide

  35. 35 / 120
    CSV取得処理のcall数が多く処理時間が長い
    CSVを取得している処理の
    call回数が多い
    処理に時間がかかっている

    View Slide

  36. 36 / 120
    処理の見直し
    プロファイラからわかったこと
    ・スキル計算処理がメモリを消費し処理時間も長い
    ・CSV取得処理のcall数が多く処理時間が長い
    スキル計算処理とCSV取得処理がネック

    View Slide

  37. 37 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • APIの特定
    • 処理の見直し
    • 具体的な改修箇所
    • 実際に改修してみた例

    View Slide

  38. 38 / 120
    具体的な改修箇所
    • スキル計算処理がメモリを消費し処理時間も長い
    スキル計算処理のメモリ使用量を減らし、処理時間を短くする
    • CSV取得処理のcall数が多く処理時間が長い
    CSV取得処理のcall数を減らし、処理時間を短くする

    View Slide

  39. 39 / 120
    具体的な改修箇所
    「スキル計算の高速化」
    「CSVの取得処理の効率化」
    上記を改修箇所とした。

    View Slide

  40. 40 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例

    View Slide

  41. 41 / 120
    実際に改修してみた例
    全項目より下記2点を改修箇所として定めた
    • スキル計算の高速化
    • CSVの取得処理を効率化

    View Slide

  42. 42 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化

    View Slide

  43. 43 / 120
    スキル計算の高速化
    スキルの高速化として下記の3項目を説明します
    • グラブルのスキル
    • 現状の把握
    • 改善方法

    View Slide

  44. 44 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • グラブルのスキル
    • 現状の把握
    • 改善方法
    • CSVの取得処理を効率化

    View Slide

  45. 45 / 120
    グラブルのスキル
    グラブルのスキルは種類が多く、
    バトル内でも大量に判定されます
    バトルの編成の中でスキルに関連するもの
    ・武器
    ・召喚石
    ・キャラ etc...

    View Slide

  46. 46 / 120
    武器
    1編成に付き10本
    1本あたり2種類のスキルを持つ

    View Slide

  47. 47 / 120
    武器
    この武器には以下のスキルが付いている
    1. 風属性キャラの攻撃力上昇(中)
    2. 風属性キャラのHPが少ないほど攻撃力が上昇(小)

    View Slide

  48. 48 / 120
    召喚石
    編成全体の能力に影響を与える
    (バトル中は自分とサポーターの2つ)

    View Slide

  49. 49 / 120
    召喚石
    この召喚石には以下のスキルが付いている
    スキル「嵐竜方陣」の効果を100%UP

    View Slide

  50. 50 / 120
    キャラクター
    1ターンに4人攻撃する
    1人3つのスキルを持っている

    View Slide

  51. 51 / 120
    キャラクター
    このキャラクターには以下のスキルが付いている
    1.弱体耐性UP
    2.バトル開始時に自動復活効果
    3.被ダメージに稀にHP全回復

    View Slide

  52. 52 / 120
    グラブルのスキル
    多彩なスキルを組み合わせて、
    高いダメージを得たり、
    戦闘中に有利になる効果を得たりする

    View Slide

  53. 53 / 120
    グラブルのスキル
    • 判定するスキルの数は
    武器(10 × 2)+ 召喚石(2 × 1) + キャラクター(4 × 3) = 34
    バトル中に34回判定される。

    View Slide

  54. 54 / 120
    グラブルのスキル
    ・武器スキル数は800以上
    ・召喚石のスキルは250以上
    ・キャラクター数は400キャラ以上
    組み合わせの数が膨大になる
    ※10/8現在

    View Slide

  55. 55 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • グラブルのスキル
    • 現状の把握
    • 改善方法
    • CSVの取得処理を効率化

    View Slide

  56. 56 / 120
    現状の把握
    • グラブルのスキルは数が多く、組み合わせ数も膨大
    実際に確認したところスキルの計算処理が膨大にあった。
    プロファイラで詳細分析

    View Slide

  57. 57 / 120
    現状の把握
    ・スキル計算処理が処理時間も長い、メモリ使用量が高い

    View Slide

  58. 58 / 120
    現状の把握
    ・実際の処理例
    foreach($character_party as $character)
    {
    foreach($weapon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    Skill::calcurate_skill($character, $skill_master)
    }
    foreach($summon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    Skill::calcurate_skill($character, $skill_master)
    }

    }
    様々なスキルをループ
    回している
    たくさん計算している
    →処理が長い

    View Slide

  59. 59 / 120
    現状の把握
    スキル評価ロジックの
    メモリ使用量が高い

    View Slide

  60. 60 / 120
    現状の把握
    • スキルの組み合わせが多いので、膨大な計算処理がある
    計算処理を減らせれば軽くなる

    View Slide

  61. 61 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • グラブルのスキル
    • 現状の把握
    • 改善方法
    • CSVの取得処理を効率化

    View Slide

  62. 62 / 120
    改善方法
    • スキルの組み合わせが多いので、膨大な計算処理がある
    計算処理を減らせれば軽くなる
    普段どのような負荷対策をしているか考えてみた

    View Slide

  63. 63 / 120
    改善方法
    PHP DB
    サーバーからDBに大量にアクセスがある

    View Slide

  64. 64 / 120
    改善方法
    KVS
    一度DBから取得したら、KVSに乗せる
    PHP
    DB

    View Slide

  65. 65 / 120
    改善方法
    一度計算した結果をKVSにのせると早くなるはず!
    PHP KVS

    View Slide

  66. 66 / 120
    改善方法
    キャラクター
    スキルの
    計算結果
    計算結果
    武器スキルの
    計算結果
    召喚石スキルの
    計算結果
    計算結果をKVSに載せると
    計算処理が省ける

    View Slide

  67. 67 / 120
    改善方法
    • 実際の処理例
    foreach($character_party as $character)
    {
    foreach($weapon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    Skill::calcurate_skill($character, $skill_master)
    }
    foreach($summon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    Skill::calcurate_skill($character, $skill_master)
    }

    }
    処理する
    スキルが
    たくさんある
    スキルの
    ロジックに
    アクセス

    View Slide

  68. 68 / 120
    【改修後処理】
    $identifier = $raid_id . $user_id;
    $skill = Memcache::instance()->get(raid_id);
    If (empty($skill)) {
    foreach($character_party as $character) {
    $array[キャラクター番号] = a
    foreach($weapon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    $skill[‘weapon_skill’][]=Skill::calcurate_skill($character,$skill_master);
    }
    foreach($summon_skill_ids as $skill_id)
    {
    $skill_master = Master¥Skill::find($skill_id);
    $skill[‘summon_skill’][] = Skill::instance()->calcurate_skill($character, $skill_master);
    }
    foreach($support_skill_ids as $skill_id)

    Memcache ::instance()->set_key($ identifier )->set($skill);
    }
    計算してあるスキル値を
    memcachedから取得
    計算結果が入っている配列を
    memcachedに詰める
    計算した値を
    配列に詰めておく

    View Slide

  69. 69 / 120
    実装上で気をつけたこと
    ・キーの持ち方
    ・データが取れないの挙動

    View Slide

  70. 70 / 120
    キーの持ち方
    正しい一意のキーで取得しないと
    別のデータがとれてしまい、障害原因となる。
    「バトルのID」と「ユーザーのID」を結合して
    一意のキーを保証した。

    View Slide

  71. 71 / 120
    データが取れないの挙動
    データが取れないときは、再度計算しmemcachedに載せる
    有効期限が切れた場合や、memcachedに異常が発生した場合でも、
    データが取れないので正しく計算される
    よって安全性が担保される

    View Slide

  72. 72 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化

    View Slide

  73. 73 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • 改善ポイント
    • 改善方法

    View Slide

  74. 74 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • グラブルのマスタデータの特徴
    • 改善ポイント
    • 改善方法

    View Slide

  75. 75 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • グラブルのマスタデータの特徴
    • 改善ポイント
    • 改善方法

    View Slide

  76. 76 / 120
    マスタデータとは
    キャラクターや武器などのパラメータ情報
    マスタデータはCSVファイル

    View Slide

  77. 77 / 120
    マスタデータとは
    • 例
    【キャラの情報】
    性別
    身長
    体重
    【パラメータ】
    攻撃力
    HP
    防御力
    【アビリティ】
    スキルのデータ
    スキル文言
    追加効果の情報
    【図鑑】
    キャラ紹介の文言

    View Slide

  78. 78 / 120
    マスタデータとは
    パラメータの情報を
    CSVで保持
    【キャラの情報】
    性別
    身長
    体重
    【キャラの情報】
    性別,身長,体重
    男,178,50

    View Slide

  79. 79 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • グラブルのマスタデータの特徴
    • 改善ポイント
    • 改善方法

    View Slide

  80. 80 / 120
    現状のマスタデータの扱い方
    現状のマスタデータの保存方法はWebサーバ内のlocal redisを使用
    サーバ
    local
    redis

    View Slide

  81. 81 / 120
    現状のマスタデータの扱い方
    実際に運用しながら試してみた順に紹介
    ・KVSの場所について
    ・local memcachedに保存
    ・local redisに保存

    View Slide

  82. 82 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    ・KVSの場所について
    ・local memcachedに保存
    ・local redisに保存
    • グラブルのマスタデータの特徴

    View Slide

  83. 83 / 120
    KVSの場所について
    ・マスタデータは全てのユーザに対して同じデータ
    globalサーバにKVSを立ててデータを置くと
    全ユーザーがデータを取得するため、トラフィックが多い
    PHP
    PHP
    KVS

    View Slide

  84. 84 / 120
    KVSの場所について
    • 各Webサーバ内にKVSを立てて、アクセスするようにするとWebサーバの数だ
    けアクセスが分散できる
    サーバ
    local
    KVS
    サーバ
    local
    KVS
    サーバ
    local
    KVS

    View Slide

  85. 85 / 120
    システム構成図から見るglobal KVSとlocal KVS
    Web Server 1
    twemproxy
    memcached 1

    Application
    Servers
    Cache
    Servers
    Database
    Servers
    Master
    MySQL MHA Cluster 1
    Apache + mod_php Node Server 1
    Layer4 Load Balancer(BIG-IP)
    Client N

    Web(HTTP) static data access
    Memcached Servers
    Client (Apps or Web Browser) 1
    Akamai
    CDN

    Nginx 1

    Application Load Balancers
    WebSocket(WS)
    Nginx N
    Redis 1

    Redis
    Servers
    Redis N
    10G Ethernet 10G Ethernet
    Node
    Server N
    Web Server
    N

    WebSocket (WS)
    Web(HTTP)
    Access
    Load
    Balancer /
    Proxy
    Sharding (水平分割)
    … N
    Node.js
    twemproxy
    memcached N
    Slave
    1
    Slave
    2
    MySQL MHA Cluster 2 MySQL MHA Cluster 3
    Master
    Slave
    1
    Slave
    2
    Master
    Slave
    1
    Slave
    2
    mysqli
    local
    memcached
    local
    redis
    Webサーバにある
    local redis
    local memcached
    globalにある
    redis
    memcahced

    View Slide

  86. 86 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    ・KVSの場所について
    ・local memcachedに保存
    ・local redisに保存
    • グラブルのマスタデータの特徴

    View Slide

  87. 87 / 120
    local memcachedに保存
    PHPからCSVファイルにアクセスしたとき、
    一番最初のアクセスで全行をlocal memcachedに保存
    local
    memcached
    PHP
    CSVファイル

    View Slide

  88. 88 / 120
    local memcachedの問題点
    CSVファイルのレコード数が増えたため、
    CSVファイルのデータをlocal memcachedに保存する際に
    Webサーバに負荷がかかるようになった。

    View Slide

  89. 89 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    ・KVSの場所について
    ・local memcachedに保存
    ・local redisに保存
    • グラブルのマスタデータの特徴

    View Slide

  90. 90 / 120
    local redisに保存
    local redisだとlocal memcachedで起きていた問題点が起きないため
    Webサーバにlocal redisをたてて、マスタデータをlocal redisに移行した
    PHP
    local
    redis

    View Slide

  91. 91 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • マスタデータの特徴
    • 改善ポイント
    • 改善方法

    View Slide

  92. 92 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • マスタデータの特徴
    ・マスタデータの構成について
    ・更新頻度について
    ・問題点

    View Slide

  93. 93 / 120
    マスタデータの構成について
    • キャラクターの例
    【キャラの情報】
    性別
    身長
    体重
    【パラメータ】
    攻撃力
    HP
    防御力
    【アビリティ】
    スキルのデータ
    スキル文言
    追加効果の情報
    【図鑑】
    キャラ紹介の文言

    View Slide

  94. 94 / 120
    マスタデータの構成について
    基本情報
    バトル
    パラメータ
    アビリティ 図鑑
    キャラクターのデータ

    View Slide

  95. 95 / 120
    マスタデータの構成について
    ID スキルのID 演出データID 奥義ID etc
    1 2 21 33 Etc…
    ID 効果値 スキル演出ID ダメージ補正ID Etc..
    2 2 9 43 Etc…
    ダメージ補正
    スキル
    基本情報
    ID 基礎値 ダメージの伸
    び方ID
    固定値 Etc…
    43 23 22 2000 Etc…

    View Slide

  96. 96 / 120
    マスタデータの構成について
    マスタデータは多くのCSVファイルから構成されている
    多くのCSVファイルとリレーション関係がある

    View Slide

  97. 97 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • マスタデータの特徴
    ・マスタデータの構成について
    ・更新頻度について
    ・問題点

    View Slide

  98. 98 / 120
    更新頻度について
    マスタデータがリリースされたら基本変わらない
    マスタデータが変わる例:
    1.不具合修正
    2.バランス調整

    View Slide

  99. 99 / 120
    1700万人を満足させるためのシステム改修
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • マスタデータとは
    • 現状のマスタデータの扱い方
    • マスタデータの特徴
    ・マスタデータの構成について
    ・更新頻度について
    ・問題点

    View Slide

  100. 100 / 120
    問題点
    マスタデータの構成上CSVファイルが大量に関連しているため、
    検索コスト、データを保持するコストがかかる

    View Slide

  101. 101 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • 改善ポイント
    • 改善方法

    View Slide

  102. 102 / 120
    マスタデータの構成について
    基本情報
    バトル
    パラメータ
    アビリティ 図鑑
    キャラクターのデータ

    View Slide

  103. 103 / 120
    改善ポイント
    • 通信ごとにキャラクターのデータを作り直している

    View Slide

  104. 104 / 120
    改善ポイント
    • キャラクターのデータを作るときに多くのマスタデータを取得している
    • 通信ごとにキャラクターのデータを作り直している
    CSVをとる頻度が高い

    View Slide

  105. 105 / 120
    改善ポイント
    CSVを取得する頻度を低くすれば効率が良い

    View Slide

  106. 106 / 120
    1700万人を満足させるためのシステム改修
    • 今回の改修の目標
    • 改修するところを探す
    • 実際に改修してみた例
    • スキル計算の高速化
    • CSVの取得処理を効率化
    • グラブルのマスタデータ
    • 改善ポイント
    • 改善方法

    View Slide

  107. 107 / 120
    改善方法
    必要な個所に対して
    中間データをキャッシュしたら効率が良い!

    View Slide

  108. 108 / 120
    改善方法
    基本情報
    バトル
    パラメータ
    アビリティ 図鑑
    キャラクターのデータ
    • 改修前のイメージ

    View Slide

  109. 109 / 120
    改善方法
    基本情報
    バトル
    パラメータ
    アビリティ
    キャラクターのデータ
    • 改修後のイメージ
    memcached
    必要なデータに絞る
    一度取得したら
    memcachedに保存

    View Slide

  110. 110 / 120
    改善方法
    【実装時に気を付けたこと】
    ・中間データのキャッシュの置き場
    共通のデータを参照するため local memcachedに格納
    ・マスタデータが更新された時について

    View Slide

  111. 111 / 120
    マスタデータが更新された時について
    マスタデータが更新されたときに、同時に中間データも更新されなければなら
    ない
    そのためリリースバッチでマスタデータが保存されているredisと
    中間データが保存されているmemcachedを削除している
    Webサーバ
    local memcached
    中間データ
    local redis
    マスターデータ サーバ内で
    flush_all

    View Slide

  112. 112 / 120
    改善結果
    中間データをキャッシュ化したことによって
    全体のCSV取得回数が減った
    CSVファイルを検索する機会が減った
    マスタデータをサーバメモリに展開する必要がなくなったので
    メモリの節 約になった

    View Slide

  113. 113 / 120
    まとめ
    • スキル計算の高速化
    • CSV取得処理の効率化
    上記の処理を行いました
    それによる効果をグラフ化します

    View Slide

  114. 114 / 120
    まとめ
    バトルAPIの平均速度は42.5%減
    0
    50
    100
    150
    200
    250
    300
    350
    400
    450
    改修前 改修後
    APIの速度
    400ms
    230ms

    View Slide

  115. 115 / 120
    まとめ
    バトルAPIのメモリ使用量は40%減
    0
    20
    40
    60
    80
    100
    120
    改修前 改修後
    メモリ使用量
    100MB
    60MB

    View Slide

  116. 116 / 120
    まとめ
    • CALL関数の数は50%減
    0
    50000
    100000
    150000
    200000
    250000
    300000
    350000
    400000
    450000
    改修前 改修後
    CALL関数の数
    400,000
    関数
    200,000
    関数

    View Slide

  117. 117 / 120
    改修を通して感じたこと
    • 常に改善の意識をもつ必要性
    • プログラムを書く上での当たり前の大切さ
    データは最小限にまとめて再利用
    同じデータを何度も取得しないで再利用

    View Slide

  118. 118 / 120
    ■まとめ
    キャッシュは神
    使用用途は正しく守ってください

    View Slide

  119. 119 / 120

    View Slide

  120. © Cygames, Inc. 120 / 120

    View Slide