GNU/Linux >> Belajar Linux >  >> Linux

Linux – Apakah Salah Memikirkan “memfd” Sebagai Yang Dipertanggungjawabkan “ke Proses Yang Memiliki File”?

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

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

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

(Catatan, untuk menjamin tmpfs secara lebih portabel di sini, kita dapat menggunakan “/dev/shm ” bukannya “/tmp “).

Oleh karena itu, pertanyaan terpenting adalah mengapa kita membutuhkan cara ketiga?

[…]

  • Memori cadangan diperhitungkan ke proses yang memiliki file dan tidak tunduk pada kuota pemasangan.

^ Apakah saya benar dalam berpikir bahwa bagian pertama dari kalimat ini tidak dapat diandalkan?

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

Secara khusus, ketika pembunuh OOM datang mengetuk, saya tidak berpikir itu akan memperhitungkan memori yang disimpan oleh memfds. Ini bisa berjumlah hingga 50% dari RAM – nilai opsi size=untuk tmpfs. Kernel tidak menetapkan nilai yang berbeda untuk tmpfs internal, jadi kernel akan menggunakan ukuran default 50%.

Jadi saya pikir kita secara umum dapat mengharapkan proses yang menyimpan memfd besar, tetapi tidak ada alokasi memori signifikan lainnya, tidak akan dimatikan OOM. Apakah itu benar?

Jawaban yang Diterima:

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 bergantung pada oom_badness() untuk menemukan kandidat terbaik:

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

oom_badness() melakukan:

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, yaitu memfd_create() menggunakan.


Linux
  1. Temukan Waktu Eksekusi Perintah Atau Proses Di Linux

  2. Linux – Apakah Proses Yang Memiliki Terminal Pengendali, Atau Sesi Yang Memiliki Terminal Pengendali?

  3. UNIX / Linux :Bagaimana mengubah kebaikan (prioritas) suatu proses

  1. Cara Menemukan Paket Yang Menyediakan File Tertentu Di Linux

  2. Apa sumber kernel Linux saat ini?

  3. Apa definisi sesi di linux?

  1. Linux – Bagaimana Cara Mengatur Afinitas Prosesor Suatu Proses Di Linux?

  2. Apa arti &di akhir perintah linux?

  3. Menemukan proses yang menggunakan port tertentu di Linux