【问题标题】:using O_TMPFILE to clean up huge pages... or other methods?使用 O_TMPFILE 清理大页面...或其他方法?
【发布时间】:2016-12-01 13:40:23
【问题描述】:

我的程序正在使用大页面。为此,它打开文件如下:

oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

filename 在hugetlb 文件系统中的位置。 这样可行。然后我的程序可以mmap() 创建的文件描述符。但是如果我的程序被杀死,文件仍然存在......并且在大页面文件系统中,剩余文件被阻塞内存,如以下命令所示(876!= 1024):

cat /proc/meminfo  | grep Huge

AnonHugePages:    741376 kB
HugePages_Total:    1024
HugePages_Free:      876
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

因此,由于我的程序没有将文件共享给其他任何人,因此使用 O_TMPFILE 标志创建临时文件对我来说是有意义的。 所以我尝试了:

oflags = O_RDWR | O_TMPFILE;
fd = open(pathname, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

其中路径名是hugetlbfs 的节点。 失败(由于我无法解释的原因)并出现以下错误:

open failed for /dev/hugepages: Operation not supported

为什么?更重要的是:如何保证我的程序正在使用的所有大页面都被释放?

是的:我可以捕捉到一些信号(例如SIGTERM);但不是全部 (SIGKILL)

是的:我可以使用第一种方法尽快unlink() 文件,但是如果在open()unlink() 之间收到SIGKILL 怎么办。

内核如担保。我也是。无论我的程序何时或如何终止,保证 100% 清理的正确方法是什么。

【问题讨论】:

  • 您不能简单地调用mmap( NULL, bytes, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_HUGETLB, -1, 0 ); 而不是使用hugetlbfs 文件系统吗?每the huge TLB documentation:“另外,请务必注意,如果应用程序仅使用 shmat/shmget 系统调用或带有 MAP_HUGETLB 的 mmap,则不需要此类挂载命令。”
  • @Andrew:我的程序在不同进程之间共享内存,所以我需要文件描述符。您的评论很有道理,我应该在我原来的问题中指定这一点。
  • 假设如果您的进程可能被杀死后文件被清理,您的程序只会重新创建文件,那么重用现有的hugetlbfs 文件是否有效?如果您只是要重新创建文件,那么不清理它真的很重要吗?
  • 是的。这很重要。每次运行都会创建具有不同名称和大小的文件。但我的问题更多是理论上的问题:在 open() 之后和 mmap() 工作之前立即取消链接文件,并且在两者之间被 sigkilled 的机会很小。但我不喜欢这种“99%”的方法,我有点惊讶它看起来不像是 100% 的答案......

标签: linux file kernel mmap huge-pages


【解决方案1】:

似乎还没有为hugetlbfs 实现O_TMPFILE;事实上,这个选项需要底层文件系统的支持:

O_TMPFILE 需要底层文件系统的支持;只有一部分 Linux 文件系统提供这种支持。在最初的实现中,在 ex2、ext3、ext4、UDF、Minix 和 shmem 文件系统中提供了支持。添加了 XFS 支持 在 Linux 3.15 中。

这可以通过查看内核源代码得到证实,其中在 hugetlbfs 中没有 inode_ops->tmpfile() 实现。

我相信这里的正确答案是致力于这个实现......


我注意到您对 unlink() 选项的评论,但是,也许以下方法没有那么危险:

  • 使用 TRUNCATE 打开文件(按名称)(因此您可以假设其大小为 0)
  • 取消链接
  • mmap() 它与您的目标大小

如果你的程序在中间被杀死,最坏的情况是留下一个空文件。

【讨论】:

  • 嗯,看起来不太对劲,真的。你的建议就是我现在正在做的。并不是说我真的很喜欢它……谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 2012-06-04
  • 2014-05-20
相关资源
最近更新 更多