.. Kenneth Lee 版权所有 2022
:Authors: Kenneth Lee :Version: 1.0 :Date: 2022-02-23 :Status: Draft
5.16
本文基于kernelnewbies.org的跟踪的基础信息,加上查阅相关感兴趣的文档和代码写成。 [1]_
5.16在2022年1月9日发布,这个时间基于主线版本的tag时间估计的。
.. _linux-folios
:
等了好久终于有人动这个东西了,原来的Huge Page和传统的Page管理让整个内核到处都是 if is_huage_page(...)这样的判断。希望这个改进方案能有最后变成主流吧,这部分代码 是在是看累了。
我们从架构设计的角度深入一点看看这个主题:Linux Kernel的底层内存管理是完全基于 页的,所以最底层的页首先用pages[]数组来描述,之后的分配都是以这个为基础了。这个 设计有个基本假设是page的大小是一样的,所以用pages的下表可以直接换算物理地址。
但现在情况发展了,现在的CPU常常支持变长页(这样可以节省TLB entry),上面这个条件 不成立了,但这个数据结构一时不好大改。所以改进为,如果是大页,就看做是一组page ,称为compound page。第一个page叫做这个compound page的head page,最后一个叫tail page。这样原来那些输入一个page作为参数的实现全部都要补充逻辑,判断一下这个给进 来的page是真的是page还是一个compound page的一部分。所以代码的逻辑就很难看。因为 你必须知道page不一定是page,但有时page也确实是page,这种代码看着就很烦了。
Folio的定义就彻底不叫page,而是这样的:::
它其实就是变长的page,但不再叫page了。新的数据结构可以和page之间用 page_folio()/folio_page()进行转换。现在主要修改在FS(包括BIO)的代码中。
这是我们宋宝华老师,Jonathan Cameron,和Intel Tim Chen加的特性。是我们去年开始 做鲲鹏920多核优化工作的结果。主要就是要求调度器认识类似鲲鹏920这样的Many Core多 层CPU互联结构,避免把有关系的多个线程分散到过多的核中,这样会降低Cache的利用效 率,让调度算法关注到Cluster的存在,同时把这个层级结构通过hwloc暴露给用户态。
提供的测试数据显示这个优化可以把鲲鹏920的stream性能提高百分之几到百分之十几。