内核代码大页
背景说明
对于一些代码段较大,访问频次较高的应用,会导致较高的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。