Slide 1

Slide 1 text

スマホゲームリリース時に 絶対サーバを落とさないための 負荷試験 Cygames 伊藤英知

Slide 2

Slide 2 text

この講演について 本講演では、スマホゲームリリース時にサーバを落 とさないために、Cygamesが実践している負荷試験 の内容についてご紹介します。 負荷の予測と検証方法、計測項目の具体例と、負荷 試験環境の構築のポイントなどについて、具体的に 解説します。

Slide 3

Slide 3 text

自己紹介 3/85 Ito Eichi 伊藤 英知 Cygames 技術本部コンシューマー シニアエンジニア 主にサーバ周り担当 社内の負荷試験・負荷対策に関わる 最近ではミドルウェアの検証や社内のPHP フレームワークのメンテナンス・PHPのエ クステンション作成等を行う 負荷かけるのとチューニングするのが好き

Slide 4

Slide 4 text

アジェンダ 4/85 • はじめに • 絶対サーバを落とさない負荷試験 • さらなる知見〜より効率的な負荷試験にするために • まとめ

Slide 5

Slide 5 text

5/85 はじめに

Slide 6

Slide 6 text

はじめに 6/85 常に最高の状態で遊んでもらいたい なぜ負荷試験をするのか

Slide 7

Slide 7 text

7/85 あるプログラムがあります。 「このプログラムをチューニングしてください」 と言われたら、あなたは一番最初に何をしますか? はじめに

Slide 8

Slide 8 text

8/85 あるプログラムがあります。 「このプログラムをチューニングしてください」 と言われたら、あなたは一番最初に何をしますか? それは…「計測」ですよね。 はじめに

Slide 9

Slide 9 text

はじめに 9/85 ルール2: 計測すべし。計測するまでは速度のための調整を してはならない。コードの一部が残りを圧倒しないのであ れば、なおさらである。 Rule 2. Measure. Don't tune for speed until you've measured, and even then don't unless one part of the code overwhelms the rest. by Rob Pike 出典 https://ja.wikipedia.org/wiki/UNIX哲学 計測の重要性 ” “

Slide 10

Slide 10 text

10/85 ・ 改善したければ、計測は必要 ・ 計測しなければ、改善したかわからない ・ 何を計測するか、が重要 ・ 手軽に計測できる仕組みが、改善を加速させる はじめに

Slide 11

Slide 11 text

はじめに 11/85 負荷 をかける ボトル ネックを 見つける 改善する この負荷試験サイクルを 徹底的に繰り返します

Slide 12

Slide 12 text

はじめに 12/85 負荷 をかける ボトル ネックを 見つける 改善する 本講演では 「負荷をかける」に フォーカスします

Slide 13

Slide 13 text

13/85 • 負荷試験チーム • 全プロジェクトのノウハウを集約 • ほかプロジェクトと同じ過ちを繰り返さない • 負荷試験技術の専門性を高める はじめに 負荷試験サイクルを徹底的に繰り返すために

Slide 14

Slide 14 text

14/85 絶対サーバを落とさない負荷試験

Slide 15

Slide 15 text

15/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 16

Slide 16 text

16/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 17

Slide 17 text

17/85 • 正しく見積もる • 限界値をみつける • ボトルネックをみつける 絶対サーバを落とさない負荷試験 負荷試験のポイント

Slide 18

Slide 18 text

18/85 リリース時に起きる現象 • 想定以上にユーザーのアクセスが集中した • DBやキャッシュの負荷が上がりサーバが落ちた • サーバが落ちてないのに実際アクセスするとエラー 絶対サーバを落とさない負荷試験 負荷試験のポイント

Slide 19

Slide 19 text

19/85 • 想定以上にユーザーのアクセスが集中した ➡アクセス数の見積もりが間違っていた DBやキャッシュの負荷が上がりサーバが落ちた ➡負荷試験で仕様の最大値テストをしていなかった • サーバが落ちてないのに実際アクセスするとエラー ➡計測項目の不足 現象から考えられる原因 絶対サーバを落とさない負荷試験 負荷試験のポイント

Slide 20

Slide 20 text

