游戏卡顿白皮书 › 按症状查找
吞操作/回档:36 个原因及负责方
又称:吞技能、物品回退、交易失败
在含图示的完整版症状词典中打开 →
明明做了的操作像没发生过,或者结果过了好一阵又被推翻。
按了技能却没放出来。买的物品不见了,或者重新登录后回到几分钟前的状态。
要么请求丢了(丢包、队列溢出),要么服务器的判定和自己画面上的不一样(判定时间点不同、预表现后被拒绝),要么保存时失败了(DB 锁、DB 故障、服务器崩溃)。
导致此症状的原因
L1 客户端游戏进程
- 时钟同步误差: 客户端估算的服务器时间不准时,插值时间点和冷却判定都会错位。 (研发团队·客户端开发)
L5 数据中心网络设备
- 云 NAT 网关连接/端口上限: 私有子网中的服务器访问外部(平台认证、支付、外部 API)时,由 NAT 网关替换地址和端口后发出。发往同一目的地的并发连接超过网关的端口上限,新连接就会失败。 (运维团队·网络运维)
- 交换机微突发: 多台服务器在同一瞬间向数千名玩家集中发包时,这些流量汇聚的交换机端口缓冲区很小,不到 1 ms 就会溢出。 (研发团队·服务器开发)
L6 服务器网卡
- 环形缓冲区不足: 网卡用来暂存数据包的环形缓冲区太小时,流量瞬间涌入就会溢出,数据包被丢弃。 (运维团队·系统运维)
- 超出云 PPS 上限: 云服务器每种规格都有每秒包数和带宽上限,超出部分会被悄悄丢弃。 (运维团队·系统运维)
L7 服务器操作系统(内核)
- OOM Killer: Linux 在内存耗尽时,会挑出占用内存最多的进程强制杀掉,通常就是游戏服务器。 (研发团队·服务器开发)
- 系统时钟跳变(NTP step): 服务器时钟一次性向前或向后调整几秒时,依赖系统时钟的定时器会一下子集中触发或停住。 (研发团队·服务器开发)
- 服务器间连接的临时端口耗尽: 游戏服务器频繁地与 DB 或其他服务器建立短连接又断开时,断开的连接会在一段时间内占着端口,导致新连接打不开。 (研发团队·服务器开发)
L8 Socket 与协议
- 可靠 UDP 重传配置: 在 UDP 之上自己实现的重传规则太保守,恢复就慢;太激进,又会让线路更堵。 (研发团队·服务器开发)
L9 服务器游戏进程
- 消息队列积压: 请求进来的速度超过处理速度、在队列里堆积时,排在后面的请求要过几秒才被处理,或者被丢弃。 (研发团队·服务器开发)
- 服务器崩溃: 服务器进程因未处理的错误而崩溃时,这台服务器上的所有人会同时掉线。 (研发团队·服务器开发)
- 版本更新导致流量特征变化: 新内容、特效、同步项增加了数据包的大小和频率,原本正常的服务器在版本更新后开始碰到 MTU、带宽、包数的上限。 (研发团队·服务器开发)
L11 磁盘
- 磁盘写满: 日志和 dump 堆积把磁盘写满后,写入会失败;没有做好应对,服务器就会崩溃。 (运维团队·系统运维)
L12 数据库
- 热点行锁竞争: 所有人都要修改同一行(公会仓库、拍卖行热门物品、全服计数器)时,同一时刻只有一个人能拿到锁。 (研发团队·服务器开发)
- DB 死锁: 两个事务(作为一个整体处理的一组 DB 操作)互相等待对方锁住的行时,DB 会强制取消其中一个。 (研发团队·服务器开发)
- 复制延迟: 写入走主库、读取走从库时,如果从库同步落后,刚写入的内容就读不到。 (运维团队·数据库运维)
- 大型批处理任务: 在运营期间跑排行榜统计、批量发邮件、清理旧数据,会占用锁和磁盘。 (研发团队·服务器开发)
- DB 故障切换: 主库宕机、切换到备库期间无法写入,最后一部分没来得及复制的数据可能会丢失。 (运维团队·数据库运维)
- 存盘间隔过长导致进度丢失: 为减轻负载,几分钟才存一次盘,期间服务器一旦崩溃,进度就会丢失。 (研发团队·服务器开发)
- 长事务: 一个事务长时间不结束,就会一直持有锁,DB 也没法清理(purge)旧版本数据,整体逐渐变慢。 (研发团队·服务器开发)
- 线上表结构变更(DDL)锁: 在服务运行中给表加列或加索引,仅仅因为一个短暂需要的锁,使用这张表的所有请求都可能被迫等待。 (运维团队·数据库运维)
L13 服务器架构与运维
- 辅助服务器故障: 聊天、组队、拍卖行这类与游戏服务器分开运行的服务器出故障时,只有对应的功能不能用。 (研发团队·服务器开发)
- 服务器之间的时钟差: 每台服务器的时钟略有差异时,冷却、buff、活动开始的判定在不同服务器上就会对不上。 (运维团队·系统运维)
- 依赖外部服务: 平台登录、支付、实名认证这类外部服务变慢或停摆时,流程会卡在那一步。 (外部·外部)
- 匹配/区域分配错误: 没有分到近的区域(region),被分到远区域的服务器,即使线路正常,也只有这个玩家 ping 一直偏高。 (研发团队·服务器开发)
- TLS 证书过期/配置错误: 登录、API、补丁服务器的证书过期或缺少中间证书时,从那一刻起新建连接的客户端 TLS 连接都会失败。 (运维团队·网络运维)
同步设计
- 技能不支持预输入: 必须等服务器确认上一个技能结束后才能按下一个技能时,每次衔接中间都会插入一段往返时间。 (研发团队·客户端开发)
- 被 ping 吃掉的短判定窗口: 闪避、弹反、格挡这类需要反应的时间很短时,ping 会把这段时间吃掉,出现躲不开的攻击。 (研发团队·服务器开发)
- 没有延迟补偿的判定: 服务器只按“当前服务器上的位置”判定命中时,自己看到的画面就会与判定结果对不上。 (研发团队·服务器开发)
- 延迟补偿过度: 按攻击者的视角回溯得太远时,被打的一方明明已经躲好了,还是会被打中。 (研发团队·服务器开发)
- 客户端权威: 各自决定自己的结果,自己的画面很流畅,但结果会与别人的画面对不上,也容易被外挂利用。 (研发团队·服务器开发)
- 过于严格的服务器校验: 服务器对移动速度、冷却、射程检查得过于严格时,连因抖动扎堆到达的正常输入也会被拒绝。 (研发团队·服务器开发)
- 预表现后被服务器拒绝: 在自己画面上先显示出来的命中、技能,服务器事后不认可时,明明看到的结果就当没发生过。 (研发团队·客户端开发)
- 快照发送频率低: 服务器每秒只发几次位置更新(快照)时,插值缓冲就得相应拉长,看到的其他角色也就是更久以前的状态。 (研发团队·服务器开发)
只有部分人遇到的问题
查看含图示的完整版症状词典