1、王荣巍阿里云研发工程师代码大页:针对应用代码代码大页:针对应用代码段的一种大页优化特性段的一种大页优化特性/目 录/01 行业、技术背景02 实现、性能和使用03 社区04 其他想法背景 代码大页 社区 参考目录05 参考 平时工作:Linux内存管理、稳定性问题;最近开始对开源CPU感兴趣;工具偏好:crash、systemtap、printk;桌上足球老后卫;BIOWeixin ID:Twitter:rainpplus行业 技术背景关于大页,可以列举出好几种:THP、hugetlb,全局大页64K和16K;THP:主要分为页表PMD或PUD映射,当前用户态使用的大页基本为2M PMD映射大
2、页。Hugetlb:一种显式的大页使用方式,提供的大页选择比THP更多。全局大页:主要指base pagesize大小大于4K,例如arm64支持16K和64K两种粒度页。大页TLB是一种页表的缓存,按类型可以分为iTLB/dTLB,按大小可以分为2M iTLB或4K iTLB或1G dTLB;iTLB/dTLB:指用于数据和指令的TLB硬件资源。某些平台存在STLB,可缓存数据和指令的页表。2M iTLB/4K iTLB/1G dTLB:目前我们使用的架构中用于缓存2MB大页和4 KB页的TLB entry资源存在两种形式:分离或混合,以Skylake为例,每个超线程用于2 MB大页的iTL
3、B资源仅8个,用于4K页的TLB资源有128个。另外,arm64上是混合使用的。TLBhugetlbarm64x86THPTHPGlobal large pagesizehugetlb16K64K目前我们云上熟知的两种架构:x86和arm,在支持的大页可选性存在差异,主要原因还是与CPU硬件特性或者说与页表特性有关。64K2M32M1G2M1GGlobal large pagesize差异:我们俗称全局大页,尽管arm64有16K和64K选择,但是我们目前仍旧在使用4K。Hugetlb差异:在arm64上由于页表支持CONT bit,可实现16 PTEs、16 PMDs映射支持,即64 KB和
4、32 MB大页支持,当前仅hugetlb实现了此类大页;差异特点描述介绍几种典型的应用:Mysql、Postgresql和OceanBase。多进程模型,代码段大小大约10M左右;应用iTLB-load-misses较高,大约1.41%左右;PostgreSQL数据库Mysql是一个多线程模式的数据库,其代码段大小一般18M左右;THP不敏感,打开THP,大约仅有不到3%的性能提升;跨NUMA敏感,本地虚拟机32核验证跨NUMA抖动在57%左右;Mysql数据库多线程模型,代码段大小打印200M280M;一般独占单机使用,性能验证过程中并发数要求高:128、1000、1500;THP本地验证不
5、敏感;OceanBase数据库共同特征:代码段大、iTLB Miss高-THP代码大页方案对比:社区社区vsvs我们我们为mariadb引入large_pages_for_code选项【补丁还未接受】实现与libhugetlbfs类似,在x86上带来的性能收益大致如下:READ_ONLY_THP_FOR_FSFB的Liu Song在19年为内核引入的一个特性,该特性主要是在khugepaged内核线程中将.text段(VMAwith VM_DENYWRITE)也考虑整合成2 MB大页。该特性需要在开启THP的场景下才能使用。使用libhugetlbfs将代码段或者数据段重新映射到大页上。使用的
6、hugetlbfs,存在的问题包括:perfperf无法查看热点异无法查看热点异常常、需重新编译应用需重新编译应用、无法使动态链接库使用大页无法使动态链接库使用大页。-THP用户态接口:匿名页,提供always/madvise/never三种选项,对匿名页使用大页进行控制;文件页:可执行的文件页,依赖应用主动调用madvise()系统调用使能;Linux内核已有的大页整合机制:文件页和匿名页分离阶段:匿名页:在THP enabled满足的情况下,判断虚拟首地址是否2 MB对齐即可;文件页:特指ELF、DSO代码段的占用的文件页,还需判断pgoff是否512对齐和该文件是否有写者;整合阶段:匿名