20/85 • 想定以上にユーザーのアクセスが集中した ➡アクセス数の見積もりが間違っていた (正しく見積もれていない) • DBやキャッシュの負荷が上がりサーバが落ちた ➡負荷試験で仕様の最大値テストをしていなかった (限界値を見つけてられていない) • サーバが落ちてないのに実際アクセスするとエラー ➡計測項目の不足 (ボトルネックを見つけられていない) 現象から考えられる原因 絶対サーバを落とさない負荷試験 負荷試験のポイント

Slide 21

Slide 21 text

21/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 22

Slide 22 text

22/85 • 1ユーザのAPIのアクセス比率を計測する • 運用中タイトルの測定値を集めておく • 安全率を2.0以上とる 絶対サーバを落とさない負荷試験 想定アクセス数の決め方

Slide 23

Slide 23 text

1ユーザのAPIのアクセス比率を計測する 23/85 • 1クライアントが一定時間あたりどのAPIをどのくらい コールするかを開発サーバ等から集計する • どのAPIがたくさんコールされるか等の傾向を把握 想定アクセス数の決め方 1ユーザのAPIのアクセス比率を計測する

Slide 24

Slide 24 text

運用中タイトルの測定値を集めておく リリース直後等アクセス集中時の下記項目を記録 継続的に複数タイトルのデータを集めると傾向がわかる • DAU(Daily Active User) • HAU(Hourly Active User) アクセス数の推定には直接は不要だが集中度合いを比較しやすい • MiAU(Minutely Active User) • 1ユーザ当たり分間アクセス数 • スループット[req/sec] 24/85 想定アクセス数の決め方 運用中タイトルの測定値を集めておく

Slide 25

Slide 25 text

運用中タイトルの測定値を集めておく 下記の式で想定DAUからアクセス数の予想材料にする 25/85 スループット[req/sec] = 想定DAU * 1分間集中率 * 1ユーザ当たり分間アクセス数 / 60 アクセス集中したときの MiAU/DAU比率 テストプレイ中の 開発サーバのログ等から測定 想定アクセス数の決め方 運用中タイトルの測定値を集めておく

Slide 26

Slide 26 text

安全率を2.0以上とる 26/85 安全率 = 限界性能[req/sec] / 想定アクセス[req/sec] 「安全率」とは…限界性能に対する余裕度 例: 想定スループット数3000[req/sec]に対して 限界性能6000[req/sec]のサーバを用意した場合 6000/3000 = 安全率2.0 負荷試験での 限界値測定結果 アクセス数 見積もりの値 想定アクセス数の決め方 安全率を2.0以上とる

Slide 27

Slide 27 text

安全率を2.0以上とる • 少なくとも2倍以上のアクセス数急増は想定しておく ・時間帯、曜日が違うだけでもアクセスが大きく変動する ・プッシュ通知、生放送、イベント開始/終了等で容易に増減 ・SNSでバズる等運用以外の予測しづらい要因もある ・クライアント側のバイナリ更新でアクセス数が増えることもある • リリース時はさらに注意 ・リリース時は注目を集めやすいのでさらに変動は大きい 27/85 想定アクセス数の決め方 安全率を2.0以上とる

Slide 28

Slide 28 text

安全率を2.0以上とる • 想定よりも2倍以上の負荷を目標値にする • 今まで以上のユーザーが想定される場合は3倍以上も ・クラウドであれば安全率4.0のケースも検討の余地あり 例えば2.0の状態でさらに2倍にスケールアウトしてリリース 28/85 想定負荷とほぼ同じだけの処理能力ではNG! 想定アクセス数の決め方 安全率を2.0以上とる

Slide 29

Slide 29 text

サーバ台数の決め方 安全率を考えたうえで必要十分な台数にする • Webサーバ1台当たりの限界値を測定 • 安全率込みの想定スループットから台数を推定 例: 安全率込み想定スループット / 一台当たり限界値 ※ DBやキャッシュ等考慮しない単純化した例 • 推定した台数に想定スループットの負荷をかけて確認 29/85 想定アクセス数の決め方

Slide 30

Slide 30 text

30/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 31

Slide 31 text

31/85 • 各APIの限界値を測るように負荷をかける ・限界値を測定するのは工数がかかるが、 安全率を割り出すのにも使える • 仕様の最大値まで入力した想定の負荷試験をする ・入力値によって負荷が変わる。一番大きい/長い値をテストする • DBのレコード数も想定ユーザ数以上入れておく ・レコード数で負荷が変わるので、レコード数は増やしておく 絶対サーバを落とさない負荷試験 負荷のかけ方

