dpdk - 如何释放DPDK应用分配的hugepages?

标签 dpdk page-tables huge-pages

我正在使用 DPDK-PROX 应用程序。每当我关闭该应用程序时,该应用程序分配的大页面都不会被释放。每次我都要重新启动系统。有什么解决办法吗?

我调查了以下问题,但我的问题没有得到解决。
How to release hugepages from the crashed application
How to really free hugepages in Linux for use by a new process?
Proper Way to Release a Hugepage?
这就是我在/proc/meminfo 中看到的内容

    AnonHugePages:         0 kB
    ShmemHugePages:        0 kB
    HugePages_Total:    1024
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB

最佳答案

您看到的行为是 18.05 之前的 DPDK 版本的特征,或者 18.05+ 带有 --legacy-mem 参数的特征。我假设前者更有可能。

发生这种情况是因为 DPDK 支持某种类型的多处理,它允许“次要”进程附加到“主要”进程,即使它已经退出。由于 DPDK 依赖大页面文件(在 hugetlbfs 文件系统中)在其主进程和辅助进程之间共享内存,因此这些大页面文件在应用程序退出后不会被删除,以允许辅助进程使用它们。

这个问题有多种解决方案。第一个 - 你可能根本不需要做任何事情。如果您担心 DPDK 将无法重新启动,因为您已经用完了大页面,那么这不是问题,因为 DPDK 会在分配新大页面之前清除所有未使用的大页面。

如果您想在关闭进程后将此内存释放回系统,您可能需要手动执行此操作。为此,您必须知道大页面的存储位置(即您的 hugetlbfs 安装位置)——在许多发行版中,它默认安装在 /dev/hugepages .如果你去那里清除所有的 rte_* 文件(假设你正在使用默认的 DPDK 前缀,你可能会这样做),所有的大页面都将被释放回系统。

最后,如果你不关心多进程,你可以在运行DPDK时使用--huge-unlink EAL参数[1]。这样一来,无论 DPDK 分配了多大的页面,它都会在之后立即删除文件。然后,当应用程序关闭时,hugepages 将通过关闭文件句柄自动释放。

在较新版本的 DPDK 中,这不是一个问题,因为 DPDK 可以动态地上下扩展其内存使用量 [2]。我不熟悉 DPDK-PROX,所以我不能说它是否支持更新的 DPDK 版本。

[1] https://software.intel.com/en-us/articles/memory-in-dpdk-part-3-1711-and-earlier-releases

[2] https://software.intel.com/en-us/articles/memory-in-dpdk-part-4-1811-and-beyond

关于dpdk - 如何释放DPDK应用分配的hugepages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57550830/

相关文章:

c - 当 2 个程序映射同一个文件时,mmap 如何工作

struct - 结构与数组的对齐规则冲突

c - 如何将基于 DPDK 的应用程序移植到 Netmap?

dpdk - DPDK中Reorder Library和IP分片的目的

c - 在 Ubuntu 16.04 上构建 DPDK 17.02 和 16.11 时出错

无法在 DPDK 示例应用程序中传输数据包

paging - 为什么使用 PAE 地址空间从 32 位增加到 36 位

linux - 大页面性能下降

c - 如何以编程方式获取特定地址的页面大小?

c - 免费 `mmap()-ed` 私有(private)大页面