我正在使用 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/