Slide 32

Slide 32 text

32/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 33

Slide 33 text

33/85 サーバが落ちないよう多角的に計測項目を設定する • 計測項目の意味を理解する ・ memcached のUnfetched Evictionはどういうときに出るのか? ・ Time WaitなどTCPの各ステータスがどんなときに上昇するか? …等 • 負荷の計測手段を複数用意する ・得意分野が違うのでプロファイラと監視ツール最低限各1つは あった方が良い。 例: mackerelとnewrelic (後述) • 運用中の負荷を普段からよく見ておく ・特に最初に異常を示し始める計測項目を知っておく 計測項目のリストアップ 絶対サーバを落とさない負荷試験

Slide 34

Slide 34 text

• PHP Idle Worker • MySQL Row Lock Time, Slow Query, Abort Client, Slave status • Memcached Unfetched Eviction, Hit/Miss率 • Redis Evictions, CPU1コア毎の使用率, Hit/Miss率 34/85 • Node.js Context switch, CPU1コア毎使用率 • Linux全般 Time Wait, File Descriptor, Disk Latency, Free Storage, Inode, Traffic • LB HTTP Code Count etc... 負荷試験中によく使うメトリクスの例 絶対サーバを落とさない負荷試験 計測項目のリストアップ

Slide 35

Slide 35 text

35/85 一見CPU使用率は正常… CPU 使用率 Worker Process 使用率 全Worker Processが Busyに! リクエスト受付不可能 な状態 計測項目のリストアップ 絶対サーバを落とさない負荷試験

Slide 36

Slide 36 text

36/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 37

Slide 37 text

監視/計測用ツールの準備 計測ツールの役割 • ボトルネック箇所の特定 • 負荷試験サイクル速度の向上 ・適切な計測ツールがあることで、修正・確認しやすい • 正しいチューニングの実施 ・うかつに台数増やす方向に流れないように • 問題を見逃さない ・負荷試験結果が本当に問題ないか裏付け 37/85 絶対サーバを落とさない負荷試験 計測用ツールの準備

Slide 38

Slide 38 text

監視/計測用ツールの準備 38/85 • 監視ツール系 Mackerel Datadog ※APMも有 Munin Cloud Watch top sar vmstat kibana • プロファイラ系 各種言語対応 Newrelic ※監視機能も有 PHP Tideways(Xhprof) xdebug(Valgrind系) C/C++ Vtune Amplifier , gperf, Valgrind Node.js Node-Inspect(inspectオプション) etc... ミドルウェア・得意分野に応じて適切なものを選択 絶対サーバを落とさない負荷試験 計測用ツールの準備

Slide 39

Slide 39 text

39/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 40

Slide 40 text

40/85 • JMeter 主にHTTP(s)の負荷試験向き • Mocha+ダミークライアント 主にSocket.IOの負荷試験・外形テスト向き • C#製自作ツール TCP/UDPの負荷試験向き • Vegeta-mysql MySQLのチューニング・性能比較向き 向き不向きがあるので複数使う(作る) 絶対サーバを落とさない負荷試験 ツールの使い分け

Slide 41

Slide 41 text

JMeter • 特徴 ・昔からあり枯れている ・GUIがある ・プラグインをJavaで書くことで拡張でき、集計機能が豊富 ・Websocket/Socket.ioなどのステートフルな通信の負荷試験には 向いていない ・Webサイトの負荷試験には自動でシナリオを作る機能があり 非常に向いている ・ブラウザゲームだけでなくゲームAPI部分の負荷試験にも使用 41/85 ツールの使い分け

Slide 42

Slide 42 text

• 使用したケース ・ゲームタイトルの公式ページの負荷試験 ・ブラウザアクセスのproxyとしてJMeterの HTTP(S) Test Script Recorderを指定しリクエストを記録。 これを負荷シナリオとして再編集。 ・ HTTP(S)のみのゲームAPIの負荷試験 ・シリアライズ・暗号化等含めたバイナリのBodyをリクエスト カスタマイズしたHTTP Samplerを作成して負荷試験 42/85 JMeter ツールの使い分け

Slide 43

Slide 43 text

