科技 > 操作系统 > 鸿蒙系统

openEuler 24.03 LTS 特性解读 | 动态复合页

241人参与 2024-08-04 鸿蒙系统

openatom openeuler(简称"openeuler") 20.03 lts 历史版本中,arm64架构下默认基础页大小配置为64kb,相比传统的4kb基础页,在访存方面,64k页面能带来更快的page tale walk、更低的tlb miss,在存储io路径上也能提升读写效率,因此64k基础页能够提升数据库等部分场景下的性能。然而,64k基础页却面临南北向生态问题(部分应用软件和外设驱动需要重新适配或重新编译)和内存底噪开销问题(64k相比4k粒度更粗,内存利用率更低,部分场景会带来巨大的内存消耗)。为此,openeuler在22.03版本将arm64的默认基础页大小配置改回了4k,在性能上64k基础页有较大优势的场景,则可以单独编译64k基础页的二进制版本来支持,或者采用大页技术,虽然传统大页技术同样能够提升访存性能,但是它面临着使用不够灵活(hugetlb)和性能qos无法保证(thp)的问题。

arm64内存地址翻译对比

那么有没有一种技术,可以在一个内核二进制版本中,实现4k基础页的南北向生态兼容,以及64k页的性能提升,同时应用能够无感使用,并能够有效控制内存底噪?openeuler 24.03版本带来的动态复合页(large folio)技术正在解决这个难题。

动态复合页技术架构介绍

长期以来linux内核中物理内存是基于struct page来管理的,每个page对象描述一个基础页(如4k),随着当前大模型、大数据等业务大内存需求,单个系统上的内存容量可以达到tb级别,以page为单位管理内存越显低效。folio(拉丁语 foliō,对开本)最早是oracle的一名工程师提出的,背景是在搭载6tb内存的服务器上,page结构体达到了15亿个,开销巨大,同时内核内存回收模块的lru链表长度将达到上亿,导致lru lock锁竞争更加严重,持有该spinlock锁期间由于遍历超长链表cache miss也会更高,极其低效。linux内存管理基于page(页)转换到由folio进行管理,相比page,folio可以由一个或多个page组成,采用struct folio参数的函数声明,将对整个“页面”进行操作,它可以是单个page,也可以是多个page(large folio)。采用large folio后,可以提升lru管理效率、减少page fault次数提高内存分配效率、以large folio粒度建立大页映射可以降低page table walk开销,以及降低tlb miss。

openeuler 24.03版本基于linux 6.6 lts版本作为基线进行演进,linux 6.6基线版本已经完成了部分模块对基础folio(4k)的重构,包括:内存分配、内存回收、pagecache、部分文件系统(xfs等),而对于large folio的支持则普遍缺失。为此,华为内核团队除了在linux社区中积极贡献folio相关补丁的同时,也在openeuler 24.03配套的6.6内核中实现了内存管理子系统和文件系统对于large folio的大量支持和软硬协同优化,并提供灵活的控制策略,完善了动态复合页技术架构:

openeuler24.03 lts 动态复合页技术架构

内存管理子系统在以下方面实现了large folio,提升访存性能和内存管理效率:


arm64各级大页示意图

文件系统在以下方面实现了large folio优化,大幅提升io性能:

ext4文件系统支持large folio后的数据io下发流程

动态复合页通过多层级的策略控制,提供方便易用的系统级、容器级、进程级的large folio开关接口(注:其中容器级、进程级接口将在后续版本更新中提供),以及文件系统large folio开关接口,用户按需配置关键应用生效,非关键应用避免不必要的内存开销。

综上,动态复合页技术通过优化内存管理和文件系统两大核心子系统对于大页的自适应支持,应用无需修改,即可以减少page table walk和tlb miss从而提升访存性能,在os内核层面可以做到更多的批量化优化,从而提升内存管理、io等关键路径上的性能。在底噪控制方面,提供多层级的控制开关,让关键应用按需使用。在兼容性上,操作系统的基础页面管理单元依然是4k,可以保持原生的南北向生态兼容,同一个二进制版本即可兼顾性能和兼容性。

效果分析

大数据收益测试

打开动态复合页后,测试hibench(spark)结果各项指标平均提升10% 

kafka收益测试

打开动态复合页后,测试kafka benchmark结果:producer带宽提升26%,consumer带宽提升11%

mysql收益测试

打开动态复合页后,测试mysql benchmark(sysbench),受益于代码段可以用户态无感得合成2m大页从而使itlb miss率最高降低10倍,sysbench整体结果性能提升3%+

io基础性能benchmark收益测试

打开动态复合页后,测试fio读性能平均提升59%,写性能平均提升239%

内存分配benchmark收益测试

打开动态复合页后,测试linux社区常用的benchmark工具will-it-scale测试内存分配性能,受益于单次pagefault可批量分配large folio从而减少page fault次数,以及pcp缓存池的分配加速,匿名页和共享文件页的page fault ops平均提升100%

后续规划

未来动态复合页技术将持续聚焦于数据中心常见场景的性能优化,并将与芯片结合充分利用tlb单元以覆盖更大内存,进一步降低tlb miss提升性能。同时也将把相关特性持续贡献到linux社区。

openeuler kernel sig

openeuler kernel 源代码仓库:https://gitee.com/openeuler/kernel 欢迎大家多多 star、fork,多多参与社区开发,多多贡献补丁。关于贡献补丁请参考:如何参与 openeuler 内核开发

openeuler kernel 微信技术交流群 请扫描下方二维码添加小助手微信,或者直接添加小助手微信(微信号:openeuler-kernel),备注“交流群”或“技术交流”,加入 openeuler kernel sig 技术交流群。


(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

毕昇 JDK:“传奇再现”华为如何打造 ARM 上最好用的 JDK?

08-04

OERV-RTOS: UniProton 适配 Milk-V Duo,加速 openEuler RISC-V 生态

08-04

Kunpeng BoostKit 使能套件:大数据场景如何实现“大鹏一日同风起”倍级性能提升?

08-04

openEuler 成立 SIG-Intelligence:打造智能体应用与工具链的创新引擎,引领AI技术前沿探索

08-04

素质教育新模式:后疫情时代教育 OMO 模式如何切实落地?

08-04

【成都Meetup议题征集】openEuler G11N & doc SIG 邀您探索语言与文字的力量

08-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论