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

游戏卡顿白皮书 › L9 服务器游戏进程

Tick 超出预算 Tick overrun

原因 ID sp-tick-overrun · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维

在含图示和实验的完整版中打开此卡片 →

一个 tick 内要做的事超出预算时,服务器的 tick 周期会被拉长,整个区域都会变慢或一卡一卡。

起因 一个 tick(例如 50 ms)要处理的工作超出预算 → 结果 本该每秒计算 20 次的游戏状态只算了 8 次 → 画面表现 整个区域慢动作(视服务器设计也可能是一卡一卡),技能反应慢

症状
慢动作, 操作延迟, 一卡一卡
因素
停顿
谁会遇到
特定地点/分线, 全服
何时出现
人多的时候, 晚高峰
负责方
主责 研发团队·服务器开发 · 配合 运维团队·系统运维
研发团队要做的事
削减昂贵的计算;把 tick 拆到多个线程;分散人数(分线);把 tick 处理时间记为指标。
运维团队要做的事
把 tick 耗时和各核心 CPU 使用率加入监控和告警;考虑单核性能(主频)高的 CPU 或实例。
数值参考
20 tick 服务器的预算为 50 ms,30 tick 为 33 ms,60 tick 为 16.7 ms。为了应对人突然涌入,平时只用预算的一半左右、留出余量比较安全。
监控图上
随人数/负载上升 · 服务器 tick 耗时、各场景/分线人数、游戏线程 CPU
查看位置
把服务器记录的 tick 处理时间(p99)、tick 超时次数与各场景/分线人数放在同一张图上看。没有 tick 指标时,用 pidstat -t 1 看单个游戏线程的 CPU 使用率
确认依据
人数集中的时刻 tick 耗时超出预算(20 tick 为 50 ms),期间游戏线程的 CPU 使用率一直贴近 100%
排除依据
tick 超时而游戏线程 CPU 却很低,是等待类原因(GC 停顿、锁、同步调用)。bcc runqlat 显示的运行队列延迟长,说明线程分不到 CPU,属于 CPU 不足或线程过多
确认手段
需要游戏服务器/客户端的日志和指标
深入了解
tick 延迟时的表现因服务器设计而异。每个 tick 把游戏状态推进固定时长(例如 50 ms)的服务器,游戏时间本身会变慢,表现为慢动作。按实际流逝的时间一次性推进的服务器能保住游戏进度的速度,但数据包变稀、每次移动幅度变大,看起来是一卡一卡、瞬移。无论哪种,操作的反应都会变慢。一个游戏线程负责整台服务器时,整台服务器都会变慢;按区域分线程时,只有那个区域变慢。也有像 EVE Online 这样的游戏,在大规模战斗中故意把游戏时间放慢最多 10 倍(Time Dilation),让计算跟上。
真实案例
CCP Games 2014: EVE Online HED-GP 大规模舰队战中的服务器过载

出处

  1. VALORANT's 128-Tick Servers Riot Games
    128 tick 服务器必须在 7.8125 ms 内完成一帧;按子系统测量服务器帧耗时,分配预算加以管理
  2. HED-GP Technical Retrospective: What a HED-ache CCP Games
    EVE Online 在过载时用 Time Dilation 放慢游戏时间,下限为 10%(慢 10 倍);平时节点 CPU 保持在 80% 以下
  3. Handling variation in time Unity
    固定间隔的模拟滞后时,会集中补跑追赶的步数,超出上限的时间直接丢弃,游戏时间因此比实际流得慢
  4. pidstat(1) — Linux manual page sysstat
    -t 同时显示进程下各线程的统计(CPU 使用率等)
  5. Demonstrations of runqlat, the Linux eBPF/bcc version IO Visor
    以直方图显示调度器运行队列延迟(任务等到分得 CPU 的时间)

相关原因

同一层:L9 服务器游戏进程

其他层中同样导致“慢动作”的原因

查看含图示和实验的原卡片