• 特徴 ・元々単体テストツールなのでCIに組み込みやすい ・シナリオが作りやすい/デバッグしやすい ・Websocket/Socket.ioの負荷試験がしやすい ・日常的にAPIの外形テストとしてデグレードの検知にも使える ・もともと負荷試験用ではないので、 通信部分(ダミークライアント)や分散して負荷をかける部分等、 負荷試験で使用する機能を実装する必要がある。 43/85 mocha+ダミークライアント ツールの使い分け

Slide 44

Slide 44 text

describe('クエスト開始準備', () => { it('ホストからメッセージ送信', () => { const promises = []; promises.push(host.waitForEmitAndAssert(define.EVENT .QUEST , define.URI.READY)); promises.push(guest1.waitForEmitAndAssert(define.EVENT .QUEST , define.URI.READY)); promises.push(guest2.waitForEmitAndAssert(define.EVENT .QUEST , define.URI.READY)); promises.push(host.emitAndAssertAll(define.EVENT .QUEST , define.URI.WAVE_READY , { 'ready_state': define.READY_STATE.QUEST_START , 'frame': 0 }, guest1, guest2)); return Promise.all(promises); }); }); 44/85 Mocha負荷シナリオの例 メッセージイベント 待ち受け メッセージ送信 ツールの使い分け mocha+ダミークライアント

Slide 45

Slide 45 text

C#自作ツール • 特徴 ・Unityでクライアントを開発している場合 クライアントのコードを流用しやすい ・CSX(後述)を使うことでリビルドせずに挙動を変えやすい ・プロセス起動時の負荷は高い ・負荷試験のスケールアウトは自前でやる必要がある ・レポート機能は弱い 45/85 ツールの使い分け

Slide 46

Slide 46 text

C#自作ツール 46/85 手間を取られることが多い シナリオ作成・修正が効率的 ツールの使い分け • CSX(C# Script) ・ビルド不要 ・文法はC#とほぼ同じ ・ビルド済みのC#クラスを呼び出せる

Slide 47

Slide 47 text

await Connect();// 前処理 await SendSignup();// ユーザ登録 await SendTutorial();// チュートリアル await SendMyPage();// マイページアクセス // 10回クエストを行う for (var i = 10; i < 10; ++i) { await SendQuestStart();// クエストスタート await Wait(500);// 500ms待ち await SendQuestFinish();// クエスト終了 } await Disconnect(); Stop();// 後処理 47/85 awaitで非同期の処理を 簡潔に記述 CSX負荷シナリオの例 ループ回数・処理順等 挙動の変更が容易 ツールの使い分け C#自作ツール

Slide 48

Slide 48 text

Vegeta-mysql 48/85 • 特徴 ・Go製 ・パフォーマンス高い ・DBの負荷だけ測りたい時に便利 ・テキストファイルに投げたいクエリのリストを記載して使う vegeta-mysql attack -dsn “user:pass@tcp(localhost:3306)/dbname” -body sql.txt ¥ -duration=60s | tee results.bin | vegeta-mysql report 負荷試験で投げたい SQLのリスト ツールの使い分け

Slide 49

Slide 49 text

Vegeta-mysql 49/85 • 使用したケース DBバージョン間の性能比較(MySQL5.7と8.0など) パラメータA パラメータB Vegeta-mysql sql.txt Vegeta-mysql sql.txt 同一負荷条件で 性能比較可能 ツールの使い分け

Slide 50

Slide 50 text

50/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 51

Slide 51 text

51/85 負荷試験対象の優先度を決める • 優先すべき箇所の分類 1. 全ユーザーが必ずリクエストする箇所 2. リクエストされる頻度が高い箇所 • APIごとのアクセス回数の調査方法 パラメータの組み合わせを含めたうえですべてのAPIを負荷試 験できるケースは少ない 限られた負荷試験期間で致命的なボトルネックを探す 絶対サーバを落とさない負荷試験 負荷試験対象の優先度を決める

Slide 52

Slide 52 text

優先すべき箇所の分類 1. 全ユーザーが必ずリクエストする箇所 2. リクエストされる頻度が高い箇所 52/85 負荷試験対象の優先度を決める 優先すべき箇所の分類

Slide 53

Slide 53 text

優先すべき箇所の分類 1. 全ユーザーが必ずリクエストする箇所 2. リクエストされる頻度が高い箇所 特に合計レスポンスタイムと転送量に注意 CPUやworker processなどの時間を取られている箇所 ≒DBやKVSにも負担がかかっているケースが多い 53/85 負荷試験対象の優先度を決める 優先すべき箇所の分類

