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