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

游戏卡顿白皮书 › 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 更新和游戏版本更新放在同一天,就很难分清原因,所以要分开发布。

出处

  1. The kernel’s command-line parameters Linux kernel
    mitigations=:off 关闭所有 CPU 漏洞缓解以提升性能,但会暴露在漏洞之下;默认 auto 在开启 SMT 的情况下缓解;auto,nosmt 在需要时关闭 SMT
  2. MDS - Microarchitectural Data Sampling Linux kernel
    缓解措施会在从内核返回用户空间和进入虚拟机时清空 CPU 缓冲区;通过 /sys/devices/system/cpu/vulnerabilities/ 下的文件确认漏洞和缓解状态;很多 CPU 要彻底防住必须关闭 SMT,关闭 SMT 后视工作负载不同,性能影响很大
  3. Spectre Side Channels Linux kernel
    为了缓解,在上下文切换、虚拟机切换时清空分支预测缓冲区;强力缓解会给所有程序增加开销
  4. EEVDF Scheduler Linux kernel
    Linux 从 6.6 开始从 CFS 迁移到 EEVDF 调度器
  5. listen(2) — Linux manual page Linux man-pages
    somaxconn 默认值从 Linux 5.4 起由 128 改为 4,096
  6. ethtool(8) — Linux manual page ethtool
    用 ethtool -i 查询网络设备的驱动信息

相关原因

同一层:L7 服务器操作系统(内核)

其他层中同样导致“操作延迟”的原因

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