Slide 54

Slide 54 text

優先すべき箇所の分類 1. 全ユーザーが必ずリクエストする箇所 2. リクエストされる頻度が高い箇所 特に合計レスポンスタイムと転送量に注意 CPUやworker processなどの時間を取られている箇所 ≒DBやKVSにも負担がかかっているケースが多い 54/85 負荷試験対象の優先度を決める ここのチューニング次第でサーバ台数が決まる 優先すべき箇所の分類

Slide 55

Slide 55 text

優先すべき箇所の分類 • 全ユーザーが最初にアクセスし負荷が上がる箇所 • ユーザー登録、チュートリアルのようなAPI リセマラを行われた際にもよくアクセスされる • DBのレコード数を本番に近づけるためにも必要 • 耐久試験にも使えるので真っ先に負荷試験シナリオを作っ ておくと便利 55/85 1. 全ユーザーが必ずリクエストする箇所 負荷試験対象の優先度を決める 優先すべき箇所の分類

Slide 56

Slide 56 text

• 大量に呼ばれるAPIは少しでも遅くなると影響が大きいため マイページのようなリクエスト頻度が高いAPI • レスポンスタイムの合計値を集計した時間も考慮 集計データがなければ平均レスポンスタイム*アクセス数で代用 56/85 2. リクエストされる頻度が高い箇所 優先すべき箇所の分類 負荷試験対象の優先度を決める 優先すべき箇所の分類

Slide 57

Slide 57 text

57/85 • APIごとのアクセス回数の調査方法 どのAPIがどれくらいアクセスされているかを集計 • 方法(1) Newrelicのツールの統計機能を使う 合計レスポンスタイムもわかるので便利 ’Transactions’->’Show all transactions table…’で表示できる • 方法(2) KibanaのVisualizeで集計する ログの取り込みや設置の手間はかかるが 不具合調査に利用でき、カスタマイズ性も高い。 平均レスポンスサイズも合わせて集計するのがおすすめ 負荷試験対象の優先度を決める

Slide 58

Slide 58 text

58/85 • 負荷試験のポイント • 想定アクセス数の決め方 • 負荷のかけ方 • 計測項目のリストアップ • 計測用ツールの準備 • ツールの使い分け • 負荷試験対象の優先度を決める • 負荷試験環境の構築のポイント 絶対サーバを落とさない負荷試験

Slide 59

Slide 59 text

負荷試験環境の構築のポイント 59/85 どんな規模の負荷でも再現したい 本番想定の環境に近づけることで精度を高める • 負荷かけ元のスケールアウトが必要な理由 • AWSのAPIを使って必要な負荷かけ元を確保 • 大量の負荷かけ元サーバの管理 絶対サーバを落とさない負荷試験 負荷試験環境の構築のポイント

Slide 60

Slide 60 text

60/85 • 開発中に目標値が上方修正されることがある 事前登録の伸び リリースするリージョンの増加 • 限界値を測定しているとかけ元サーバが足りなくなる 安全率の想定の変更 負荷かけ元サーバ台数もコンテナ合わせて1000台以上必要な時も 例: Socketの60万同時接続, APIアクセス10万rps以上を再現する チューニングの進展 開発プロジェクトの状況の変化への素早い対応が必要 負荷かけ元のスケールアウトが必要な理由 負荷試験環境の構築のポイント

Slide 61

Slide 61 text

61/85 負荷試験環境の構築のポイント 各種負荷ツールを インストール済み のAMI AWS のAPIをコール 任意のAMIから EC2インスタンス作成 このインスタンス群から 負荷をかける EC2 * N台 大量にインスタンスを立てるの で、インスタンス管理をしっか りする必要がある インスタンス 作成完了時 Slackに通知

Slide 62

Slide 62 text

62/85 一時的にサーバを立てるのに向いているSpot Instanceを採用 • 大量に負荷かけ元サーバを立てると管理が大変 ・たくさんサーバがあると立てっぱなしのものが出てしまう ・逆に止めてはいけないインスタンスかどうか判断難しい • 負荷をかけているときだけ起動していてほしい ・同じ予算でもより大きな負荷が再現できる 負荷試験環境の構築のポイント 大量の負荷かけ元サーバの管理

Slide 63

