您看到的行为是 18.05 或 18.05+ 之前的 DPDK 版本的特征,带有--legacy-mem
参数。我将假设前者更有可能。
这是因为 DPDK 支持某种形式的多处理,它允许“辅助”进程附加到“主”进程,即使它已经退出。由于 DPDK 依赖于大页面文件(在hugetlbfs
文件系统中)在其主进程和辅助进程之间共享内存,因此这些大页面文件在应用程序退出后不会被删除,以允许辅助进程使用它们。
这个问题有多种解决方案。第一个 - 你可能根本不需要做任何事情。如果你担心 DPDK 因为你的大页面用完而无法重新启动,那么这不是问题,因为 DPDK 会在分配新的大页面之前清除所有未使用的大页面。
如果您想在关闭进程后将此内存释放回系统,您可能需要手动执行此操作。为此,您必须知道大页面的存储位置(即您的hugetlbfs
安装位置)——在许多发行版上,/dev/hugepages
默认情况下它是安装在哪里的。如果你去那里清除所有rte_*
文件(假设你使用默认的 DPDK 前缀,你可能会这样做),所有的大页面都将被释放回系统。
最后,如果您不关心多处理,您可以--huge-unlink
在运行 DPDK 时使用 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