DPDK 系列第四篇:TLB和大页

系列文章

DPDK 系列第一篇: DPDK架构阐述-CSDN博客

DPDK 系列第二篇:CPU Cache详解及DPDK在Cache方面的性能应用-CSDN博客

DPDK 系列第三篇:CPU 亲和性及实际应用-CSDN博客

前置知识

        分页(paging),它是一种将物理内存和虚拟内存地址空间划分为固定大小的页(page)的技术。

        在分页机制下,虚拟内存被划分为连续的页,每个页的大小通常为4KB或者更大。物理内存也被划分为相同大小的物理页框(page frame)。虚拟内存中的每个页都可以映射到物理内存中的一个页框。

        当程序访问虚拟内存时,CPU将虚拟地址分割为页号和页内偏移量。页号用于查找页表,而页内偏移量则表示相对于页起始地址的偏移量。页表是一种数据结构,用于记录虚拟页和物理页框之间的映射关系。

        如果虚拟页已经在物理内存中有对应的页框,那么CPU可以直接使用物理地址进行内存访问。如果虚拟页不在物理内存中,就会发生缺页异常(page fault)。在这种情况下,操作系统会负责将虚拟页加载到物理内存中,并更新页表的映射关系,然后再次执行被中断的指令。

        通过分页机制,虚拟内存可以大于物理内存的实际容量。它允许多个程序同时运行,每个程序都有自己的虚拟地址空间,而不需要关心物理内存的实际分配情况。此外,分页机制还提供了内存保护的功能,通过设置页表中的访问权限位,可以防止程序越界访问或者非法访问其他进程的内存。

TLB是什么

        TLB(Translation Lookaside Buffer)是一种CPU内部的高速缓存,用于加速虚拟地址到物理地址的转换过程。TLB存储了最近使用的虚拟地址和对应的物理地址之间的映射关系,以便在下次需要进行地址转换时能够快速地找到对应的物理地址。

为什么需要TLB

         如前置知识介绍,在现代计算机系统中,程序使用的是虚拟地址,而不是直接访问物理内存地址。当程序访问虚拟地址时,CPU需要将其转换为对应的物理地址,以便正确地访问内存。这个转换过程涉及到页表的查询,而TLB可以缓存部分页表的映射结果,从而加快地址转换的速度。

TLB 访问机制

        首先从虚拟地址中提取页号(VPN),然后检查TLB是否有该VPN的转换映射。如果有,那就是TLB命中(TLB hit),这意味着TLB有该页的转换映射。接下来我们就可以从相关的TLB项中取出页帧号(PFN),与原来虚拟地址中的偏移量组合形成期望的物理地址(PA),并访问内存。
        如果CPU没有在TLB中找到转换映射(TLB未命中),我们有一些工作要做。硬件访问页表来寻找转换映射,并用该转换映射更新TLB。上述系列操作开销较大,主要是因为访问页表需要额外的内存引用。最后,当TLB更新成功后,系统会重新尝试该指令,这时TLB中有了这个转换映射,内存引用得到很快处理。

TLB缓存是否可以无限大

        从上边分析来看,TLB缓存这么好,为什么不做更大的缓存,装下所有的数据?可惜的是,这里我们遇到了更基本的定律,就像物理定律那样。如果想要快速地缓存,它就必须小,因为光速和其他物理限制会起作用。大的缓存注定慢,因此无法实现目的。所以,我们只能用小而快的缓存。剩下的问题就是如何利用好缓存来提升性能。

大页是什么

        大页内存是一种将虚拟内存和物理内存划分为较大大小的页的技术。传统的分页机制将内存划分为固定大小的小页(通常是4KB),这样可以提供更细粒度的内存管理和灵活性,但也会带来一些开销,比如更多的页表项和 TLB 命中率的下降。为了解决这些问题,大页内存被引入。

