游戏卡顿白皮书 › L7 服务器操作系统(内核)
OS/内核/驱动/固件更新后的性能变化 Performance regression after OS / kernel / driver / firmware update
原因 ID so-os-update · 主责 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
游戏代码没变,服务器的 OS、内核、驱动、固件更新之后却开始变慢。更新可能会改变默认值、调度器、CPU 漏洞缓解措施(mitigations)和驱动行为。
起因 定期安全补丁或新的服务器镜像更换了内核、驱动、固件 → 结果 默认值、调度器变了,或新的漏洞缓解被开启,同样的工作要花更多 CPU 时间,线程获得 CPU 的顺序也变了 → 画面表现 原本正常的服务器从更新那天起一直慢一点,表现为操作延迟;人一多就一卡一卡、慢动作
- 症状
- 操作延迟, 一卡一卡, 慢动作
- 因素
- 延迟, 停顿, 抖动
- 谁会遇到
- 全服
- 何时出现
- 一直, 人多的时候
- 负责方
- 主责 运维团队·系统运维
- 运维团队要做的事
- 更新先在部分服务器上应用,与旧版本对比 tick 耗时、延迟、CPU 使用率后再扩大范围;与游戏版本更新错开日期发布;记录更新前后的内核、驱动、固件版本和主要 sysctl 值;出问题时用旧内核启动确认;关闭缓解的设置(mitigations=off)要权衡安全风险后再决定。
- 数值参考
- 内核版本一变,默认行为也会变。例如 Linux 从 6.6 开始把调度器从 CFS 迁移到 EEVDF,连接队列上限(somaxconn)的默认值也从 5.4 起由 128 改为 4,096。CPU 漏洞缓解会增加额外工作,比如从内核返回用户程序时(每次系统调用结束时)以及上下文切换、虚拟机切换时清空 CPU 内部缓冲区,所以每个包都要发起系统调用的网络服务器受影响更大。有些漏洞要彻底防住必须关闭 SMT(把一个核心当两个线程用的功能),而关闭 SMT 后,视工作负载不同,性能可能大幅下降。内核参数 mitigations=off 会关闭所有这些缓解措施、找回性能,但也会暴露在漏洞之下。
- 监控图上
- 某一时刻起台阶式上升 · 服务器 tick 耗时、CPU 使用率、相同负载下的延迟
- 查看位置
- 把包管理器的更新记录和重启时刻、uname -r 显示的内核版本、ethtool -i 显示的网卡驱动信息,与延迟上升的时刻对照。在相同负载下用 mpstat、pidstat 对比已更新和未更新的服务器,并对比 /sys/devices/system/cpu/vulnerabilities/ 中的缓解状态
- 确认依据
- 延迟、CPU 使用率从更新后重启的时刻起台阶式上升并保持,相同负载下只有已更新的服务器偏高。用旧内核、旧驱动启动后恢复
- 排除依据
- 已更新和未更新的服务器在相同负载下同样慢,则不是这个原因。同一天也发布了游戏版本更新,且每个玩家的包数、包大小有变化,看“版本更新导致流量特征变化”
- 确认手段
- 运维工具即可确认(无需游戏代码)
- 深入了解
- 缓解状态可以在 /sys/devices/system/cpu/vulnerabilities/ 下的文件中确认。默认值(mitigations=auto)在保持 SMT 开启的情况下做缓解;设为 auto,nosmt 时,会在有漏洞的 CPU 上关闭 SMT,升级内核后逻辑核心数可能减半。OS 更新和游戏版本更新放在同一天,就很难分清原因,所以要分开发布。
出处
- The kernel’s command-line parameters Linux kernel
mitigations=:off 关闭所有 CPU 漏洞缓解以提升性能,但会暴露在漏洞之下;默认 auto 在开启 SMT 的情况下缓解;auto,nosmt 在需要时关闭 SMT - MDS - Microarchitectural Data Sampling Linux kernel
缓解措施会在从内核返回用户空间和进入虚拟机时清空 CPU 缓冲区;通过 /sys/devices/system/cpu/vulnerabilities/ 下的文件确认漏洞和缓解状态;很多 CPU 要彻底防住必须关闭 SMT,关闭 SMT 后视工作负载不同,性能影响很大 - Spectre Side Channels Linux kernel
为了缓解,在上下文切换、虚拟机切换时清空分支预测缓冲区;强力缓解会给所有程序增加开销 - EEVDF Scheduler Linux kernel
Linux 从 6.6 开始从 CFS 迁移到 EEVDF 调度器 - listen(2) — Linux manual page Linux man-pages
somaxconn 默认值从 Linux 5.4 起由 128 改为 4,096 - ethtool(8) — Linux manual page ethtool
用 ethtool -i 查询网络设备的驱动信息
相关原因
同一层:L7 服务器操作系统(内核)
其他层中同样导致“操作延迟”的原因
查看含图示和实验的原卡片