游戏卡顿白皮书 › L7 服务器操作系统(内核)
系统时钟跳变(NTP step) Wall-clock jump (NTP step)
原因 ID so-timejump · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
服务器时钟一次性向前或向后调整几秒时,依赖系统时钟的定时器会一下子集中触发或停住。
起因 时间同步一次性大幅调整时钟 → 结果 定时器集中触发或停住,超时判定出错 → 画面表现 buff/冷却异常、集体掉线、快进
- 症状
- 快进, 掉线, 吞操作/回档
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 偶尔随机
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
- 研发团队要做的事
- 经过时间、超时、冷却时间都用不会跳变或倒退的单调时钟(monotonic clock)计算,墙上时钟(wall clock)只用于显示和记录。
- 运维团队要做的事
- 时钟采用缓慢调整(chrony 的 makestep 只在刚启动时生效);监控时间同步状态(时钟偏差)。
- 数值参考
- ntpd 在偏差超过 0.128 秒时一次性校准,偏差更小时缓慢校准,消除 1 秒偏差要 30 分钟出头。现在常用的 chrony 在推荐设置(makestep)下,只在启动后的前几次一次性校准,之后都缓慢校准。虚拟机短暂停住后恢复时,时钟也会跳变。
- 监控图上
- 偶发随机尖峰 · 定时器触发次数、断开次数,时钟调整记录
- 查看位置
- 在时间同步服务的日志里找一次性大幅调整时钟的记录,与出现异常的时刻对照。chrony 在调整幅度超过 logchange 设定值(默认 1 秒)时会写入 syslog
- 确认依据
- 出现 buff/冷却异常、集体掉线、快进的时刻有时钟调整记录,且调整幅度与异常的大小相近
- 排除依据
- 没有时钟调整记录则不是这个原因。虚拟机还要看停住后恢复的情况(“云宿主机维护/热迁移”)
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- ntpd - Network Time Protocol (NTP) daemon Network Time Foundation
偏差超过步进阈值 128 ms 时一次性校准,较小时缓慢校准;每秒校准 0.5 ms,校准 1 秒需要 2,000 秒(约 33 分钟) - chrony – Frequently Asked Questions chrony
推荐像 makestep 1 3 这样只在启动后的前几次允许步进;停住后恢复的虚拟机醒来时时间可能已经偏了 - clock_gettime(2) — Linux manual page Linux man-pages
CLOCK_MONOTONIC 不受系统时钟不连续跳变的影响,也不会倒退 - chrony.conf(5) chrony
logchange:时钟调整幅度超过这个值(默认 1 秒)时写入 syslog
相关原因
同一层:L7 服务器操作系统(内核)
其他层中同样导致“快进”的原因
查看含图示和实验的原卡片