Slide 63 text

63/85 • Spot Instanceの利点 ・安い ・基本的にEC2と同様の動作 • Spot Instanceの欠点 ・価格が変動することがある ・起動し続ける保証はない ・インスタンスを自分で作成・管理・破棄する必要がある Spot Instanceの作成・管理・破棄の システムを作ることで欠点を補う 大量の負荷かけ元サーバの管理 負荷試験環境の構築のポイント

Slide 64

Slide 64 text

64/85 • コストの差 Spot Instance $0.0675 /時間 On demand Instance $0.214 /時間 -0.05 0.05 0.15 0.25 1 2 3 4 5 6 7 8 Ondemand Instance -0.05 0.05 0.15 0.25 1 2 3 4 5 6 7 8 Spot Instance 正味の負荷試験時しか コストが発生しない 時間あたりでも 値段が約1/3 ※c5.xlarge , 2019年8月時点 1日負荷試験に使った場合の例 実質コスト差は約1/6になるケースも $1.284 /日 $0.2025 /日 大量の負荷かけ元サーバの管理 負荷試験環境の構築のポイント

Slide 65

Slide 65 text

65/85 負荷試験環境の構築のポイント (xhprof) 計測 起動 負荷実行 停止 破棄 負荷かけ元 インスタンス作成 負荷シナリオ実行 負荷シナリオ停止 負荷かけ元 インスタンス破棄 負荷かけ元 本番同等の ゲームサーバ KVS DB Jenkins EC2 Spot Instance Fargate プロファイラ/ 監視ツール等 ELB エンジニア PC 大量の負荷かけ元サーバの管理

Slide 66

Slide 66 text

66/85 インスタンスの起動・破棄や負荷試験実施を Jenkinsのjobにしておく • パラメータ次第で任意の規模の負荷がかけられる • 誰でも好きなタイミングに負荷試験がかけられる • 負荷試験に必要な時だけサーバを起動/破棄できるのでコ ストが抑えやすい • AMIを変えることで任意のツールで試験実施 負荷試験環境の構築のポイント 大量の負荷かけ元サーバの管理

Slide 67

Slide 67 text

67/85 さらなる知見 ~より効率的な負荷試験にするために

Slide 68

Slide 68 text

より効果的な負荷試験にするためには 68/85 • 負荷試験時の注意点 • CIに小規模な負荷試験を組み込む • 内製ツールでより問題を発見しやすく

Slide 69

Slide 69 text

69/85 • ELB等クラウドのロードバランサは暖気しておく • 負荷をかける元サーバにNATを挟まない • 外部のAPIは必ずoffにできるようにしておく • PCから負荷をかけない • バッチのボリュームテストは必ず行う • 耐久試験(エージングテスト)も行う より効果的な負荷試験にするためには 負荷試験時の注意点

Slide 70

Slide 70 text

• ELB等クラウドのロードバランサは暖気しておく 暖気していないと急激な負荷増加にはスケールアウトが追従しない 追従できなかったときはHTTP 503エラーになってしまう AWSであればPre-Warmingの申請しLBを予めスケールアウト(暖気) した状態にしておく 本番LBも同様なので対応漏れがないように • 負荷をかける元サーバにNATを挟まない NATが詰まり正しく負荷がかからないことがある LBがsource ip hashingで分散したとき偏る 70/85 より効果的な負荷試験にするためには 負荷試験時の注意点

Slide 71

Slide 71 text

より効果的な負荷試験にするためには • 外部のAPIは必ずOFFにできるようにしておく ・APIに負荷がかかってしまうので基本OFFにして負荷試験する ・本番動作時にAPIのレイテンシが上がったりした場合にも有効 ・ゲームサーバ-API間のNATもボトルネックになっていないか注意 • PCから負荷をかけない ・会社の回線がパンクしてしまう ・正しく負荷もかからない 71/85 負荷試験時の注意点

Slide 72

Slide 72 text

より効果的な負荷試験にするためには • バッチのボリュームテストは必ず行う ・バッチはレコード数によって挙動が大きく変わるため 本番相当のレコード数で行う ・PHPの二次元配列は件数が増えると加速度的にメモリ消費する ・件数の増加でDBへのコネクションがタイムアウトしないこと確認 • 耐久試験(エージングテスト)も行う ・メモリリーク・キャッシュのevictionなどがあぶりだせる ・バッチも稼働させておくと負荷がかかっているときの挙動もわかる 72/85 負荷試験時の注意点

