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?
sumber
Jawaban:
Membangun jawaban @ danblack:
Keputusan didasarkan pada
oom_kill_process()
(dibersihkan sedikit):( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L974 )
Yang tergantung pada
oom_badness()
untuk menemukan kandidat terbaik:oom_badness()
tidak:( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L233 )
Dimana:
( https://github.com/torvalds/linux/blob/master/mm/oom_kill.c#L966 )
Jadi sepertinya itu menghitung halaman anonim, yang
memfd_create()
digunakan.sumber