「memfd」を「ファイルを所有するプロセス」に説明されていると考えるのは間違っていますか?


15

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

理論的には、次のmemfd_create()ような新しいsyscallを導入せずに[ ]動作を実現できます。

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

(ここでtmpfsをより移植可能に保証するには、「/dev/shm」の代わりに「/tmp」を使用できます)。

したがって、最も重要な質問は、なぜ地獄には第三の方法が必要なのかということです。

[...]

  • バッキングメモリは、ファイルを所有するプロセスに割り当てられ、mount-quotasの影響を受けません。

^この文の最初の部分は信頼できないと思うのは正しいですか?

memfd_create()コードは、文字通り「として実装されているカーネル内部でなければならない[A] TMPFSにリンクされていないファイル・リビング」。コードをトレースすると、LSMチェックを実装していない点が異なることを理解しています。また、ブログ投稿で説明しているように、「シール」をサポートするためにmemfdsも作成されています。ただし、me​​mfdsが原則としてtmpfileとは異なる方法で説明されることは非常に懐疑的です。

具体的には、OOM-killerがノッキングを起こすと、memfdsが保持しているメモリを考慮しないと思います。これは、RAMの最大50%(tmpfsのsize =オプションの値)になります。カーネルは内部tmpfsに異なる値を設定しないため、デフォルトサイズの50%を使用します。

したがって、一般に、大きなmemfdを保持するプロセスを期待できるが、他の重要なメモリ割り当てはOOMで強制終了されないでしょう。あれは正しいですか?


2
OOMスコアに関する限り、カーネルのoom_badness関数に帰着するようです。そのため、memfd_createが/ proc / {pid} / mapに表示されない場合はカウントされません。したがって、一般的な答えは、それらは殺される可能性がありますが、memfd_createを使用しているため、大きなスコアはありません。複数のプロセスが同じfdを継承/送信できるため、fdのメモリをプロセス間で共有できます。
ダンブラック

回答:


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()使用されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.