native-turbo特性
简介
大型程序的代码段、数据段可达数百MB,关键业务流程TLB miss较高。内核页表大小对性能有影响。
为了方便用户使用大页,native-turbo特性实现了加载程序时自动使用大页的功能,可以针对代码段、数据段使用大页。
使用方法
打开特性开关
该特性有两级开关,sysctl fs.exec-use-hugetlb用于控制本系统是否打开该特性(由root用户控制,0不打开,1打开,其他值非法)。
如果不打开该开关,即使用户设置了环境变量也不会使用该特性,内核会忽略相关流程。
系统打开该特性后,普通用户可以通过环境变量HUGEPAGE_PROBE自行决定运行的程序是否需要使用大页(1使用,不设置或其他值不使用)。
sysctl fs.exec-use-hugetlb=1 #主程序使用大页 export HUGEPAGE_PROBE=1 #动态库使用大页
动态库大页也可以使用LD_HUGEPAGE_LIB=1环境变量强制所有段使用大页。
标记需要使用大页的段,默认标记所有段,-x表示仅代码段,-d清除已有标记。
hugepageedit [-x] [-d] app
该工具由glibc-devel包提供。
启动程序
./app
约束限制
程序与动态库必须按照2M对齐编译,可通过添加如下gcc编译参数实现:
-zcommon-page-size=0x200000 -zmax-page-size=0x200000
使用前需要预留足够的大页,否则程序会执行失败。
如果使用cgroup,请注意hugetlb的限制,如果限制小于所需大页数量,可能导致运行时崩溃。
由于进程页表改为2M,mprotect等系统调用的参数需要按2M对齐,否则会执行失败。
不支持libcareplus热补丁机制。
多个进程间无法共享大页,会消耗多倍内存。