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

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

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"を使用できます。)

それで最も重要な質問は、なぜ第3の方法が必要なのかということです。

[...]

  • メモリバックアップはファイルを所有するプロセスの責任であり、インストールクォータの適用を受けません。

^ この文章の最初の部分は信じられないと思いますか?

これmemfd_create() コード実際に」リンクされていないファイルは、カーネル内になければならない[a] tmpfsにあります。コードを追跡してみると、LSMチェックを実装していないのと同じことがわかりました。会計原則としてtmpfileとは異なります。

具体的にいつOOMキラーノックしてみてください。 memfdsが保持しているメモリを説明できないようです。これはRAMの最大50%を占めることができます。つまり、size= tmpfs オプション。カーネルは内部tmpfsに他の値を設定しないため、デフォルトサイズの50%を使用します。

したがって、通常、大きなmemfdを保持しているが他の重要なメモリ割り当てを持たないプロセスは、OOMによって終了しないと予想できます。そうですか?

答え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()。これが目的です。

答え2

はい、あなたの理解は通常正確です。memfd_create()匿名ファイルを生成するためのシステムコールです。ファイルは通常のファイルのように動作しますが、RAMに残り、特定のファイルシステムに接続されません。[1]。これは、他の匿名メモリ割り当てと同様に、メモリ使用量が所有プロセスに直接影響することを意味します。malloc() [2]。したがって、割り当てがファイルシステムまたはマウントポイントにバインドされていない場合、そのレベルで適用されるクォータには含まれません。

これOOMキラーターゲットプロセスは、ソースに関係なく、主に全メモリ消費量とシステムメモリ圧力全体への影響に基づいています。一時ファイルシステム匿名の記憶)[サム]。ただし、OOM Killerは、メモリマップファイルと匿名メモリを含む合計メモリ使用量を考慮します。

memfd_create()合計メモリ使用スペースの割合で使用されるメモリで測定するとき、プロセスが多数の割り当てを保持し、他のメモリ割り当てが最小memfd_create()化された場合、他のプロセスに比べて単にOOMキラーの対象になる可能性が少なくなります。使用量は依然として低いと見なすことができます。プロセス。

memfd_create()OOM キラーの割り当てに対する態度は、他の割り当てとは大きく異なり、tmpfilesこれは、さまざまな割り当てタイプに対する OOM キラーの特定のメカニズムではなく、Linux がメモリ全体を解釈し管理する方法の結果です。[4]

関連情報