क्या "मेमफद" के बारे में यह सोचना गलत है कि "उस प्रक्रिया के लिए जो फ़ाइल का मालिक है"?


15

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

सैद्धांतिक रूप से, आप memfd_create()नए syscalls को शुरू किए बिना [ ] व्यवहार प्राप्त कर सकते हैं , जैसे:

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

(ध्यान दें, यहां एक tmpfs की अधिक गारंटी के लिए, हम " /dev/shm" के बजाय " " का उपयोग कर सकते हैं /tmp)।

इसलिए, सबसे महत्वपूर्ण सवाल यह है कि नरक को हमें तीसरे तरीके की आवश्यकता क्यों है?

[...]

  • बैकिंग-मेमोरी को उस प्रक्रिया के लिए जिम्मेदार माना जाता है जो फ़ाइल का मालिक है और माउंट-कोटा के अधीन नहीं है।

^ क्या मैं इस वाक्य के पहले भाग पर भरोसा नहीं कर सकता हूं?

Memfd_create () कोड सचमुच एक "के रूप में कार्यान्वित किया जाता है [एक] tmpfs में लिंक रद्द फ़ाइल में रहने वाले जो गिरी आंतरिक होना चाहिए "। कोड को ट्रेस करते हुए, मैं समझता हूं कि यह एलएसएम जांचों को लागू नहीं करने में भिन्न है, "मुहरों" का समर्थन करने के लिए भी मेम बनाए गए हैं, जैसा कि ब्लॉग पोस्ट समझाने के लिए आगे बढ़ता है। हालांकि, मैं बहुत संदेह है कि memfds कर रहे हैं रहा हूँ हिसाब सिद्धांत रूप में एक tmpfile लिए अलग तरह से।

विशेष रूप से, जब ओओएम-हत्यारा दस्तक देता है, तो मुझे नहीं लगता कि यह स्मृति द्वारा आयोजित स्मृति के लिए जिम्मेदार होगा। यह कुल 50% RAM तक हो सकता है - आकार का मान = tmpfs के लिए विकल्प । कर्नेल आंतरिक tmpfs के लिए एक अलग मूल्य निर्धारित नहीं करता है, इसलिए यह 50% के डिफ़ॉल्ट आकार का उपयोग करेगा।

इसलिए मुझे लगता है कि हम आम तौर पर उन प्रक्रियाओं की अपेक्षा कर सकते हैं जो एक बड़े ज्ञापन को रखती हैं, लेकिन कोई अन्य महत्वपूर्ण स्मृति आवंटन नहीं है, जो ओओएम-मारे नहीं जाएंगे। क्या वो सही है?


2
जहां तक ​​OOM स्कोर है यह कर्नेल oom_badness फ़ंक्शन के लिए नीचे आता है । इसलिए मुझे संदेह है कि अगर मेम्फ़्ड_क्रिएट एक / proc / {pid} / मैप में नहीं दिखता है तो उसकी गिनती नहीं की जाती है। तो सामान्य उत्तर यह है कि वे मारे जा सकते हैं, लेकिन मेमफेड_क्रिएट के उपयोग के कारण उनका बड़ा स्कोर नहीं होगा। Fd के लिए मेमोरी को कई प्रक्रियाओं में साझा किया जा सकता है क्योंकि एकाधिक प्रक्रिया इनहेरिट / भेजी जा सकती है, एक ही fd।
डैनब्लैक

जवाबों:


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()उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.