Vm.overcommit_memory কনফিগার করার প্রভাব


41

সেন্টোস 5.4 (লিনাক্স কার্নেল 2.6.16.33-xenU) এ চালিত আমার ভিপিএস ওয়েব সার্ভার অনিয়মিতভাবে (মাসে একবার দেওয়া বা কয়েক সপ্তাহ সময় দেওয়ার মতো) ওম-হত্যাকারী লাথি মারার কারণে প্রতিক্রিয়াহীন হয়ে ওঠে the সার্ভারের পর্যবেক্ষণ থেকে দেখা যায় যে এটি না সাধারণত স্মৃতিশক্তি প্রায় শেষ হয় না।

আমি কয়েকটি ব্লগ পড়েছি যা এই পৃষ্ঠায় ইঙ্গিত করে যা নিম্নলিখিত সিস্টেস্টল সেটিংস ব্যবহার করে ওভার কমিট পরিচালনা করার জন্য কার্নেলটি কনফিগার করার বিষয়ে আলোচনা করে:

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

এটি সম্পর্কে আমার বোঝাপড়া (যা ভুল হতে পারে তবে আমি স্পষ্ট করার জন্য একটি সাধারণ সংজ্ঞা পেতে পারি না) এটি হ'ল শারীরিক মেমরির 80% অদলবদলের বাইরে কার্নেলকে অতিরিক্ত বরাদ্দকারী মেমরির বাধা দেয়।

যাইহোক, আমি আরও কিছু উত্সও পড়েছি যা পরামর্শ দিয়েছিল যে এই সেটিংসটি কোনও ভাল ধারণা নয় - যদিও এই পদ্ধতির সমালোচকরা মনে করছেন "এই ক্লেজটি চেষ্টা করার পরিবর্তে" আপনার সিস্টেমটি ভেঙে ফেলার জন্য কিছু করবেন না "বলে মনে হচ্ছে যে কার্যকারিতা সর্বদা জানা যায়।

সুতরাং আমার প্রশ্নটি হল, প্রায় 10 কম ট্রাফিক সাইটকে হোস্টিং করা অ্যাপাচি 2 ওয়েব সার্ভারের প্রসঙ্গে এই পদ্ধতির পক্ষে কি কি মতামত রয়েছে? আমার নির্দিষ্ট ক্ষেত্রে, ওয়েব সার্ভারে 1012Mb অদলবদল স্থান সহ 512Mb র‌্যাম রয়েছে। এটি বেশিরভাগ সময়ের পক্ষে যথেষ্ট বলে মনে হয়।

উত্তর:


32

overcommit_ratio80 এ সেট করা সম্ভবত সঠিক ক্রিয়া নয়। 100 এরও কম কিছুতে মান সেট করা প্রায় সর্বদা ভুল is

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

সুতরাং মূলত ১০০-তে ওভার কমিটের সাহায্যে কার্নেল অ্যাপ্লিকেশনগুলিকে আপনার (মেটাল + র্যাম) এর চেয়ে বেশি মেমরি বরাদ্দ করতে দেয় না। এটিকে 100 এরও কম সেট করার অর্থ আপনি কখনই আপনার সমস্ত স্মৃতি ব্যবহার করবেন না। আপনি যদি এই সেটিংটি সেট করতে চলেছেন, পূর্বে উল্লিখিত দৃশ্যের কারণে আপনার এটিকে 100 এর চেয়ে বেশি সেট করা উচিত, যা বেশ সাধারণ।

এখন, ওওএম কিলার ট্রিগার সহ আপনার সমস্যা হিসাবে ম্যানুয়ালি ওভারকমিট সেট করা সম্ভবত এটি ঠিক করবে না। ডিফল্ট সেটিং (তাত্পর্যপূর্ণ সংকল্প) মোটামুটি বুদ্ধিমান।

যদি আপনি এই সত্যিই ইস্যু কারণ দেখতে চান, তাকান /proc/meminfoযখন হলে OOM kills হত্যাকারী রান। আপনি যদি দেখেন তাহলে Committed_ASপাসে হবে CommitLimitকিন্তু freeএখনও বিনামূল্যে মেমরি উপলব্ধ দেখানো হয়, তাহলে হ্যাঁ আপনি নিজে আপনার দৃশ্যকল্প জন্য overcommit নিয়ন্ত্রন করতে পারেন। এই মানটি খুব কম সেট করা আপনার যখন প্রচুর পরিমাণে মেমরি মুক্ত রাখে তখন ওওএম কিলার অ্যাপ্লিকেশনগুলি হত্যা শুরু করে। এটিকে অত্যধিক সেট করা এলোমেলোভাবে প্রয়োগ করা মেমরি ব্যবহার করার চেষ্টা করার সময় এলোমেলো অ্যাপ্লিকেশন মারা যেতে পারে তবে বাস্তবে তা পাওয়া যায় না (যখন সমস্ত স্মৃতি আসলে ব্যবহার হয় না)।


