【问题标题】:Free `mmap()-ed` Private Hugepages免费的`mmap()-ed`私有大页面
【发布时间】:2019-08-29 03:39:35
【问题描述】:

我有以下代码:

mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0);

我想知道在我的应用程序异常退出(例如崩溃)后如何释放大页面。

重新启动机器将释放所有大页面。但这对生产服务器有点破坏性。因此,我正在寻找一种不破坏现有流程的方法。

提前致谢!

【问题讨论】:

  • 如果应用程序已经崩溃,我很确定没有什么需要清理的了 :)
  • @tangrs 我注意到 numa 的可用页数正在下降 (numastat -vm)。
  • Linux 会有复杂的内存管理算法。我怀疑numastat 的输出与您的进程崩溃或启动有任何直接关系。 Linux Ate My RAM 与此没有直接关系,但有助于说明这一点(特别是 freeavailable 之间的区别)。
  • @tangrs right 计数器可能是错误的,但是当我的应用程序再次尝试 mmap 时。 Mmap 不再抱怨资源
  • @HCFS 也许,只是也许尝试删除大页面挂载点中的文件。这不是一个解决方案,而是一个肮脏的黑客。它对我有用,但可能对你不起作用,特别是如果多个应用程序共享 tlbpages。 ymmv。

标签: c linux centos7 mmap huge-pages


【解决方案1】:

当程序终止时,映射会自动取消映射。

以下语句来自《Linux 编程接口》一书。

当一个进程的所有映射被自动取消映射时 终止或执行 exec()。

【讨论】:

  • 教科书可能已经过时。也许显示对手册页的引用或合理最新的内容?
  • Manpage 确实这么说The region is also automatically unmapped when the process is terminated. On the other hand, closing the file descriptor does not unmap the region. 寿,我知道这不是真的,因为我还处理了/dev/shm 中的常规 SHM,几个月都没有清理...
【解决方案2】:

这是解决问题的一种可能方法,但不是唯一的方法。

您正在打开 mmap 并将 FD 设置为 -1。相反,请尝试使用这样的文件:

char page_file[256];
static unsigned page_counter;
int fd;

/* page_counter must be counted up and must be unique. */
snprintf(page_file, sizeof(page_file), "/var/huge/my_page_%u", page_counter);

fd = open(page_file, O_CREAT | O_RDWR, 0755);
if (fd == -1) {
    /* Handle error. */
}

addr = mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, fd, 0);

然后,您的应用程序初始化过程可以查找前缀为 /var/huge/my_page_* 的文件或您为应用程序选择的任何文件,并在调用 mmap 之前删除这些文件。这样,您就不会迷失在空间上。

现在要注意了。

  1. 如果此页面被其他应用程序共享,并且您的应用程序从崩溃中恢复,事情将变得致命。因此,请谨慎使用此解决方案。我建议这样做是因为据我所知,您没有与其他应用程序共享您的页面。

  2. 在你删除文件后,另一个应用mmapshuge pages在你可以分配之前的这段时间内,你将无法使用huge pages。

【讨论】:

  • $ ll /var/huge/ 返回ls: cannot access /var/huge/: No such file or directory。可能 CentOS 7 有所不同。而且我认为mmap() 将忽略或拒绝文件描述符!= -1 当指定MAP_PRIVATE 时,因为该区域是私有的并且内容不会被写回磁盘。
  • @HCSF 您可以选择挂载大页面的位置(以 root 身份)。人们通常将它安装在/mnt/huge 或某个地方。查看您的/proc/mounts 了解详情。我通常在/var/huge 这样做。至于MAP_PRIVATE,我认为不会被拒绝。
猜你喜欢
  • 2021-07-20
  • 2015-08-08
  • 1970-01-01
  • 2023-03-21
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2013-03-28
相关资源
最近更新 更多