এটা হতে পারে.
লিনাক্সে আপনি মুখোমুখি হতে পারেন এমন দুটি ভিন্ন মেমরির শর্ত রয়েছে। আপনার মুখোমুখি যা sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
) এর মান উপর নির্ভর করে
ভূমিকা:
কার্নেলটি 'মেমরি ওভারকমিট' নামে পরিচিত যা সম্পাদন করতে পারে। এটি তখন হয় যখন কার্নেল সিস্টেমের মধ্যে উপস্থিত উপস্থিতির চেয়ে বেশি মেমরির বরাদ্দ দেয়। এটি এই প্রত্যাশায় করা হয় যে প্রোগ্রামগুলি তাদের বরাদ্দকৃত সমস্ত মেমরি ব্যবহার করবে না কারণ এটি একটি সাধারণ ঘটনা।
overcommit_memory = 2
যখন overcommit_memory
সেট করা থাকে 2
, কার্নেল কোনওরকম অতিরিক্ত ওভার কমিট সম্পাদন করে না। পরিবর্তে যখন কোনও প্রোগ্রাম মেমরি বরাদ্দ করা হয়, তখন সেই মেমরিটির অ্যাক্সেসের নিশ্চয়তা দেওয়া হয়। যদি সিস্টেমের কাছে বরাদ্দ অনুরোধটি পূরণ করার জন্য পর্যাপ্ত ফ্রি মেমরি না থাকে তবে কার্নেলটি অনুরোধের জন্য কেবল একটি ব্যর্থতা ফিরিয়ে দেবে। পরিস্থিতি নিষ্ঠার সাথে পরিচালনা করার জন্য এটি প্রোগ্রামের কাজ। যদি এটি পরীক্ষা করে না যে বরাদ্দটি সত্যই ব্যর্থ হওয়ার পরে সফল হয়েছিল, তবে অ্যাপ্লিকেশনটি প্রায়শই সেগফল্টের মুখোমুখি হয়।
সেগফল্টের ক্ষেত্রে আপনার আউটপুটে একটি লাইন পাওয়া উচিত dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
এর at 0
মানে হল যে অ্যাপ্লিকেশনটি একটি অবিশ্রান্ত পয়েন্টার অ্যাক্সেস করার চেষ্টা করেছে, যা মেমরি বরাদ্দ কল ব্যর্থ হতে পারে (তবে এটি একমাত্র উপায় নয়)।
overcommit_memory = 0 এবং 1
কখন overcommit_memory
সেট করা হয় 0
বা যখন 1
, ওভারকমিট সক্ষম করা থাকে এবং প্রোগ্রামগুলিকে সত্যিকারের চেয়ে বেশি মেমরি বরাদ্দ করার অনুমতি দেওয়া হয়।
যাইহোক, যখন কোনও প্রোগ্রাম এটিকে বরাদ্দ করা মেমরিটি ব্যবহার করতে চায় তবে কার্নেল আবিষ্কার করে যে এটির জন্য এটি যথেষ্ট পরিমাণে মেমরি নেই আসলে এটির কিছুটা মেমরি ফিরে পাওয়া দরকার। এটি প্রথমে বিভিন্ন মেমরি ক্লিনআপ কার্য সম্পাদন করার চেষ্টা করে, যেমন ফ্লাশিং ক্যাশে, তবে এটি যদি পর্যাপ্ত পরিমাণে না হয় তবে এটি একটি প্রক্রিয়াটি শেষ করে দেবে। এই সমাপ্তিটি ওওএম-কিলার দ্বারা সম্পাদিত হয়। ওওএম-কিলার সিস্টেমের দিকে নজর রাখে কোন প্রোগ্রামগুলি কী মেমরি ব্যবহার করে, কতক্ষণ ধরে চলছে, কে চালাচ্ছে এবং কোনটি মারা গেছে তা নির্ধারণ করার জন্য আরও অনেক কারণ রয়েছে to
প্রক্রিয়াটি মারা যাওয়ার পরে, এটি ব্যবহার করা মেমরিটি মুক্ত হয়ে যায়, এবং যে প্রোগ্রামটি কেবলমাত্র স্মৃতি-বহির্ভূত অবস্থার কারণ হয়ে গেছে এখন এটির প্রয়োজনীয় স্মৃতি রয়েছে।
যাইহোক, এমনকি এই মোডে, প্রোগ্রামগুলি এখনও বরাদ্দের অনুরোধ অস্বীকার করা যেতে পারে। যখন overcommit_memory
হয় 0
, কার্নেল যখন এটি বরাদ্দ অনুরোধ আত্মত্যাগী শুরু করা উচিত এ সেরা অনুমান নিতে চেষ্টা করে। যখন এটি সেট করা থাকে 1
, আমি নিশ্চিত নই যে এটি কখন একটি অনুরোধ অস্বীকার করবে তা নির্ধারণ করতে এটি কোন দৃ what়সংকল্পটি ব্যবহার করে তবে এটি খুব বড় অনুরোধকে অস্বীকার করতে পারে।
OOM-Killer এর আউটপুট দেখে dmesg
এবং কোনও বার্তা খুঁজে বার করে যেমন দেখতে পান:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB