概述
当一个进程使用内存的时候,CPU会为应用程序标记一部分内存。为了提高效率,CPU会按照每4K为一块的方式分配内存。这些块就叫做(内存)页,这些页可以交换到磁盘上。
因为进程的地址空间都是虚拟的,CPU和操作系统必须记录哪些页是属于本进程的,并且还需要将这些记录保存起来(使用页表)。很明显,你有更多的页,查找内存的映射所花费的时间就会越长。当进程使用1GB内存时,就需要查找262,144(1GB/4K)个条目。如果页表中的一个条目需要占用8个字节,那么就需要查找2MB(262,144 * 8)的空间。
假设我们将内存页按照2MB的大小来分配,那么1GB的内存只需要查找512(1GB/2M)个条目,如果还按照页表中的一个条目占用8个字节来算,则只需要查询4KB(512*8),那么内存查找的时间就会大大的缩减,进而提供应用程序的性能。
查看huge的一些设置
查看Linux系统下,内存是否支持大页。
grep -i "Huge" /proc/meminfo
如果上面的命令得到下面的输出,则说明该系统下内存支持大页。

- HugePages_Total 大页池的大小。即系统中目前设置的最大的大内存页的数量。
- HugePages_Free 还没有被分配大页池中的大内存页的数量。
- HugePages_Rsvd 其中rsvd(reserved—预留的缩写)。表示大页池中已经被承诺分配,但是还没有被分配的出去的大页数。
- HugePages_Surp 其中surp(surplus—盈余的缩写)。池中的大页的数量超过/proc/sys/vm/nr_hugepages中的值(该值就是通过参数vm.nr_hugepages在sysctl.conf中设置的值)。盈余的大页的最大值是通过/proc/sys/vm/nr_overcommit_hugepages中的值控制的。
- Hugepagesize:大页在默认值,单位是KB,通常默认值为2048,即2MB。
- Hugetlb 总内存量,各种尺寸的大页所消耗的总内存数。如果使用的大页尺寸是不同的,那么这个值就会超过HugePages_Total * Hugepagesize。
配置
下面的配置是在Ubuntu18.04及以上版本的下完成的,其他的Linux操作系统下,一些操作可能会存在变更,请注意。
1、创建一个hugepages的用户组
并且查询到该用户组的GID,然后添加需要运行应用程序的用户到该组中。
groupadd my-hugetlbfs
getent group my-hugetlbfs
my-hugetlbfs:x:1001:root
adduser franklin my-hugetlbfs
2、编译/etc/sysctl.conf
并且添加如下内容
vm.nr_hugepages = 2048
vm.hugetlb_shm_group = 1001
(1)、vm.nr_hugepages
一个Unix组可用的大内存页的数量。该值的建议大小为kernel.shmmax/2M(2,097,152)。其中的2M是系统中大页尺寸,如果没有更改,那么Linux x86-64系统下默认值为2M。可能过下面的命令查看:
grep -i "Hugepagesize" /proc/meminfo
Hugepagesize: 2048 kB
注意,无论你将这个值设置的多大,系统给出的最大值都为kernel.shmmax/2,097,152。例如,如果服务器内存为8G,则该值为8,589,934,592/2,097,152 = 4096。
(2)、kernel.shmall
这个参数设置系统中可以使用的共享内存页的最大数量。要注意:它设置的是内存页的数量,而不是大页的数量;它设置的是页的数量,而不是页的大小。该值为shmmax/page_size,即kernel.shmmax的值除以每一页的页大小,由于内存页大小为4096(可以直接使用命令pagesize查看),则该值为:kernel.shmmax/4096,例如,如果服务器物理内存为8GB,则该大小为2,097,152(8,589,934,592/4096)。
(3)、kernel.shmmax
在它们的虚拟地址空间中,一个Linux进程可以分配的单个共享内存段的最大值,单位是字节。这个值可以可设置为服务器当前的物理内存的大小。例如,8GB内存设置的值为:8,589,934,592(8*1024*1024*1024)。
(4)、vm.hugetlb_shm_group
用于设置启动hugepage的组。
3、在文件系统中创建一个挂载点
mkdir /hugepages
4、在/etc/fstab中添加挂载
hugetlbfs /hugepages hugetlbfs mode=1770,gid=1001 0 0
5、重新启动计算机
管理命令使用
1、安装命令
apt install libhugetlbfs-bin
2、使用命令
hugeadm --help
hugeadm --pool-list
...