更新时间:2025-07-21 GMT+08:00

内核代码大页

背景说明

对于一些代码段较大,访问频次较高的应用,会导致较高的iTlb miss,HCE支持代码大页特性(提供配置参数,默认关闭可手动开启),支持将应用程序的可执行部分放入到大页中, 以降低程序的iTLB miss,提升数据库(MySQL)、大型应用软件等大代码段应用性能。

使用说明

  • 检查内核启动参数是否包含exec_hugepages,若无则要添加上才能使用该功能(需要重启)。
  • 为单个程序开启代码大页
    HUGEPAGE_ELF=1 ./app    // 该环境变量不会被复制到子进程。HUGEPAGE_ELF=0时应用程序不使用大页。
  • 为被hugepageedit标记的程序开启
    export HUGEPAGE_PROBE=1    // 导出环境变量HUGEPAGE_PROBE。该环境变量可被复制到子进程。
    hugepageedit ./app         // 使用hugepageedit工具标记欲使能程序的二进制文件,glibc-devel包提供hugepageedit工具。
    ./app                      // 启动使能代码大页的程序。
  • 全局开启代码大页
    echo 1 > /sys/kernel/mm/exec_hugepages/enabled    // echo 0时关闭,且默认为0。开启后启动符合条件的程序会自动使用代码大页
  • 查看是否启用
    cat /proc/进程号/smaps | grep eh    // 若有被标记eh的则说明成功启用

约束限制

  • 程序未按照2MB对齐编译时,每段中不足2MB的部分无法使用大页,建议对齐使用。
  • mprotect系统调用要求传入的地址按2M对齐、大小为2M的倍数,程序代码需要进行适配修改。

    2MB地址对齐需要重新编译程序,并在链接器选项中加入"-Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152"

  • 大页预留不足时会尝试申请2MB页,如果由于内存碎片等原因申请失败时,程序会回退至小页。程序中多个线程进入回退小页流程会触发SIGBUS。