如何释放由DPDK应用程序分配的大页面?

时间:2019-08-19 05:18:06

标签: 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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

在较新版本的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