한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

ゲームラグ白書 › 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に近ければ、デッドロックか外部の応答待ちの側
確認手段
インフラのツールで確認(ゲームコード不要)

出典

  1. systemd.service(5) — Linux manual page systemd
    WatchdogSec=:サービスが決められた時間内に生存通知(WATCHDOG=1)を送らなければ失敗とみなして終了、Restart=の設定に従って自動再起動
  2. Liveness, Readiness, and Startup Probes Kubernetes
    実行中なのに処理が進まない状態をLiveness Probeで検知して再起動、デフォルトでは10秒ごとに検査し、3回連続で失敗すると再起動
  3. pidstat(1) — Linux manual page sysstat
    -tで、プロセスに属するスレッドごとの統計(CPU使用率など)も表示
  4. perf-top(1) — Linux manual page perf
    実行中のスレッド(-t)やプロセス(-p)のCPU使用比率を関数(シンボル)ごとにリアルタイム表示

あわせて読みたい原因

同じ層:L9 サーバーのゲームプロセス

同じ症状(フリーズ)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る