Linux hugepages原理概念

接触kubernetes两年有余,从18年初加入kubernetes社区来算,已经一年半,或许是时候写点什么。简单文章如何写好,难点文章如何写透,或许是一种学问,打算推一个系列:《Kubernetes GO》算是对这两年的一个总结。

hugepage是在Linux2.6内核被引入的,主要提供4k的page和比较大的page的选择。

系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
而在Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。


1、hugepages及相关概念

有一些显示的概念需要澄清,在我们继续讨论Hugepages之前, 如hugetlb, hugetlbfs.
page table(页表)是操作系统上的虚拟内存系统的数据结构模型,用于存储虚拟地址与物理地址的对应关系。当我们访问内存时,首先访问”page table“,然后Linux在通过“page table”的mapping来访问真实物理内存(ram+swap)

  • TLB: A Translation Lookaside Buffer (TLB)
    TLB是在cpu中分配的一个固定大小的buffer(or cache),用于保存“page table”的部分内容,使CPU更快的访问并进行地址转换。
  • hugetlb: hugetlb 是记录在TLB 中条目并指向到Hugepage。所以HugePages 通过 hugetlb entries来调用的。
  • hugetlbfs: 这是一个新的基于2.6 kernel之上的内存文件系统,如同tmpfs。

在TLB中通过hugetlb来指向hugepage。这些被分配的hugepage作为内存文件系统hugetlbfs(类似tmpfs)提供给进程使用。

2、“regular page”和“huge page“的请求过程

当一个进程请求内存时,它需要访问文件系统的“页表”(Pagetable)去调用一个实际的物理内存地址,逻辑如下图所示。

regular

当Hugepage部署后,依然是调用普通的页表。 最大的不同是process pagetable和system pagetable增加了Hugepage属性。所以任何页表中的page条目可以是“regular page” 或者是“huge page”.

huge

3、hugepage 优点

  1. HugePages 会在系统启动时,直接分配并保留对应大小的内存区域

  2. HugePages 在开机之后,如果没有管理员的介入,是不会释放和改变的。

  3. Not swappable: HugePages 是不会swap.也就是没有page-in/page-out。HugePages一直被pin在内存中

  4. Relief of TLB pressure:

在purge TLB的时候,减少了事物条目的加载,提高了性能。使用Hugepages后TLB能覆盖更大的内存地址空间,加快地址转换的时间更少的TLB条目,意味着有更大空间用来记录其他的地址空间.

  • No ‘kswapd’ Operations:在Linux下进程“kswapd”是管理swap的,如果是大内存,那pages的数量就非常庞大(例如:50G内存包含1千3百万页表条目),就会耗费惊人的CPU资源。如果使用hugepages,kswapd就不会耗费资源去管理它,可以查看文档361670.1。
  • Eliminated page table lookup overhead: 因为hugepage是不swappable的,所有就没有page table lookups。
  • Faster overall memory performance: 由于虚拟内存需要两步操作才能实际对应到物理内存地址,因此更少的pages,减轻了page table访问热度,避免了page table热点瓶颈问题。

4、配置Hugepages

根据下面的步骤来配置Hugepages,修改Hugepages需要重启机器,使用请计划停机时间。

需要在/etc/security/limits.conf 中设置memlock值(单位KB),该值小于内存大小,例如你的内存大小是64G,有可以设置以下的值.

1
2
soft   memlock    60397977
hard memlock 60397977
  • 编辑/etc/sysctl.conf 设置 vm.nr_hugepages参数:vm.nr_hugepages = 1496
  • reboot
  • 系统重启后,启动全部的数据库,通过以下命令检查
1
2
3
4
5
# grep HugePages /proc/meminfo
HugePages_Total: 1496
HugePages_Free: 485
HugePages_Rsvd: 446
HugePages_Surp: 0

HugePages_Free< HugePages_Total 既说明Hugepages已经生效,同时HugePages_Rsvd不为“0”.


后续

该文为linux hugepages相关内容的网络优化,后续推出kubelet涉及hugepages的相关内容。


参考资料