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. 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
  2. 26 / 120 most time consumingが上位 Most time consumingの観点で バトルのAPIが上位2位であった

    (全体の3割強) 相対的にバトルソースが Webサーバに負荷を与えている
  3. 53 / 120 グラブルのスキル • 判定するスキルの数は 武器(10 × 2)+ 召喚石(2

    × 1) + キャラクター(4 × 3) = 34 バトル中に34回判定される。
  4. 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) } … } 様々なスキルをループ 回している たくさん計算している →処理が長い
  5. 66 / 120 改善方法 キャラクター スキルの 計算結果 計算結果 武器スキルの 計算結果

    召喚石スキルの 計算結果 計算結果をKVSに載せると 計算処理が省ける
  6. 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) } … } 処理する スキルが たくさんある スキルの ロジックに アクセス
  7. 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に詰める 計算した値を 配列に詰めておく
  8. 74 / 120 1700万人を満足させるためのシステム改修 • 実際に改修してみた例 • スキル計算の高速化 • CSVの取得処理を効率化

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

    • グラブルのマスタデータ • マスタデータとは • 現状のマスタデータの扱い方 • グラブルのマスタデータの特徴 • 改善ポイント • 改善方法
  10. 77 / 120 マスタデータとは • 例 【キャラの情報】 性別 身長 体重

    【パラメータ】 攻撃力 HP 防御力 【アビリティ】 スキルのデータ スキル文言 追加効果の情報 【図鑑】 キャラ紹介の文言
  11. 79 / 120 1700万人を満足させるためのシステム改修 • 実際に改修してみた例 • スキル計算の高速化 • CSVの取得処理を効率化

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

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

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

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

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

    • グラブルのマスタデータ • マスタデータとは • 現状のマスタデータの扱い方 • マスタデータの特徴 ・マスタデータの構成について ・更新頻度について ・問題点
  18. 93 / 120 マスタデータの構成について • キャラクターの例 【キャラの情報】 性別 身長 体重

    【パラメータ】 攻撃力 HP 防御力 【アビリティ】 スキルのデータ スキル文言 追加効果の情報 【図鑑】 キャラ紹介の文言
  19. 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…
  20. 97 / 120 1700万人を満足させるためのシステム改修 • 実際に改修してみた例 • スキル計算の高速化 • CSVの取得処理を効率化

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

    • グラブルのマスタデータ • マスタデータとは • 現状のマスタデータの扱い方 • マスタデータの特徴 ・マスタデータの構成について ・更新頻度について ・問題点
  22. 101 / 120 1700万人を満足させるためのシステム改修 • 今回の改修の目標 • 改修するところを探す • 実際に改修してみた例

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

    • スキル計算の高速化 • CSVの取得処理を効率化 • グラブルのマスタデータ • 改善ポイント • 改善方法
  24. 109 / 120 改善方法 基本情報 バトル パラメータ アビリティ キャラクターのデータ •

    改修後のイメージ memcached 必要なデータに絞る 一度取得したら memcachedに保存
  25. 114 / 120 まとめ バトルAPIの平均速度は42.5%減 0 50 100 150 200

    250 300 350 400 450 改修前 改修後 APIの速度 400ms 230ms
  26. 115 / 120 まとめ バトルAPIのメモリ使用量は40%減 0 20 40 60 80

    100 120 改修前 改修後 メモリ使用量 100MB 60MB
  27. 116 / 120 まとめ • CALL関数の数は50%減 0 50000 100000 150000

    200000 250000 300000 350000 400000 450000 改修前 改修後 CALL関数の数 400,000 関数 200,000 関数