如何冻结 OS 内核版本并防止自动升级导致性能差异

解读

性能测试对“环境一致性”极度敏感,内核版本差异会直接影响调度器、文件系统、TCP 协议栈、内存管理、KPTI/Retbleed 等安全补丁带来的开销,导致同一脚本前后两次跑出的 TPS、RT、CPU 利用率出现 5%–30% 的漂移。国内主流生产环境以 CentOS 7/8、Alibaba Cloud Linux 2/3、Ubuntu 20.04 LTS、麒麟 V10、统信 UOS 为主,面试时考官想确认三件事:

  1. 你是否意识到内核升级是性能基线漂移的隐形杀手;
  2. 你是否熟悉国内常用发行版的“锁版本”机制;
  3. 你能否在“安全合规”与“性能稳定”之间给出可落地的权衡方案。

知识点

  1. RPM 系(CentOS/RHEL/AliyunLinux)
    • yum-plugin-versionlock 与 dnf versionlock 用法差异
    • /etc/yum.conf 里 exclude=kernel* 的写法
    • grub2-set-default 与 /etc/default/grub 中 GRUB_DEFAULT=saved 的配合
    • kexec-tools 禁用防止热替换内核
  2. DEB 系(Ubuntu/Debian/UOS)
    • apt-mark hold linux-image-generic linux-headers-generic
    • /etc/apt/preferences.d/99-kernel-pin 的 Pin-Priority 1001 写法
    • update-grub 后 grub-install 固化启动项
  3. 云厂商特有机制
    • 阿里云“热补丁”AliyunHotFix 服务需 systemctl disable aliyun-hotfix
    • 腾讯云“内核热替换”需关闭 tlinux-auto-kernel
  4. 性能基线管理
    • 使用 uname -r、/proc/version、rpm -qa | grep kernel 记录基线
    • 把内核版本写入 Dockerfile 基础镜像 tag,禁止 latest
    • 在 CI 中增加“内核漂移”门禁:对比 /etc/os-release 与性能实验室基线,不一致直接拒绝流水线
  5. 合规与应急
    • 内核 CVE 修复走“灰度内核”方案:先让 1% 节点升级,跑 24 h 性能回归无劣化再全量
    • 对金融、证券、运营商客户,需出具《内核版本冻结申请单》由安全部门签字,避免合规审计风险

答案

以 CentOS 7 为例,生产环境冻结内核的完整步骤如下:

  1. 查看当前性能基线内核
    uname -r → 3.10.0-1160.71.1.el7.x86_64
  2. 安装锁版本插件
    yum -y install yum-plugin-versionlock
  3. 把内核及相关包一次性加锁
    yum versionlock add kernel-3.10.0-1160.71.1.el7
    yum versionlock add kernel-devel-3.10.0-1160.71.1.el7
    yum versionlock add kernel-headers-3.10.0-1160.71.1.el7
  4. 配置 yum 全局排除,双保险
    echo "exclude=kernel*" >> /etc/yum.conf
  5. 固化启动项,防止 grub2 自动把新内核设为默认
    grub2-set-default 'CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)'
    sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=saved/' /etc/default/grub
    grub2-mkconfig -o /boot/grub2/grub.cfg
  6. 禁用 kexec 热替换
    systemctl disable --now kexec
    echo "kernel.kexec_load_disabled = 1" >> /etc/sysctl.conf
  7. 验证
    yum update 模拟执行,确认无 kernel 相关包被列出
    reboot 后 uname -r 仍返回 3.10.0-1160.71.1.el7.x86_64
  8. 把上述步骤写成 Ansible playbook,纳入 GitLab CI;任何新镜像必须跑完 playbook 并回显“kernel locked”日志,才能进入性能基准库

Ubuntu 20.04 同理,用 apt-mark hold 与 /etc/apt/preferences.d 实现即可;若主机在阿里云,还需 systemctl disable aliyun-hotfix,防止“零重启热补丁”引入新的内核函数开销。

拓展思考

  1. 内核冻结后,如何“可灰度、可回滚”地验证 CVE 补丁对性能的影响?
    答:使用 kata-containers 或 systemd-nspawn 启动新内核容器,跑同一 JMeter 脚本,对比 RT 与 CPU 利用率;劣化<2% 可接受,否则提交补丁 revert 申请。
  2. 如果业务方要求“必须开热补丁”,怎样把性能差异量化到 SLA?
    答:在 nightly 性能基准里加入“热补丁开关”维度,建立两条基线:cold-kernel 与 hotfix-on;上线前把两条曲线差异折算成 TPS 损耗,写入 SLA 补充条款,允许 3% 损耗上限。
  3. 多架构场景(x86 + ARM)内核版本如何统一管理?
    答:使用企业内部 yum/apt 私有仓库,按 arch 子目录存放 rpm/deb;通过 repo 的 priority=1 强制拉取指定版本,Ansible 变量文件里按 arch 区分 kernel 包名,保证 x86 与 ARM 的基准内核同步冻结。