Apakah salah untuk menganggap "memfd" sebagai "proses yang memiliki file"?

15

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

Secara teoritis, Anda bisa mencapai memfd_create()perilaku [ ] tanpa memperkenalkan syscall baru, seperti ini:

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

(Catatan, untuk lebih menjamin portabel tmpfs di sini, kita dapat menggunakan " /dev/shm" bukan " /tmp").

Karena itu, pertanyaan yang paling penting adalah mengapa kita membutuhkan cara ketiga?

[...]

  • Backing-memory dicatat ke proses yang memiliki file dan tidak tunduk pada kuota-mount.

^ Apakah saya benar dalam memikirkan bagian pertama dari kalimat ini yang tidak dapat diandalkan?

Kode memfd_create () benar-benar diimplementasikan sebagai " file tidak terhubung yang tinggal di [a] tmpfs yang harus berupa kernel internal ". Menelusuri kode, saya mengerti berbeda dalam tidak menerapkan pemeriksaan LSM, juga memfds dibuat untuk mendukung "segel", seperti yang dijelaskan oleh posting blog. Namun, saya sangat skeptis bahwa memfds dicatat secara berbeda pada tmpfile pada prinsipnya.

Secara khusus, ketika OOM-killer datang mengetuk, saya tidak berpikir itu akan menjelaskan memori yang dipegang oleh memfds. Ini dapat total hingga 50% RAM - nilai opsi size = untuk tmpfs . Kernel tidak menetapkan nilai yang berbeda untuk tmpfs internal, sehingga akan menggunakan ukuran default 50%.

Jadi saya pikir kita umumnya dapat mengharapkan proses yang menyimpan memfd besar, tetapi tidak ada alokasi memori yang signifikan, tidak akan dibunuh oleh OOM. Apakah itu benar?

sourcejedi
sumber
2
Sejauh nilai OOM berjalan sepertinya turun ke fungsi kernel oom_badness . Jadi saya curiga jika memfd_create tidak muncul di / proc / {pid} / map maka itu tidak dihitung. Jadi jawaban umumnya adalah mereka bisa dibunuh, tetapi mereka tidak akan memiliki skor besar karena penggunaan terfd_create. Memori untuk fd dapat dibagi di seluruh proses karena beberapa proses dapat mewarisi / dikirim, fd yang sama.
danblack

Jawaban:

1

Membangun jawaban @ danblack:

Keputusan didasarkan pada oom_kill_process()(dibersihkan sedikit):

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 )

Yang tergantung pada oom_badness()untuk menemukan kandidat terbaik:

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

oom_badness() tidak:

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 )

Dimana:

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 )

Jadi sepertinya itu menghitung halaman anonim, yang memfd_create()digunakan.

V13
sumber