首页 > 代码库 > PF_RING Libzero中使用HugePage

PF_RING Libzero中使用HugePage

Libzero中使用HUGEPAGES

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

PF_RING Libzero中使用HugePage