"ফাইলটির মালিকানাধীন প্রক্রিয়াটির জন্য" "মেমফিড" এর হিসাবে গণ্য করা কি ভুল?


15

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)।

অতএব, সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন হ'ল কেন আমাদের তৃতীয় পথের দরকার?

[...]

  • ব্যাকিং-মেমোরিটি সেই প্রক্রিয়া হিসাবে গণ্য হয় যা ফাইলটির মালিক এবং মাউন্ট-কোটার সাপেক্ষে নয়।

Sentence আমি কি এই বাক্যটির প্রথম অংশটির উপর নির্ভর করতে পারি না ভেবে ঠিকই আছি?

Memfd_create () কোড আক্ষরিক একটি "হিসাবে প্রয়োগ করা হয় [এক] tmpfs মধ্যে লিঙ্কমুক্ত ফাইল জীবন যাপন যেটি কার্ণেল অভ্যন্তরীণ হওয়া আবশ্যক "। কোডটি সনাক্ত করে, আমি বুঝতে পেরেছি এটি এলএসএম চেকগুলি প্রয়োগ না করার ক্ষেত্রে পৃথক, ব্লগ পোস্টটি ব্যাখ্যা করার সাথে সাথে "সিলগুলি" সমর্থন করার জন্য মেমফিডগুলিও তৈরি করা হয়েছে। যাইহোক, আমি অত্যন্ত সন্দেহপ্রবণ যে memfds হয় আছি হিসাব নীতিগতভাবে একটি tmpfile ভিন্নভাবে।

বিশেষত, যখন ওওএম-হত্যাকারী নক করে আসে, তখন আমি মনে করি না যে এটি স্মৃতিচারণকারীদের দ্বারা স্মৃত মেমরির জন্য দায়বদ্ধ হবে। এটি মোট র্যামের 50% পর্যন্ত হতে পারে - tmpfs এর জন্য আকার = বিকল্পের মান । কার্নেল অভ্যন্তরীণ tmpfs এর জন্য আলাদা মান নির্ধারণ করে না, সুতরাং এটি 50% এর ডিফল্ট আকার ব্যবহার করবে।

সুতরাং আমি মনে করি আমরা সাধারণত এমন প্রক্রিয়াগুলি আশা করতে পারি যা একটি বৃহত মেমফিড ধারণ করে তবে অন্য কোনও উল্লেখযোগ্য মেমরি বরাদ্দ, ওওএম-নিহত হবে না। এটা কি ঠিক?


2
যতক্ষণ OOM স্কোর যায় ততই কার্নেল oom_badness ফাংশনে নেমে আসে বলে মনে হয় । সুতরাং আমি সন্দেহ করি যে যদি / স্মারক / {পিড} / মানচিত্রে মেমফিড_ক্রিয়েট প্রদর্শিত না হয় তবে তা গণনা করা হয়নি। সুতরাং সাধারণ উত্তরটি হ'ল তারা নিহত হতে পারে তবে মেমফিড_ক্রিয়েট ব্যবহারের কারণে তাদের বড় স্কোর হবে না। একাধিক প্রক্রিয়া উত্তরাধিকারী / প্রেরণ করা যেতে পারে, একই fd হিসাবে প্রক্রিয়া জুড়ে fd এর জন্য মেমরি ভাগ করা যায়।
ড্যানব্ল্যাক

উত্তর:


1

@ ড্যানব্ল্যাকের জবাবের ভিত্তিতে বিল্ডিং:

সিদ্ধান্তটি 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()ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.