跳转至

大页内存

大页内存

大页内存(Huge Pages)通过使用比传统4 KB页面更大的内存页面(通常是2MB),减少地址转换过程中TLB(Translation Lookaside Buffer)的缺失次数,从而提高内存访问速度。

什么是大内存页

大内存页有助于 Linux 系统进行虚拟内存管理。顾名思义,除了标准的 4KB 大小的页面外,它们还能帮助管理内存中的巨大的页面。使用 “大内存页”,最大可以定义 1GB 的页面大小。在系统启动期间,能用 “大内存页” 为应用程序预留一部分内存。这部分内存,即被 “大内存页” 占用的这些存储器永远不会被交换出内存。它会一直保留其中,除非修改了配置。这会极大地提高像 Oracle 数据库这样的需要海量内存的应用程序的性能。

为什么使用大内存页

在虚拟内存管理中,内核维护一个将虚拟内存地址映射到物理地址的表,对于每个页面操作,内核都需要加载相关的映射。如果内存页很小,那么需要加载的页就会很多,导致内核会加载更多的映射表。而这会降低性能。

使用 “大内存页”,意味着所需要的页变少了。从而大大减少由内核加载的映射表的数量。这提高了内核级别的性能最终有利于应用程序的性能。

简而言之,通过启用 “大内存页”,系统具只需要处理较少的页面映射表,从而减少访问 / 维护它们的开销

大页内存的缺点

大页内存如果分配过多,会减少留给操作系统动态分配的普通内存空间,可能导致其他非大页的应用程序或系统服务因内存不足而运行不畅或失败。当实例的大页内存设置过大,可能会导致实例无法连接等问题

Linux 大页管理

查看当前大页内存配置信息

# grep Huge /proc/meminfo
AnonHugePages:  17897472 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB

每个页的大小为 2MB(Hugepagesize),并且系统中目前有 0 个“大内存页”(HugePages_Total)。这里“大内存页”的大小可以从 2MB 增加到 1GB

配置大页内存

基于应用的实际内存需求和系统总内存,计算所需的大页数量

所需大页数量 = (应用所需内存大小 / 大页的实际大小)

将如下内容添加到/etc/sysctl.conf

vm.nr_hugepages = 100

然后执行sysctl -p命令重新加载配置

HugePages_Total 变为 100

使用大页内存

设置 max locked memory

vim /etc/security/limits.conf

@root            hard    memlock        unlimited
@root            soft    memlock         unlimited

用户所属组添加到系统内核中

vim /etc/sysctl.conf

vm.hugetlb_shm_group=0

其他

透明大页THP(Transparent Huge Pages)和代码大页(Hugetext)

参考资料