【发布时间】: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