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