ゲームラグ白書 › 症状から探す
不発・ロールバック:原因36件と担当
別名:スキル不発、入力が食われる、アイテムが元に戻る、取引失敗
図のあるメインページの症状辞典で開く →
確かにやったはずの行動がなかったことになるか、結果がしばらく経ってから覆ります。
スキルを押したのに発動しない。買ったアイテムが消える、または再ログインすると数分前の状態に戻っている。
リクエストが消えたか(パケットロス、キューのあふれ)、サーバーが自分の画面とは違う判定をしたか(判定タイミングのずれ、先行演出の後の拒否)、保存の途中で失敗しました(DBのロック・障害、サーバーのクラッシュ)。
この症状を引き起こす原因
L1 クライアントのゲームプロセス
- 時刻同期の誤差: クライアントが推定したサーバー時刻がずれていると、補間のタイミングやクールタイムの判定がずれます。 (ゲーム開発チーム・クライアント開発)
L5 データセンターのネットワーク機器
- クラウドのNATゲートウェイの接続・ポート上限: プライベートサブネットのサーバーから外部(プラットフォーム認証・決済・外部API)への接続は、NATゲートウェイがアドレスとポートを変換して送り出します。同じ宛先への同時接続がゲートウェイのポート上限を超えると、新しい接続が失敗します。 (インフラチーム・ネットワークインフラ)
- スイッチのマイクロバースト: 複数のサーバーが同じ瞬間に数千人へ一斉にパケットを送ると、そのトラフィックが集まるスイッチポートの小さなバッファが1ms足らずであふれます。 (ゲーム開発チーム・サーバー開発)
L6 サーバーのネットワークカード
- リングバッファ不足: NICがパケットを一時的に入れておくリングバッファが小さいと、瞬間的に集中したときにバッファがあふれて破棄されます。 (インフラチーム・サーバーインフラ)
- クラウドのPPS上限超過: クラウドのサーバーには種類ごとに毎秒のパケット数・帯域幅の上限があり、超えると黙って破棄されます。 (インフラチーム・サーバーインフラ)
L7 サーバーOS(カーネル)
- OOM Killer: Linuxはメモリが尽きると、メモリを最も多く使っているプロセスを選んで強制終了します。たいていはゲームサーバーです。 (ゲーム開発チーム・サーバー開発)
- システム時刻のジャンプ(NTPステップ): サーバーの時刻が一度に数秒前後に調整されると、システム時刻に依存するタイマーが一斉に発火したり止まったりします。 (ゲーム開発チーム・サーバー開発)
- サーバー間接続のエフェメラルポート枯渇: ゲームサーバーがDBやほかのサーバーへの接続を短時間で頻繁に張っては切ると、切れた接続がしばらくポートを占有し、新しい接続を開けなくなります。 (ゲーム開発チーム・サーバー開発)
L8 ソケットとプロトコル
- 信頼性UDPの再送設定: UDPの上に独自に作った再送ルールが保守的すぎると復旧が遅れ、攻撃的すぎると回線をさらに詰まらせます。 (ゲーム開発チーム・サーバー開発)
L9 サーバーのゲームプロセス
- メッセージキューの滞留: リクエストが処理速度より速く届いてキューにたまると、後ろのリクエストは数秒後にやっと処理されるか、破棄されます。 (ゲーム開発チーム・サーバー開発)
- サーバークラッシュ: 未処理のエラーでサーバープロセスが落ちると、そのサーバーにいた全員が同時に切断されます。 (ゲーム開発チーム・サーバー開発)
- アップデートによるトラフィックパターンの変化: 新しいコンテンツ・エフェクト・同期項目がパケットのサイズと頻度を増やすと、問題なく動いていたサーバーがアップデート後からMTU・帯域幅・パケット数の上限に引っかかります。 (ゲーム開発チーム・サーバー開発)
L11 ディスク
- ディスクフル: ログとダンプがたまってディスクがいっぱいになると書き込みが失敗し、備えがなければサーバーが落ちます。 (インフラチーム・サーバーインフラ)
L12 データベース
- ホットスポットの行ロック競合: 全員が同じ行(ギルド倉庫、オークションの人気アイテム、サーバー全体のカウンター)を更新しようとすると、ロックを取れるのは1人ずつです。 (ゲーム開発チーム・サーバー開発)
- DBのデッドロック: 2つのトランザクション(ひとまとまりで処理されるDB操作)が互いに相手のロックした行を待つと、DBが片方を強制的に取り消します。 (ゲーム開発チーム・サーバー開発)
- レプリケーション遅延: 書き込みはプライマリに、読み込みはレプリカから行う構成で、レプリカの追従が遅れると、書いたばかりの内容が見えません。 (インフラチーム・DBインフラ)
- 大規模なバッチ処理: ランキング集計、郵便の一括送信、古いデータの整理をサービス中に実行すると、ロックとディスクを占有します。 (ゲーム開発チーム・サーバー開発)
- DBのフェイルオーバー: プライマリが落ちてスタンバイDBに切り替わる間は書き込みができず、レプリケーションが間に合わなかった最後のデータは失われることがあります。 (インフラチーム・DBインフラ)
- 長い保存間隔による進行状況の消失: 負荷を減らすために数分に1回しか保存しないと、その間にサーバーが落ちた場合に進行状況が失われます。 (ゲーム開発チーム・サーバー開発)
- 長時間開いたままのトランザクション: 1つのトランザクションが長く開いたままだと、ロックを持ち続けるうえ、DBが古いバージョンのデータを整理(purge)できないため、全体が徐々に遅くなります。 (ゲーム開発チーム・サーバー開発)
- サービス中のスキーマ変更(DDL)によるロック: サービス中にテーブルへカラムやインデックスを追加すると、一瞬だけ必要なロック1つのために、そのテーブルを使うすべての要求が待たされることがあります。 (インフラチーム・DBインフラ)
L13 サーバー構成と運用
- 補助サーバーの障害: チャット・パーティ・オークションのように、ゲームサーバーとは別に動くサーバーで障害が起きると、その機能だけが動かなくなります。 (ゲーム開発チーム・サーバー開発)
- サーバー間の時刻のずれ: サーバーごとに時計が少しずつずれていると、クールタイム・バフ・イベント開始の判定がサーバーごとに食い違います。 (インフラチーム・サーバーインフラ)
- 外部サービスへの依存: プラットフォームのログイン、決済、本人確認などの外部サービスが遅くなったり止まったりすると、その段階で先に進めなくなります。 (外部・外部)
- マッチメイキング・リージョン割り当ての誤り: 近いリージョンがあるのに遠いリージョンのサーバーに割り当てられると、回線に問題がなくても、そのユーザーだけPingが常に高くなります。 (ゲーム開発チーム・サーバー開発)
- TLS証明書の期限切れ・設定ミス: ログイン・API・アップデートサーバーの証明書が期限切れになったり中間証明書が抜けていたりすると、その瞬間から新たに接続するクライアントのTLS接続が失敗します。 (インフラチーム・ネットワークインフラ)
同期設計
- スキルの先行入力なし: 前のスキルがサーバーで終わったという確認を受けるまで次のスキルを押せないと、連携のたびに往復時間が挟まります。 (ゲーム開発チーム・クライアント開発)
- Pingに削られる短い判定の受付時間: 回避・パリィ・ガードのように反応すべき時間が短いと、Pingがその時間を削ってしまい、よけられない攻撃が生まれます。 (ゲーム開発チーム・サーバー開発)
- ラグコンペンセーションのない判定: サーバーが「今のサーバー上の位置」だけで命中を判定すると、自分が見た画面と判定が食い違います。 (ゲーム開発チーム・サーバー開発)
- 過剰なラグコンペンセーション: 攻撃者を基準に巻き戻しすぎると、撃たれる側はもう隠れたのに当たります。 (ゲーム開発チーム・サーバー開発)
- クライアント権威型: それぞれが自分の結果を決めると、自分の画面は快適ですが、ほかの人の画面と結果が食い違い、チートにも弱くなります。 (ゲーム開発チーム・サーバー開発)
- 厳しすぎるサーバー検証: 移動速度・クールタイム・射程をサーバーが厳しくチェックしすぎると、ジッターでまとめて届いた正常な入力まで拒否します。 (ゲーム開発チーム・サーバー開発)
- 先行演出後のサーバー拒否: 自分の画面で先に見せたヒット・スキルを後からサーバーが認めないと、確かに見た結果がなかったことになります。 (ゲーム開発チーム・クライアント開発)
- 低いスナップショット送信レート: サーバーが位置の更新(スナップショット)を1秒に数回しか送らないと、その分だけ補間バッファを長く取る必要があり、ほかのキャラクターをより遠い過去の姿で見ることになります。 (ゲーム開発チーム・サーバー開発)
一部のユーザーだけに起きる問題
図のあるメインページの症状辞典を見る