Vm.overcommit_memory কীভাবে কাজ করে?


49

আমি যখন ডিফল্ট সেটিংস ব্যবহার করি:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

আমি /proc/meminfoফাইল থেকে এই মানগুলি পড়তে পারি :

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

কিন্তু আমি যখন পরিবর্তন vm.overcommit_memoryথেকে 0থেকে 2, আমি অ্যাপ্লিকেশন যে আমি পরিবর্তন প্রভাবী হওয়ার আগে শুরু করতে পারে একই সেট শুরু করতে অক্ষম নই, বিশেষ করে Amarok। আমাকে পরিবর্তন vm.overcommit_ratioকরতে হয়েছিল 300, তাই সীমাটি বাড়ানো যেতে পারে। এখন আমি যখন আমারোক শুরু করি, /proc/meminfoনিম্নলিখিতগুলি দেখায়:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

এই মেশিন র্যাম মাত্র 1GiB আছে, কিন্তু Amarok যখন সমস্যা ছাড়াই কাজ করে vm.overcommit_memory0 থেকে কিন্তু তা নির্ধারণের ক্ষেত্রে সেট করা হয় 2, Amarok মেমরি 2GiB উপর বরাদ্দ করা প্রয়োজন। এটা কি স্বাভাবিক আচরণ? যদি তা হয়, তবে কেউ কি ব্যাখ্যা করতে পারে, উদাহরণস্বরূপ, ফায়ার ফক্স (যা আমরোকের চেয়ে 4-6x মেমরি বেশি খায়) পরিবর্তনের আগে এবং পরে একইভাবে কাজ করে কেন?

উত্তর:


66

আপনি ডকুমেন্টেশন man 5 proc( বা কার্নেল.আর.এ ) খুঁজে পেতে পারেন :

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

এর সহজ উত্তরটি হ'ল ওভারকমিট 1 এ সেট করা মঞ্চটি সেট করবে যাতে কোনও প্রোগ্রাম যখন কিছু কল করে malloc()মেমরির একটি অংশকে বরাদ্দ করতে চায় ( man 3 malloc), সিস্টেম সর্বদা এটি সফল হয় যদি তা জেনে থাকে যদি সিস্টেমের জানা থাকে যে এটির সমস্ত স্মৃতি থাকবে না জিজ্ঞাসা।

অন্তর্নিহিত ধারণাটি বুঝতে ভার্চুয়াল মেমরির ধারণা । প্রোগ্রামগুলি একটি ভার্চুয়াল ঠিকানার স্থান দেখে যা প্রকৃত শারীরিক মেমরির সাথে ম্যাপ করা যায় বা নাও পারে। ওভার কমিট চেকিং অক্ষম করে আপনি ওএসকে কেবল ধরে নিতে বলেছেন যে ভার্চুয়াল স্পেস ব্যাকআপ করার জন্য যথেষ্ট পরিমাণে শারীরিক মেমরি রয়েছে।

উদাহরণ

কেন কখনও কখনও এটি গুরুত্বপূর্ণ হতে পারে তা হাইলাইট করার জন্য, কেন এটির জন্য 1 সেট করা উচিত সে সম্পর্কে রেডিস নির্দেশিকাগুলি একবার দেখুন vm.overcommit_memory


2
তবে Committed_ASউভয় ক্ষেত্রেই এর মান এক হওয়া উচিত না ?
মিখাইল মরফিকভ

@ মিখাইলমারফিকভ: তাত্ত্বিকভাবে, আমি এটি বিশ্বাস করি, তবে এই প্রোগ্রামগুলি কী করছে কে জানে। একটি সরল প্রোগ্রামের সাথে আরও নিয়ন্ত্রিত পরিবেশ দেখতে চাই যা মলোকের মাধ্যমে এক গিগ র্যাম বলতে বরাদ্দ করে। এবং তারপরে পরীক্ষার মধ্যে রিবুট করার পরে পরীক্ষা চালান।
কাইল ব্র্যান্ড্ট

ঠিক আছে, তাই 0আপাতত সাথে থাকব ।
মিখাইল মরফিকভ

2
@ মিখাইল মরফিকভ: হ্যাঁ, কার্যত আমি মনে করি 0 সবচেয়ে সার্থক করে তোলে। আমার পরিবেশে, কেবলমাত্র আমি 1 সক্ষম করার সময়টি রেডিসের জন্য, এটি এমন প্রত্যাশা করে যেখানে এটি কাঁটাচামচ () এর কারণে ব্যবহার করছে এমন অনেক বেশি মেমরি চাইবে stuff শিশু একই রকমের সমস্ত মেমরি পৃষ্ঠাগুলি ব্যবহার করবে, তবে লিনাক্স জানে না যে নিরাপদ বলে এটি 2x মেমরিটি ব্যবহার করা হবে ধরে নিতে হবে (আপনি আরও শিখতে চাইলে: redis.io/topics/faq )
কাইল ব্র্যান্ড্ট

আপনার উত্তরের শেষ বিবৃতিটি "অতিরিক্ত কমিট সক্ষম করে" এর মতো শুরু করা উচিত নয়? কারণ এটি 1 এ সেট করার অর্থ আপনি ওভার কমিট করতে বলছেন, তাই না?
asgs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.