@ ডানক্সড ডক্টারে যে ডকটিতে উল্লিখিত হয়েছে যে বিভাগ 9.6 "ওভারকমিট এবং ওওএম" বিশেষত ওভারকমিটকে অনুমতি দেওয়ার ঝুঁকির বিষয়ে গ্রাফিক। যাইহোক, 80
চেহারাটিও আমার কাছে আকর্ষণীয় বলে মনে হয়েছিল, তাই আমি কয়েকটি পরীক্ষা চালিয়েছি।
যা আমি পেয়েছি তা হ'ল overcommit_ratio
সমস্ত প্রক্রিয়াগুলিতে উপলব্ধ মোট র্যামকে প্রভাবিত করে। রুট প্রক্রিয়াগুলি সাধারণ ব্যবহারকারীর প্রক্রিয়াগুলির থেকে আলাদা আচরণ করা হয় বলে মনে হয় না।
এর 100
চেয়ে কম অনুপাত নির্ধারণ করে এমন ক্লাসিক শব্দার্থ সরবরাহ করা উচিত যেখানে থেকে ফেরতের মান malloc/sbrk
নির্ভরযোগ্য। 100
ক্যাশিং ইত্যাদির মতো প্রক্রিয়াবিহীন ক্রিয়াকলাপগুলির জন্য আরও র্যাম সংরক্ষণের উপায় হতে পারে এর চেয়ে কম অনুপাত সেট করা ।
সুতরাং, আমার কম্পিউটারে র্যামের 24 জিবিবি রয়েছে, অদলবদ অক্ষম, 9 জিআইবি ব্যবহারের সাথে top
প্রদর্শন করা হচ্ছে
Mem: 24683652k total, 9207532k used, 15476120k free, 19668k buffers
Swap: 0k total, 0k used, 0k free, 241804k cached
এখানে কিছু overcommit_ratio
সেটিংস রয়েছে এবং আমার র্যাম-গ্রাহক প্রোগ্রামটি কতটা র্যাম ধরতে পারে (প্রতিটি পৃষ্ঠাকে স্পর্শ করে) - প্রতিটি ক্ষেত্রেই প্রোগ্রামটি পরিষ্কারভাবে বের হয়ে গেলে একবার malloc
ব্যর্থ হয়।
50 ~680 MiB
60 ~2900 MiB
70 ~5200 MiB
100 ~12000 MiB
একসাথে বেশ কয়েকটি চালানো, এমনকী কারও কারও সাথে রুট ব্যবহারকারী হিসাবে, তারা একসাথে খাওয়া মোট পরিমাণ পরিবর্তন করেনি। এটি আকর্ষণীয় যে এটি সর্বশেষ 3+ GiB বা আরও গ্রাস করতে অক্ষম ছিল; free
অনেক এখানে কি দেখানো হচ্ছে নিচের ড্রপ নি:
Mem: 24683652k total, 20968212k used, 3715440k free, 20828k buffers
পরীক্ষাগুলি অগোছালো ছিল - সমস্ত র্যাম ব্যবহারের মুহুর্তে মলোক ব্যবহার করে এমন কিছু ক্র্যাশ হওয়ার প্রবণতা রয়েছে, যেহেতু অনেক প্রোগ্রামার সি-তে ম্যালোক ব্যর্থতাগুলি পরীক্ষা করার বিষয়ে ভয়ানক, কিছু জনপ্রিয় সংগ্রহশালা গ্রন্থাগারগুলি এটিকে পুরোপুরি উপেক্ষা করে এবং সি ++ এবং অন্যান্য বিভিন্ন ভাষা এমনকি খারাপ।
বলতে উপলব্ধ মেমরি 51% - - প্রয়োজন কাল্পনিক র্যাম আমি দেখেছি প্রথম বাস্তবায়নের অধিকাংশই একটি খুব নির্দিষ্ট ঘটনাতে, যেখানে একটি একক বৃহৎ প্রক্রিয়া হ্যান্ডেল ছিল fork()
করার জন্য exec()
কিছু সমর্থন প্রোগ্রাম, সাধারণত একটি অনেক, অনেক ছোট এক। অনুলিপি-সহ লেখার শব্দাবলী সহ ওএসগুলি অনুমতি দেবে fork()
, তবে এই প্রবক্তার সাথে যে কাঁটাচামচ প্রক্রিয়াটি যদি আসলে অনেকগুলি মেমরি পৃষ্ঠাগুলি সংশোধন করার চেষ্টা করে (যার প্রত্যেকটি প্রথমে প্রারম্ভিক বিশাল প্রক্রিয়া থেকে পৃথক একটি নতুন পৃষ্ঠা হিসাবে ইনস্ট্যান্ট করতে হবে) এটি হত্যা করা শেষ হবে। আরও মেমরি বরাদ্দ করা হলে পিতামাতার প্রক্রিয়াটি কেবল বিপদে পড়েছিল এবং কিছু ক্ষেত্রে কেবল অন্য কিছু প্রক্রিয়াটি মরে যাওয়ার জন্য অপেক্ষা করার পরে এবং তারপরে চালিয়ে যেতে পারে could শিশু প্রক্রিয়া সাধারণত একটি (সাধারণত ছোট) প্রোগ্রামের মাধ্যমে নিজেকে প্রতিস্থাপন করেexec()
এবং তখন প্রোভিসো থেকে মুক্ত ছিল।
লিনাক্সের ওভারকমিট ধারণাটি উভয়টি fork()
ঘটতে দেয় এবং একক প্রক্রিয়াগুলিকে ব্যাপকভাবে সামগ্রিকভাবে চালিত করার অনুমতি দেওয়ার জন্য একটি চূড়ান্ত পদ্ধতি approach হলে OOM kills-হত্যাকারী-সৃষ্ট মৃত্যু, অ্যাসিঙ্ক্রোনাস ঘটতে এমনকি প্রোগ্রাম যে কি করতে হ্যান্ডেল মেমরি অ্যালোকেশন দায়িত্বের। আমি ব্যক্তিগতভাবে সাধারণভাবে সিস্টেম- ওভার ওভার কমিট এবং বিশেষত ওম-কিলারকে ঘৃণা করি - এটি মেমরি পরিচালনার জন্য একটি শয়তান-মেয়ের পদ্ধতির উত্সাহ দেয় যা গ্রন্থাগারগুলিকে সংক্রামিত করে এবং তাদের ব্যবহার করে এমন প্রতিটি অ্যাপ্লিকেশন তাদের মাধ্যমে।
আমি অনুপাতটি 100 এ সেট করার পরামর্শ দিয়েছি, এবং পাশাপাশি একটি অদলবদল পার্টিশন থাকার ফলে সাধারণত বিশাল প্রক্রিয়াগুলি ব্যবহার করা শেষ হয়ে যায় - যা প্রায়শই কেবল নিজের অংশের একটি ক্ষুদ্র ভগ্নাংশ ব্যবহার করে যা অদলবদল হয়ে যায়, এবং এভাবেই OOM হত্যাকারী অপব্যবহার থেকে প্রচুর পরিমাণে প্রক্রিয়া রক্ষা করুন। এটি আপনার ওয়েবসার্ভারটিকে এলোমেলো মৃত্যু থেকে নিরাপদ রাখতে হবে এবং যদি এটি malloc
দায়বদ্ধতার সাথে পরিচালনার জন্য রচিত হয় তবে নিজেকে হত্যা করা থেকেও সুরক্ষিত করা উচিত (তবে পরবর্তী ক্ষেত্রে বাজি ধরবেন না)।
তার মানে আমি এটি ব্যবহার করছি /etc/sysctl.d/10-no-overcommit.conf
vm.overcommit_memory = 2
vm.overcommit_ratio = 100