
# 如何解决Linux ECS更新内核后出现的性能下降问题？
#### 问题描述
对于部分类型的Linux系统ECS，在完成内核升级或操作系统版本更新后，其整体性能或特定应用性能可能出现可感知的下降。
当前主要涉及如下类型实例规格：
- 通用计算增强型：aC9s、aC9、aC8h、aC8、aC7
- 内存优化型：aM9、aM8、aM7
 
#### 可能原因
出现该类型性能变化的根本原因，是由于Linux内核社区为修复特定的CPU安全漏洞（Speculative Return Stack Overflow - SRSO，也被称为CVE-2023-20569）所引入的安全缓解措施。
- 安全漏洞（SRSO）：是一种推测执行侧信道漏洞，可能允许攻击者利用CPU的推测执行机制访问未经授权的内存数据。
- 内核缓解措施（SafeRET）：为了修复SRSO漏洞，Linux内核在较新版本中默认合入了名为SafeRET的软件缓解补丁。
- SafeRET机制通过增加额外的安全检查和指令序列来阻止攻击，这些操作会在特定工作负载下引入额外的CPU开销。正是这些开销可能导致实例性能下降。经该系统官方评估认为，在典型的服务器生产环境中，SRSO漏洞的实际安全风险等级相对较低。
您可以根据业务场景对安全性与性能的优先级评估，选择是否禁用SafeRET缓解措施。
#### 处理方法一：保持现状（默认安全配置）
![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/caution_3.0-zh-cn.png)
如果您认为ECS当前的性能可以接受，或者业务对潜在的安全风险（尽管较低）更为敏感，则无需进行任何操作。实例将继续运行在包含SRSO修复的安全状态。
当前状态验证步骤：
执行以下命令，查看当前生效的缓解措施。
```
grep . /sys/devices/system/cpu/vulnerabilities/*
```
在返回结果中，可以查找"spec_rstack_overflow"项。如果显示"Mitigation: SafeRET"或类似启用缓解的信息，则表示SafeRET已启用。
#### 处理方法二：禁用SafeRET缓解措施（以提升性能）
![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/caution_3.0-zh-cn.png)
如果性能下降对您的业务影响显著，且您评估后愿意接受与SRSO漏洞相关的潜在安全风险，可以通过在内核启动参数中添加mitigations=off来禁用SafeRET。
禁用此缓解措施会降低实例对SRSO漏洞的防护能力。请在充分理解风险并确认业务可接受此风险后进行操作。强烈建议仅在对性能要求极为苛刻且安全环境相对可控的场景下考虑禁用。
**以下步骤需要root权限，操作错误可能导致系统无法启动，请谨慎执行并提前备份重要数据。建议先在测试环境验证。**
1. 修改 GRUB 配置。
   1. 执行以下命令，使用文本编辑器（如 vim 或 nano）打开/etc/default/grub文件：
      ```
      sudo vi /etc/default/grub
      ```
      
   
   2. 找到以"GRUB_CMDLINE_LINUX="开头的行。该行通常在双引号（" "）内包含已有的内核启动参数。
   
   3. 在该行双引号内的参数列表末尾添加"mitigations=off"，禁用SafeRET。 确保在已有参数之后、结束双引号之前添加，并保留一个空格分隔。例如：
      ```
      GRUB_CMDLINE_LINUX="...原有参数... mitigations=off"
      ```
      
   
   4. 保存并退出编辑器。
    
2. 更新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
   ```
   
3. 执行以下命令，重启实例。
   ```
   sudo reboot
   ```
   
4. 实例重启后，执行以下命令，验证禁用是否生效。
   ```
   grep . /sys/devices/system/cpu/vulnerabilities/*
   ```
   检查"spec_rstack_overflow"项。如果显示"Vulnerable"、"Not affected"（在某些内核版本）或明确表示缓解已禁用，则表示SafeRET已成功禁用。
   
 
