
# 内核代码大页
#### 背景说明
对于一些代码段较大，访问频次较高的应用，会导致较高的TLB miss，HCE支持代码大页特性(提供配置参数，默认关闭可手动开启)，支持将应用程序的可执行部分放入到大页中, 以降低程序的TLB 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。
 
