Libzero使用Hugepage来增加报文处理使用的内存大小。如果使用PF_RING ZC,它是必选的。
注:Hugepage在Intel DPDK开发中也是必选的!!
本文档描述如何在你的系统中启用hugepage。
$ echo 1024 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
$ mount -t hugetlbfs nodev/mnt/huge
通常Linux使用4KB的内存页,但是提供显式的接口来分配更大的内存页,称为hugepage。它方便开发人员和管理员决定什么时候使用它们。
Hugepage的优点:
- 保留更大的物理内存用于内存的分配,否则当要求物理上连续的内存时尤其容易失败。
- 减少开销:作为TLB(转换查看缓冲区)包括每页虚拟内存到物理内存地址的映射,缺省内存页大小时会使用大量的内存,导致管理TLB条目上的处理开销。
缺省hugepage大小通常是2MB。Hugepage大小在/proc/meminfo中可以找到:
$ cat /proc/meminfo | grepHugepagesize
Hugepagesize: 2048 kB
Hugepage能够动态预留,执行命令:
$ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
上面通过没有节点关联的系统分配内存页。如果希望强制分配给指定的NUMA节点,你必须做:
$ echo 1024 >/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
$ echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
可以修改缺省的hugpage的大小,启动时预留大量的内存使用下面的内核选项:
default_hugepagesz=1Ghugepagesz=1G hugepages=4
如果命令返回非空的字符串,支持2MB的内存页:
$ cat /proc/cpuinfo | greppse
如果命令返回非空的字符串,支持1GB的内存页:
$ cat /proc/cpuinfo | greppdpe1gb
为了让hugepage可以使用,Linux提供一个基于RAM的文件系统,称为hugetlbfs,必须使用下面命令挂载:
$ mount -t hugetlbfs none/mnt/hugepages
没有选项时将使用缺省的hugepage大小。为了使用不同的大小,可以指定pagesize=参数。
为了控制绑定到挂载点的最大数量内存,可以指定size=选项(size圆整到接近hugepage大小)。
例如:
$ mount -t hugetlbfs -opagesize=1G,size=2G none /mnt/hugepages
可能查看当前使用多少内存页,使用下面的命令:
$ cat/sys/devices/system/node/node*/meminfo | grep Huge
Node 0 HugePages_Total: 1024
Node 0 HugePages_Free: 1024
Node 0 HugePages_Surp: 0
1."error mmap'ing hugepage xxx: Resource temporarily unavailable"
原因:
- 你可能没有mmap hugepage的权限
- 增加“max locked memory” ulimit(参考ulimit -l)来容纳用户缓冲区和元数据的内存。你能手动增加ulimit的值。
$ulimit -l 4194304
- 增加/proc/sys/kernel/shmmax的值,请注意在32位系统中,它将限制在4GB。
$echo 2147483648 > /proc/sys/kernel/shmmax