ゲームラグ白書 › L9 サーバーのゲームプロセス
無限ループ・ロジックの暴走 Infinite loop / runaway logic
原因ID sp-infinite-loop · 主担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
バグで1ティックが終わらないとサーバーが止まり、ウォッチドッグが強制的に再起動します。
なぜ 誤った条件でループが終わらない、または再帰が暴走 → すると ティックが終わらずサーバーが停止 → 画面では フリーズの後、全員が切断
- 症状
- フリーズ, 切断
- 要因
- ストール
- 誰に起きるか
- 特定の場所・チャンネル, サーバー全体
- いつ
- 特定の操作をしたとき, ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- ループ回数の上限、ウォッチドッグ、問題の入力を再現するテスト。
- グラフでは
- 接続が一斉に切れる · 接続数、スレッドごとのCPU
- 確認箇所
- 止まっている間にpidstat -t 1でスレッドごとのCPUを確認し、100%で回っているスレッドがどの関数で回っているかをperf top -t(スレッドID)かgdbで確認。すでに再起動していれば、ウォッチドッグのタイムアウト記録(systemdのWatchdogSec、KubernetesのLiveness Probe失敗)
- 該当する場合
- サーバーが止まっている間、ゲームスレッド1つがCPU使用率100%に張り付いており、スタックが同じ関数・ループの中で回り続けている
- 該当しない場合
- 止まっている間CPUが0に近ければ、デッドロックか外部の応答待ちの側
- 確認手段
- インフラのツールで確認(ゲームコード不要)
出典
- systemd.service(5) — Linux manual page systemd
WatchdogSec=:サービスが決められた時間内に生存通知(WATCHDOG=1)を送らなければ失敗とみなして終了、Restart=の設定に従って自動再起動 - Liveness, Readiness, and Startup Probes Kubernetes
実行中なのに処理が進まない状態をLiveness Probeで検知して再起動、デフォルトでは10秒ごとに検査し、3回連続で失敗すると再起動 - pidstat(1) — Linux manual page sysstat
-tで、プロセスに属するスレッドごとの統計(CPU使用率など)も表示 - perf-top(1) — Linux manual page perf
実行中のスレッド(-t)やプロセス(-p)のCPU使用比率を関数(シンボル)ごとにリアルタイム表示
あわせて読みたい原因
同じ層:L9 サーバーのゲームプロセス
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る