皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Glibc 现在默认在 AArch64 上启用 2MB 的 THP 以提高性能

Glibc 现在默认在 AArch64 上启用 2MB 的 THP 以提高性能GNU C 库的 malloc 实现现在默认在 AArch64 Linux 上启用 2MB 的透明大页(THP)。此举是为了提升性能——据观察,这一更改在 SPEC 测试中带来了约 6.25%的性能提升。

Arm 工程师 Dev Jain 解释了这个提交,即在 AArch64 上默认启用 2MB THP 的 Glibc 更改:

“malloc: 默认在 Aarch64 上启用 2MB THP

Linux 支持多大小的透明大页(mTHP)。为了本文补丁的描述,我们将由非最后一级页表映射的块大小称为传统 THP 大小(对于 4K 基础页,为 2M;对于 64K 基础页,为 512M)。Linux 现在也支持由最后一级页表映射的中间 THP 大小——我们称之为 mTHP 大小。

Linux 对 mTHP 的支持随着时间的推移变得更好且更稳定 – 应用程序可以从中受益,减少页面错误和内核内存管理的开销,尽管这会带来内部碎片化的代价。我们观察到使用 mTHP 时性能有持续的提升,且变化很小。

因此,默认情况下在 AArch64 上启用 2MB THP。这使得即使用户没有设置glibc.malloc.hugetlb=1,也能启用 THP。如果用户已经设置了该参数,我们将避免调用系统调用来从 sysfs 获取 hugepage 大小,并用硬编码的 2MB 进行覆盖。

此补丁还有两个额外的好处,如果透明大页 sysctl 设置为 madvise 或 always:

1) 现在 AArch64 的 THP 大小被硬编码为 2MB。这避免了从 sysfs 获取 THP 大小时的系统调用。

2) 在基于 64K 页面大小的系统上,传统的 THP 大小为 512M,这在实际使用中是不可行的。我们可以改用 2M 的 mTHP 大小来获得更好的效果。除了上述提到的 THP/mTHP 的一般优势外,Aarch64 系统还受益于在该 mTHP 大小下减少的 TLB 压力,通常称为”contpte”大小。如果应用程序发生页错误,并且 THP sysctl 设置为”always”,或者虚拟内存区域已通过 madvise(MADV_HUGEPAGE)进行了提示,同时 sysctl 设置为”madvise”,那么 Linux 将加载一个 2M 的 mTHP,将连续的页面映射到页表中,并在页表条目中设置 cont 位。该位是告诉硬件,相关页表条目映射的是连续页面集合中的一页。这样,TLB 只需记住这 32 页集合中的一个条目(2M/64K=32 页),因为该连续集合中其他页面的物理地址可以通过 TLB 缓存的物理地址通过线性偏移计算得出。因此,原本只能通过传统 THP 大小实现的功能,现在也可以通过 mTHP 大小实现。

我们在 SPEC 上看到了 6.25%的性能提升。

如果 sysctl 设置为 never,内核将不会创建透明大页。但是,这个补丁仍然设置 thp_pagesize = 2MB。其好处在于,当调用 MORECORE()时,我们通过 2MB 扩展堆内存,而不是 4KB,这可能将该系统调用的调用频率降低 512 倍。请注意,sbrk(2M)和 sbrk(4K)在成本上没有区别;内核只是进行虚拟内存预留,而不会实际操作用户物理内存。

在 AArch64 上默认启用 2MB THP 将在 GNU C 库的 2.43 版本中出现,该版本预计于二月发布。

转自  Glibc Now Enabling 2MB THP On AArch64 By Default For Better Performance – Phoronix