1
ধন্যবাদ - আমি কী ঘটছে তা দেখার জন্য ওভার কমিট_রেটিওকে 100 এ সেট করে জিনিস চেষ্টা করছি। আমার কাছে প্রধান সমস্যাটি হ'ল যখন ওম-কিলার এটি শুরু করে তখন এটি সার্ভারে অ্যাক্সেস করতে এবং যা চলছে তা দেখে আমাকে অবিচ্ছিন্নভাবে sshd হত্যা করে। আমি অনুমান করি যে আমার যা প্রয়োজন তা হ'ল ওম-কিলারকে দৌড়ানো থেকে বিরত রাখা এবং রেকর্ডিংয়ের কিছু উপায় যা ঘটেছিল তখন কী ঘটেছিল তাই আমি সমস্যার কারণটি খুঁজে পেতে পারি।
dunxd

4
@ ডানক্সডি আপনি /proc/<PID>/oom_score_adjএই উদ্দেশ্যে ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি যদি sshd এর জন্য oom_score_adj -1000 সেট করে থাকেন তবে ওম কিলার যখন কিছু মারতে চায় তখন কখনই sshd টার্গেট করবে না। ওম কিলারটি পুরোপুরি থামানো একটি ভাল ধারণা নয় কারণ আপনার প্রোগ্রামগুলি মেমরিটিকে ম্যালোক করতে সক্ষম হবে না এবং তারা যেভাবেই মারা যাবে।
প্যাট্রিক

4
@ ডানক্সড এর উত্তরাধিকারসূত্রে প্রাপ্ত। আপনার আরআইপি স্ক্রিপ্টটি এটি নিজেই সেট করুন এবং আরআর স্ক্রিপ্ট দ্বারা শুরু করা যে কোনও কিছুই এর উত্তরাধিকার সূত্রে প্রাপ্ত।
প্যাট্রিক

4
আপনার 4 কেবি উদাহরণ ভুল। ভার্চুয়াল মেমরি পৃষ্ঠাগুলির সাথে ব্যবহৃত হয় এবং লিনাক্সের অধীনে কোনও পৃষ্ঠার (সবচেয়ে ছোট) আকার 4 কেবি হয়। তারমানে অতিরিক্ত অক্ষর সেটিংস নির্বিশেষে কয়েকটি অক্ষর সংরক্ষণের জন্য 4 কেবি কোথাও ম্যাপ করা দরকার। প্রতিশ্রুতি ওভার মেমরির একটি যথাযথ উদাহরণ উদাহরণস্বরূপ আপনি 10 কেবি বরাদ্দ করেন এবং কেবল প্রথম 4100 বাইট ব্যবহার করেন। তার মানে দুটি 4 কেবি পৃষ্ঠার ডেটা সঞ্চয় করতে হবে এবং একটি অতিরিক্ত পৃষ্ঠা অব্যবহৃত। অতিরিক্ত কমমিটিং সিস্টেমগুলিতে সর্বদা ডেটা সংরক্ষণের জন্য তৃতীয় পৃষ্ঠাগুলি প্রস্তুত থাকে যখন চাহিদা পৌঁছে যায়, ওভার কমিটিং সিস্টেমগুলি এটি কার্যকর করে না।
jlliagre

2
/ proc / বর্তমান প্রক্রিয়াটির দিকে স্বাক্ষর করে, সুতরাং / ক্রোক / স্ব / ওম_স্কোর_এডজে বর্তমান প্রক্রিয়ার ওম_স্কোর_এডজে পরিবর্তন করতে ব্যবহৃত হতে পারে।
r_2

23

@ ডানক্সড ডক্টারে যে ডকটিতে উল্লিখিত হয়েছে যে বিভাগ 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

এবং আপনি কি vm.overcommit_memory 2 তে রাখার পরামর্শ দিচ্ছেন?
ইউটি এক্সডি

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