为什么大页能提高TLB命中率

        从上面的虚拟地址到物理地址的转换我们知道,如果采用常规页(4KB)并且使TLB能命中,那么需要在TLB表中存放虚拟地址和对应的物理地址之间的映射关系。

        如果一个程序使用了512个内容页也就是2MB大小,那么TLB 中需要512个页表表项才能保证不会出现TLB不命中的情况。但是我们从上边知道TLB大小是很有限的,随着程序的变大或者程序使用内存的增加,那么势必会增加TLB的使用项,最后导致TLB出现不命中的情况。那么,在这种情况下,大页的优势就显现出来了。如果采用2MB作为分页的基本单位,那么只需要一个表项就可以保证不出现TLB不命中的情况;对于消耗内存以GB(2^30)为单位的大型程序,可以采用1GB为单位作为分页的基本单位,减少TLB不命中的情况。

如何使用大页

        我们以Linux系统为例来说明如何预留并使用大页。

        首先,Linux操作系统采用了基于hugetlbfs的特殊文件系统来加入对2MB或者1GB的大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用2MB大页面。

        为了使用大页,必须在编译内核的时候激活hugetlbfs。在激活hugetlbfs之后,还必须在Linux启动之后保留一定数量的内存作为大页来使用。现在有两种方式来预留内存。第一种是在Linux命令行(grub)指定,这样Linux启动之后内存就已经预留;第二种方式是在Linux启动之后,可以动态地预留内存作为大页使用。

命令行指定: 如下所示 ,命令行中配置了 default_hugepagesz=1G  hugepages=1G hugepagesz=76 代表默认使用1G大小的大页,并且系统启动时会预留76 个大页。 需要指出的是,系统能否支持大页,支持大页的大小为多少是由其使用的处理器决定的。以Intel的处理器为例,如果处理器的功能列表有PSE,那么它就支持2MB大小的大页;如果处理器的功能列表有PDPE1GB,那么就支持1GB大小的大页。当然,不同体系架构支持的大页的大小都不尽相同,比如x86处理器架构的2MB和1GB大页,而在IBM Power架构中,大页的大小则为16MB和16GB。

命令行指定特别注意点:1)如果要使用1GB的大页,其大小必须显示地在命令行指定,因为这种GB级别的大页启动后再预留 可能 预留不到;2)因为存在NUMA本地内存的问题,系统会均分地预留大页。假设在有两个处理器的NUMA系统中,以上例预留76GB内存为例,在NODE0和NODE1上会各预留38GB内存

启动后动态预留: 如下进行2M大页预留

非NUMA系统

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

在大页预留之后,接下来则涉及使用的问题。如下以DPDK为例来说明如何使用大页。

DPDK也是使用hugetlbfs来使用大页。首先,它需要把大页mount到某个路径,比如/dpdk_huge,以下是命令:

        需要指出的是,在mount之前,要确保之前已经成功预留内存,否则之上命令会失败。该命令只是临时的mount了文件系统,如果想每次开机时省略该步骤,可以修改/etc/fstab文件。

在DPDK运行的时候,会使用mmap()系统调用把大页映射到用户态的虚拟地址空间,然后就可以正常使用了。

dpdk自己实现了一套大页内存的使用库,这个和libhugetlbfs.so是类似的,就是自己实现了大页内存的申请,释放操作, 替代了传统的malloc, free系统调用,如下截取了 部分 分配代码,可以看到是使用了mmap 映射的内存,并且挂到了内存段上

	// dpdk  alloc_seg 函数代码段

    /*
	 * map the segment, and populate page tables, the kernel fills
	 * this segment with zeros if it's a new page.
	 */
	va = mmap(addr, alloc_sz, PROT_READ | PROT_WRITE, mmap_flags, fd,
			map_offset);

    ......

    // ms 为 rte_memseg 结构,实际申请内存时会从对应的实例中进行分配
    ms->addr = addr;
	ms->hugepage_sz = alloc_sz;
	ms->len = alloc_sz;
	ms->nchannel = rte_memory_get_nchannel();
	ms->nrank = rte_memory_get_nrank();
	ms->iova = iova;
	ms->socket_id = socket_id;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值