问题描述
现象:在完成 Linux 内核升级或操作系统版本更新后,实例的整体性能或特定应用的性能可能出现可感知的下降。
影响范围:该现象主要影响搭载 AMD EPYC 处理器的 CVM 实例。
问题原因
此性能变化的根本原因在于 Linux 内核社区为修复特定的 AMD CPU 安全漏洞(Speculative Return Stack Overflow - SRSO,也被称为 CVE-2023-20569)所引入的安全缓解措施。
安全漏洞 (SRSO):SRSO 是一种推测执行侧信道漏洞,可能允许攻击者利用 CPU 的推测执行机制访问未经授权的内存数据。AMD 官方已发布相关安全公告和白皮书(可参见 AMD EPYC SRSO 白皮书)。
内核缓解措施 (SafeRET):为了修复 SRSO 漏洞,Linux 内核在较新版本中默认合入了名为 SafeRET 的软件缓解补丁。
性能影响:SafeRET 机制通过增加额外的安全检查和指令序列来阻止攻击,这些操作会在特定工作负载下引入额外的 CPU 开销。正是这些开销可能导致实例性能下降。AMD 官方评估认为,在典型的服务器生产环境中,SRSO 漏洞的实际安全风险等级相对较低(可参见 AMD EPYC SRSO 白皮书)。
解决方案与操作指南
用户可以根据自身业务场景结合对安全性与性能的优先级评估,选择是否禁用 SafeRET 缓解措施。
选项一:保持现状(默认安全配置)
说明:如果您认为实例当前的性能可以接受,或者业务对潜在的安全风险(尽管较低)更为敏感,则无需进行任何操作。实例将继续运行在包含 SRSO 修复的安全状态。
验证当前状态:
运行以下命令查看当前生效的缓解措施:
grep . /sys/devices/system/cpu/vulnerabilities/*
在输出结果中查找
spec_rstack_overflow
项。如果显示 Mitigation: SafeRET
或类似启用缓解的信息,则表示 SafeRET 已启用。选项二:禁用 SafeRET 缓解措施(以提升性能)
说明:如果性能下降对您的业务影响显著,且您评估后愿意接受与 SRSO 漏洞相关的(AMD 评估为较低的)潜在安全风险,可以通过在内核启动参数中添加
spec_rstack_overflow=off
来禁用 SafeRET。重要警告:禁用此缓解措施会降低实例对 SRSO 漏洞的防护能力。请在充分理解风险并确认业务可接受此风险后进行操作。腾讯云强烈建议仅在对性能要求极为苛刻且安全环境相对可控的场景下考虑禁用。
操作步骤(通用方法):
警告:
以下步骤需要 root 权限,操作错误可能导致系统无法启动,请谨慎执行并提前备份重要数据。建议先在测试环境验证。
修改 GRUB 配置:
a. 使用文本编辑器(如 vim 或 nano)打开
/etc/default/grub
文件:sudo vi /etc/default/grub
b. 找到以
GRUB_CMDLINE_LINUX=
开头的行。该行通常在双引号" "
内包含已有的内核启动参数。c. 禁用 SafeRET:在该行双引号内的参数列表末尾添加
spec_rstack_overflow=off
。确保在已有参数之后、结束双引号之前添加,并保留一个空格分隔。例如:GRUB_CMDLINE_LINUX="...原有参数... spec_rstack_overflow=off"
d. 保存并退出编辑器。
更新 GRUB 配置:
对于使用 GRUB2 的系统(大多数现代发行版如 CentOS 7/8/9,Ubuntu 18.04/20.04/22.04/24.04,Debian 10/11/12,AlmaLinux,Rocky Linux 等):
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 通常适用于 RHEL/CentOS 系统#或sudo update-grub # 通常适用于 Debian/Ubuntu 系统
对于使用 GRUB 的较旧系统:
sudo update-grub
重启实例:
sudo reboot
验证禁用是否生效:
实例重启后,再次运行验证命令:
grep . /sys/devices/system/cpu/vulnerabilities/*
检查
spec_rstack_overflow
项。如果显示 Vulnerable: AMD Zen4
或 Not affected
(在某些内核版本) 或明确表示缓解已禁用,则表示 SafeRET 已成功禁用。 (可选) 特定工具辅助:
如果您的发行版预装了 grubby 工具(常见于 RHEL 及其衍生版),可以使用更简洁的命令禁用:
sudo grubby --update-kernel=ALL --args="spec_rstack_overflow=off"sudo reboot