将“ memfd”视为“拥有文件的进程”是否错误?


15

https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/

从理论上讲,您可以在memfd_create()不引入新系统调用的情况下实现[ ]行为,如下所示:

int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);

(请注意,为了在此处更方便地保证tmpfs,我们可以使用“ /dev/shm”代替“ /tmp”)。

因此,最重要的问题是为什么我们到底需要第三种方式?

[...]

  • 后备内存用于拥有文件且不受安装配额限制的进程。

^我认为这句话的第一部分不值得依靠吗?

所述memfd_create()的代码被作为“的字面实施链接的文件居住在[α] TMPFS必须是内核内部 ”。跟踪代码,我知道它与不实施LSM检查有所不同,正如博客文章继续说明的那样,它还创建了memfds以支持“密封”。但是,我非常怀疑memfds正在考虑不同的,以原则上TMPFILE。

具体来说,当OOM杀手敲门时,我认为它不会解决memfds持有的内存问题。这可能总计高达RAM的50%-tmpfssize = option的值。内核不会为内部tmpfs设置其他值,因此它将使用默认大小50%。

因此,我认为我们通常可以期望拥有大memfd的进程,但是没有其他重要的内存分配不会被OOM杀死。那是对的吗?


2
就OOM分数而言,似乎归结为内核oom_badness函数。所以我怀疑如果memfd_create没有出现在/ proc / {pid} / map中,那么它就不算在内。因此,通常的答案是可以将它们杀死,但是由于使用了memfd_create,它们的得分不会很高。fd的内存可以跨多个进程共享,因为多个进程可以继承/发送相同的fd。
danblack

Answers:


1

建立在@danblack的答案上:

该决定基于oom_kill_process()(清理了一下):

for_each_thread(p, t) {
        list_for_each_entry(child, &t->children, sibling) {
                unsigned int child_points;

                child_points = oom_badness(child,
                        oc->memcg, oc->nodemask, oc->totalpages);
                if (child_points > victim_points) {
                        put_task_struct(victim);
                        victim = child;
                        victim_points = child_points;
                        get_task_struct(victim);
                }
        }
}

https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L974

取决于oom_badness()找到最佳人选:

child_points = oom_badness(child,
        oc->memcg, oc->nodemask, oc->totalpages);

oom_badness() 确实:

points = get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS) +
        mm_pgtables_bytes(p->mm) / PAGE_SIZE;

https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L233

哪里:

static inline unsigned long get_mm_rss(struct mm_struct *mm)
{
        return get_mm_counter(mm, MM_FILEPAGES) +
                get_mm_counter(mm, MM_ANONPAGES) +
                get_mm_counter(mm, MM_SHMEMPAGES);
}

https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L966

因此,看起来它计算的是匿名页面memfd_create()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.