性能优化特性之:E0PD

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本文介绍了倚天实例上进行安全特性关闭以提升性能的特性:E0PD,并且从优化原理、使用方法、性能收益等方面做了详细阐述。

优化原理

E0PD是ARMv8.5扩展引入的一个硬件防护特性,它用来替代KPTI避免来自用户态的Meltdown漏洞攻击。KPTI技术通过在返回用户态时unmap kernel space的方式避免内核地址空间的暴露,因此在退出内核态时unmap内核页表以及在进入内核态时重新映射内核页表会带来极大性能开销。E0PD在硬件侧防护内核地址空间从而使内核可以绕过KPTI,因而带来性能提升。

在内核优化方面,开启E0PD绕过KPTI的代码如下(省略一些无关的代码片段)。在boot阶段,内核调用unmap_kernel_at_el0函数检测是否需要开启KPTI unmap内核地址空间功能,其中的重要一项检测就是调用kaslr_requires_kpti,在此函数内检查硬件是否支持E0PD并且内核是否打开E0PD,若是则返回false,表示不需要启用KPTI功能。

static int __kpti_forced; /* 0: not forced, >0: forced on, <0: forced off */
static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
        int scope)
{
  …………
  /* Useful for KASLR robustness */
  if (kaslr_requires_kpti()) {
    if (!__kpti_forced) {
      str = "KASLR";
      __kpti_forced = 1;
    }
  }
  …………
  /* Forced? */
  if (__kpti_forced) {
    pr_info_once("kernel page table isolation forced %s by %s\n",
           __kpti_forced > 0 ? "ON" : "OFF", str);
    return __kpti_forced > 0;
  }
  …………
}
/*
 * This check is triggered during the early boot before the cpufeature
 * is initialised. Checking the status on the local CPU allows the boot
 * CPU to detect the need for non-global mappings and thus avoiding a
 * pagetable re-write after all the CPUs are booted. This check will be
 * anyway run on individual CPUs, allowing us to get the consistent
 * state once the SMP CPUs are up and thus make the switch to non-global
 * mappings if required.
 */
bool kaslr_requires_kpti(void)
{
  if (!IS_ENABLED(CONFIG_RANDOMIZE_BASE))
    return false;
  /*
   * E0PD does a similar job to KPTI so can be used instead
   * where available.
   */
  if (IS_ENABLED(CONFIG_ARM64_E0PD)) {
    u64 mmfr2 = read_sysreg_s(SYS_ID_AA64MMFR2_EL1);
    if (cpuid_feature_extract_unsigned_field(mmfr2,
            ID_AA64MMFR2_E0PD_SHIFT))
      return false;
  }
  /*
   * Systems affected by Cavium erratum 24756 are incompatible
   * with KPTI.
   */
  if (IS_ENABLED(CONFIG_CAVIUM_ERRATUM_27456)) {
    extern const struct midr_range cavium_erratum_27456_cpus[];
    if (is_midr_in_range_list(read_cpuid_id(),
            cavium_erratum_27456_cpus))
      return false;
  }
  return kaslr_offset() > 0;
}

使用方法

使用Alinux3.2208及以后版本

Alinux3在2208版本(内核版本5.10.134)已默认启用 说明:从upstream打上E0PD相关patch(anck 5.10已经合入),

  • 3e6c69a arm64: Add initial support for E0PD
  • 92ac6fd arm64: Don't use KPTI where we have E0PD

编译内核时启用E0PD特性

如果需要自己编译内核,可以在编译参数中打开E0PD配置

CONFIG_ARM64_E0PD=y

性能收益

KPTI的内核地址空间map、unmap操作在通用路径上,所以E0PD对KPTI的优化影响广泛。在我们的测试中,E0PD优化对基础benchmark和E2E应该都带来了5-23%的大幅度性能提升。




---------------------------------------------------------------------------------------

更多调优信息,请参考:

龙蜥社区:https://openanolis.cn/

KeenTune SIG:https://openanolis.cn/sig/KeenTune

阿里云龙蜥操作系统专区:https://developer.aliyun.com/group/aliyun_linux

相关文章
|
4月前
|
消息中间件 存储 监控
后端接口性能优化分析-多线程优化(上)
后端接口性能优化分析-多线程优化
194 0
|
4月前
|
缓存 NoSQL Java
后端接口性能优化分析-多线程优化(中)
后端接口性能优化分析-多线程优化
111 0
|
存储 固态存储 关系型数据库
性能优化特性之:16K原子写
本文介绍了在倚天实例上进行内存优化的调优特性:16K原子写 的优化原理、使用方法。
|
监控 算法 测试技术
性能优化之几种常见压测模型及优缺点 | 陈显铭
上一篇讲的是《性能优化的常见模式及趋势》,今天接着讲集中常见的压测模型。通过上一章我们大概知道了性能优化的一些招式,但是怎么发现有性能问题,常见的模式还是需要压测。
5835 0
|
2月前
|
缓存 监控 NoSQL
深入解析数据库性能优化:策略与实践
【7月更文挑战第23天】数据库性能优化是一个复杂而持续的过程,涉及硬件、软件、架构、管理等多个方面。通过本文的介绍,希望能够为读者提供一个全面的性能优化框架,帮助大家在实际工作中更有效地提升数据库性能。记住,优化不是一蹴而就的,需要持续的观察、分析和调整。
|
4月前
|
机器学习/深度学习 并行计算 数据挖掘
NumPy性能优化技巧系列:打造高效数据处理流程
【4月更文挑战第17天】本文介绍了优化Python中NumPy性能的五大技巧:1) 使用内置函数代替循环;2) 避免不必要的数据复制,利用`inplace`和视图;3) 选择合适的数据类型以减少内存占用;4) 优化数组形状和内存布局,保持连续性;5) 利用并行计算库如`numba`加速计算。这些技巧能提升数据处理效率,降低资源消耗,适应大规模数据处理需求。
|
4月前
|
并行计算 数据挖掘 数据处理
Pandas性能优化与高级功能:让数据处理更高效
【4月更文挑战第16天】本文探讨了如何优化Pandas的性能和利用其高级功能。关键的性能优化方法包括选择合适的数据类型、避免数据复制、使用向量化操作、优化查询和索引,以及探索并行计算。高级功能涉及分组聚合、窗口函数、数据透视表、缺失值处理和分类数据编码。通过这些技巧,可以更高效地处理大规模数据集。
|
4月前
|
缓存 NoSQL Redis
接口性能优化的小技巧
接口性能优化的小技巧
|
4月前
|
缓存 NoSQL Java
后端接口性能优化分析-多线程优化(下)
后端接口性能优化分析-多线程优化
177 0
|
存储 编译器 C语言
性能优化特性之:LTO
本文介绍了倚天实例上的编译优化特性:LTO,并从优化原理、使用方法进行了详细阐述。