Slide 73

Slide 73 text

より効果的な負荷試験にするためには 73/85 • 負荷試験時の注意点 • CIに小規模な負荷試験を組み込む • 内製ツールでより問題を発見しやすく

Slide 74

Slide 74 text

より効果的な負荷試験にするためには • 負荷条件をビルドログとして残し再利用できる チューニング→負荷試験で測定のイテレーションがしやすい • いつでも負荷試験を実施でき、開発担当のメンバが すぐ効果を確認できる イテレート速度向上により負荷試験の効果を高める • 可能であればスケールアウトできるようにしておく そのまま負荷試験のJobとして実行できる 74/85 CIに小規模な負荷試験を組み込む

Slide 75

Slide 75 text

より効果的な負荷試験にするためには • APIの外形テストの代わりとしてデグレードチェッ ク・バグ再現等にも利用可能 ・通常のテストプレイでは出づらいレースコンディションバグを 確認しやすい ・バグチケットと1:1対応する再現シナリオを作ると 再現確認・修正確認・デグレードと3通りに使えて効果的 75/85 CIに小規模な負荷試験を組み込む

Slide 76

Slide 76 text

より効果的な負荷試験にするためには 76/85 • 負荷試験時の注意点 • CIに小規模な負荷試験を組み込む • 内製ツールでより問題を発見しやすく

Slide 77

Slide 77 text

内製ツールでより問題を発見しやすく 77/85 • “QueryChecker”-SQLのExplainを自動でチェックする ➡ DBの負荷軽減 • “Duplicate SQL Log”-重複クエリをログに出す ➡ DBの負荷軽減 ➡ KVSの負荷軽減 • “xhprof helper”-プロファイラを見やすく ➡ Webサーバの負荷軽減

Slide 78

Slide 78 text

内製ツールでより問題を発見しやすく 78/85 開発サーバからSQLクエリログ収集 EXPLAIN実行&パース 修正すべきクエリを記録 開発サーバでWeb表示 クエリの深刻度を判定 QueryChecker

Slide 79

Slide 79 text

内製ツールでより問題を発見しやすく 79/85 • チェックの手間を省力化 • Explainチェック漏れが起きづらくする • 問題のあるクエリの存在を共有 QueryChecker QueryChecker

Slide 80

Slide 80 text

内製ツールでより問題を発見しやすく 80/85 SELECT * FROM table_name_00 WHERE id=N AND name=’S’ x 3 SELECT * FROM table_name_00 WHERE id=102 AND name=’username2’ SELECT * FROM table_name_00 WHERE id=101 AND name=’username1’ SELECT * FROM table_name_00 WHERE id=100 AND name=’username0’ 全く同一あるいはループで発行されたクエリを集計 パラメータを 抽象化して集計 発行したクエリ Duplicate SQL Log Duplicate SQL Log

Slide 81

Slide 81 text

内製ツールでより問題を発見しやすく 81/85 2回以上発行しているクエリをDB のドライバクラスの デストラクタで ログに出力 N+1問題の検出を容易に Duplicate SQL Log Duplicate SQL Log

Slide 82

Slide 82 text

内製ツールでより問題を発見しやすく 82/85 標準状態のXhprof(tideways)の表示 リンクを開かないと結果がわからない たくさん結果があると探しづらい Xhprof helper Xhprof helper

Slide 83

Slide 83 text

内製ツールでより問題を発見しやすく 83/85 API名で測定結果を 絞り込み レスポンス速度・メモリ使用 量に応じて色分け表示 Xhprofの結果表示を見やすくする ChromeExtensionを作成 PJ要望に応じて機能追加 絞り込まれた結果を 強調表示 Xhprof helper Xhprof helper

Slide 84

Slide 84 text

まとめ 84/85 • 想定アクセス数でも快適に。安全率2.0以上とる • 運用タイトルから測定値を集めておく • サーバが落ちないよう多角的に計測項目を設定する • リクエストが多い箇所を優先して負荷試験する • どんな規模の負荷でも再現できる環境を作る • CIも活用する • 内製ツールでより問題を発見しやすくする

Slide 85

Slide 85 text

最後に 85/85 サーバーに安定を、 ユーザーに安心を。