hugepage大页内存

hugepage大页内存,第1张

DPDK管理的内存有个很有用的特点--同一块物理内存在不同的进程地址空间中,虚拟地址是一样的。DPDK的内存管理需要了解hugepage。

顾名思义,就是大的内存,不用频繁申请多块内存。页表减少,同时页表占用内存也会减少,地址转换也减少了(多个页表地址关联,需要地址转换,形成连续内存),地址转换一般保存在cpu缓存中,这样就减小了cpu的压力。

可以在dpdk主程序运行前,用shell脚本提前获取大页内存,获取方式根据NUMA和no-NUMA系统有所不同。

DPDK管理的内存都是通过hugepage预留的,这个函数主要获取预留的内存的信息,获取方法是读取 /sys/kernel/mm/hugepages 下的文件

NUMA:一个物理cpu和一组内存(可能多核)构成一个node,每个cpu可以访问自己node下的内存,也可以访问其他node的内存,但是访问速度是不一样的,自己node下的更快。

现在大部分cpu都是NUMA架构。

NUMA system:

#

# Creates hugepages on specific NUMA nodes.

#

set_numa_pages()

{

if [ "${HUGEPGSZ}" == "1048576kB" ]then

    echo "no need get hugepages from linux"

else

    clear_huge_pages

    echo >.echo_tmp

    for d in /sys/devices/system/node/node? do

        echo "echo $Pages >$d/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >>.echo_tmp

    done

    echo "Reserving hugepages"

    sudo sh .echo_tmp

    rm -f .echo_tmp

    create_mnt_huge

fi

}

non-NUMA system:

# Creates hugepages on non-numa system

set_non_numa_pages()

{

    if [ "${HUGEPGSZ}" == "1048576kB" ]then

        echo "no need get hugepages from linux"

    else

        clear_huge_pages

        echo "echo $Pages >/sys/kernel/mm/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >.echo_tmp

        echo "Reserving hugepages"

        sudo sh .echo_tmp

        rm -f .echo_tmp

        create_mnt_huge

    fi

}

一般情况下可以设置最大共享内存为物理内存的一半,如果物理内存是 2G,则可以设置最大共享内存为 1073741824,如上;如物理内存是 1G,则可以设置最大共享内存为 512 * 1024 * 1024 = 536870912;以此类推。

在redhat上最大共享内存不建议超过

4*1024*1024*1024-1=4294967295

设置完成后用命令 more /etc/sysctl.conf |grep kernel.s 检查。

在 *** 作系统Linux环境中,内存是以页Page的方式进行分配,默认大小为4K。如果需要比较大的内存空间,则需要进行频繁的页分配和管理寻址动作。

HugePage是传统4K Page的替代方案。顾名思义,是用HugePage可以让我们有更大的内存分页大小。无论是HugePage还是传统的正常Page,这个过程都涉及到OS内存寻址过程。

当一个进程访问内存的时候,并不是直接进行内存位置访问,是需要通过Page Table进行转移变换。在使用HugePage的情况下,PageTable具有了额外的属性,就是判断该页记录是HugePage还是Regular Page

DPDK主要使用了UIO、HUGEPAGE和CPU Affinity机制三个技术点来提高高速网络数据的处理性能。

UIO是实现用户空间下驱动程序的支撑机制,DPDK使用UIO机制使网卡驱动程序(主要是intel自身的千兆igb与万兆ixgbe驱动程序)运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能。

HUGEPAGE的主要好处是通过利用大内存页提高内存的使用效率,DPDK在HUGEPAGE机制上构建内存管理系统,提高应用程序处理报文的性能。

CPU Affinity机制主要是让各个CPU各自干自己的事情,DPDK使用CPU Affinity机制将控制面线程以及各个数据面线程绑定到不同的CPU核,节省反复调度的性能消耗。其工作模式类似于一个CPU核绑定一个死循环线程,专心处理各自的业务。比如两个网卡eth0和eth1都收包,可以让cpu0专心处理eth0,cpu1专心处理eth1,没必要cpu0一下处理eth0,一下又处理eth1,这样就提高了多核CPU的使用效率。

所以,这样看来,DPDK并不高深,用到的东西也都是Linux本身提供的特性,还有额外的内存池、环形缓存等,虽然封装得很好,但都是比较常用经常接触的技术。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7224344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存