《OS2ATC-王荣巍.pdf》由会员分享,可在线阅读,更多相关《OS2ATC-王荣巍.pdf(29页珍藏版)》请在三个皮匠报告上搜索。
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对齐和该文件是否有写者;整合阶段:匿名
7、页:替换PTE映射为PMD映射,释放掉原来的ptepgtable;文件页:替换页缓存pagecache中小页为大页;实现 性能 使用代码大页代码大页 EXEC实现Load_elf_binary():在加载时处理好ELF地址对齐的问题 DSODSO将代码段放入到大页,需要解决两个问题:地址对齐问题;没有denywrite约束 Padding代码大页Padding功能可控:padding功能仅个别特殊应用需要,因此需要该功能可控:hugetext_pad_threshold;安全:padding后,保证与后续的VMA不会重叠,同时不会超过文件本身大小;可靠性为了安全,并非所有应用可以通过paddi
8、ng获取最大性能,主要原因在于代码段块前后未对齐;在应用的链接脚本中加入“.=ALIGN(0 x200000)”,保证代码块2MB对齐建议主要有三部分:2 MB地址对齐khugepaged扫描加速;动态库(DSO)支持使用大页;代码大页性能测试环境 机器:ARM虚拟机 32 cores 128GB;OS:Anolis 5.10内核;kpti=off nokaslr cgroup.memory=nokmem transparent_hugepage=never numa_balancing=disable 其他:主要应用绑核绑节点;代码大页性能:上图TPS对比可以看出:代码大页的性能始终高于普通
9、的代码页。关于这张图中其他的结论,还有:并发数为1时,外在的影响因素最小,此时,代码大页相比普通代码页,性能提升大约6.9%;并发数8、16基本可以保证没有CPU的竞争,代码大页的性能提升大约6.5%以上;并发数32时,相比普通代码页,性能提升大约在11%左右;代码大页微架构指标优化:上图都展示的是iTLB的数据,在测试的过程中iTLB miss和iTLB MPKI也一并记录。如这两图所示:Mysql使用代码大页后,iTLB miss大约下降了10倍左右,数值大小从原来的1%下降到0.08%左右;在iTLB MPKI上,大约下降了6倍左右;代码大页性能:PostgreSQL代码大页相比libh
10、ugetlbfs方案,不仅仅解决了使用libhugetlbfs后无法使用perf观察热点问题,同时通过padding功能,代码大页性能提升较libhugetlbfs多2%左右。Hugetext:9%Libhugetlb:7%base代码段大小透明大页代码大页mysql22M2%57%redis1.8M5%xpostgresql12M+x7%oceanbase200M+x7%JVM类100M+8%68%注:以上主要为arm平台测试数据。符号x可以认为该应用没有采用该技术,或优化效果几乎是0。收益:64K 代码大页 anon THP 4kArm AMD Intel代码大页 使用启动参数启动参数打开
11、:hugetext=1 or 2 or 3关闭:缺省即为关闭sysfs接口接口仅打开二进制和动态库大页:echo 1 /sys/kernel/mm/transparent_hugepage/hugetext_enabled仅打开可执行匿名大页:echo 2 /sys/kernel/mm/transparent_hugepage/hugetext_enabled打开以上两类大页:echo 3 /sys/kernel/mm/transparent_hugepage/hugetext_enabled关闭:echo 0 /sys/kernel/mm/transparent_hugepage/huget
12、ext_enabledPadding接口接口接口路径:/sys/kernel/mm/transparent_hugepage/hugetext_pad_thresholdecho 02097151 /sys/kernel/mm/transparent_hugepage/hugetext_pad_threshold注意事项注意事项打开、关闭并不意味着立即合并、拆散大页,hugetext 是异步的。如果一段代码曾经被整理成大页,即使关闭hugetext 功能,还是会大页映射。想确认代码段是否大页映射,可以通过下面的命令确认:grep FilePmdMapped/proc/$(pidof mysql
13、d)/smaps代码大页 附录1数据来源:https:/ L1 code TLB2M L2 code TLB/STLBIntel Skylake8 entries1536 entries海光(AMD)64 entries1024 entriescascade lake8 entries1536 entriesarmN148 entries1280 entries代码大页 附录2grep-C 10-n ELF_MAXPAGESIZE-R./SOURCES/binutils-2.35/bfd/elf64-x86-64.cbinutils、glibc 虚拟地址对齐对于arm,该值为64K,对于x86
14、,与binutils包版本有关。大致情况如下:ARM:64KX86:Binutils-2.30/2.27:2M;Binutils-2.35:4K;ELF_MAXPAGESIZE代码大页 附录2binutils、glibc 虚拟地址对齐“-z max-page-size=0 x200000”EXEC:对齐VMA首地址 DSO:ld.so可以会安装p_align值进行对齐;代码大页 附录3.=ALIGN(0 x200000)修改链接脚本,在.text两端加入“.=ALIGN(0 x200000)”可以彻底保证ELF文件中两个LOAD段在文件中的偏移为2MB对齐;社区代码大页 mm,thp:bail
15、 out early in collapse_file for writeback page整合文件大页的主要函数collapse_file()调用page_has_private()判断正在写回的页,这种方法对于XFS中块大小等于或大于时,无法抓到正在写回的页;pagesize;mm,thp:lock filemap when truncating page cache多并发打开一个存在大页的文件会多重进入truncate pages流程,页状态变量异常触发crash;mm,thp:fix incorrect unmap behavior for private pages当truncate
16、一个文件时,应该避免对该段区域的private pages操作,例如可执行文件的rp数据,避免导致应用发生段错误;Linux社区 elf:Properly align PT_LOAD segments针对动态链接库(DSO),修复加载器ld.so映射动态链接库过程中,映射首地址按照p_align值对齐;glibc社区 代码只读文件系统,专门用于放置lib库;64kB、32MB代码大页,接近特殊场景2MB代码大页无法使用的问题;多种代码大页支持;靶向代码大页;其他想法 代码大页ECS官网文档 龙蜥-代码大页在达梦数据库上性能验证 Efficient Address Translation for Architectures with Multiple Page Sizes参考资料感谢龙蜥Kernel SIG地址:https:/ Kernel SIG