- অতিরিক্ত অদলবদলের কারণে এমন কোনও লিনাক্স সিস্টেমের নিয়ন্ত্রণ ফিরে পাওয়ার দ্রুততম উপায় কী যা প্রতিক্রিয়াশীল বা অত্যন্ত আলস্য হয়ে উঠেছে?
ইতিমধ্যে Alt-SysRq-F দিয়ে উপরে উত্তর দেওয়া হয়েছে
- এই ধরণের অদলবদলকে প্রথমে ঘটে যাওয়া রোধ করার কোনও কার্যকর উপায় আছে, উদাহরণস্বরূপ, কোনও প্রক্রিয়া বরাদ্দ করার চেষ্টা করার জন্য মেমরির পরিমাণ সীমিত করে?
আমি এই দ্বিতীয় অংশের উত্তর দিচ্ছি। হ্যাঁ, ulimit
একটি একক প্রক্রিয়া সীমাবদ্ধ করার জন্য এখনও যথেষ্ট ভাল কাজ করে। আপনি পারেন:
- আপনি জানেন এমন কোনও প্রক্রিয়াটির জন্য একটি নরম সীমা নির্ধারণ করুন সম্ভবত নিয়ন্ত্রণের বাইরে চলে যাবে
- আপনি অতিরিক্ত বীমা চাইলে সমস্ত প্রক্রিয়ার জন্য একটি কঠিন সীমা নির্ধারণ করুন
সংক্ষেপে যেমন উল্লেখ করা হয়েছে:
রিসোর্সের ব্যবহার সীমাবদ্ধ করতে এবং এই জাতীয় সমস্যা রোধ করতে আপনি সিগ্রুপগুলি ব্যবহার করতে পারেন
আসলে, সিগ্রুপগুলি আরও উন্নত নিয়ন্ত্রণ সরবরাহ করে, তবে বর্তমানে আমার মতে কনফিগার করতে আরও জটিল more
পুরাতন স্কুল উলিমিত
একবার বন্ধ
এখানে একটি সহজ উদাহরণ:
$ bash
$ ulimit -S -v $((1*2**20))
$ r2(){r2 $@$@;};r2 r2
bash: xmalloc: .././subst.c:3550: cannot allocate 134217729 bytes (946343936 bytes allocated)
এটা তোলে:
- 1 জিবি সামগ্রিক মেমরি ব্যবহারের একটি নরম সীমা সেট করে (কেবি ইউনিটে সীমাবদ্ধতা সীমাবদ্ধ করে)
- একটি পুনরাবৃত্ত বাশ ফাংশন কল চালায়
r2(){ r2 $@$@;};r2 r2
যা স্ট্যাক মেমরির অনুরোধ করার সময় নিজেকে দ্বিগুণ করে সিপিইউ এবং র্যামকে দ্রুততরভাবে চিবিয়ে তুলবে।
আপনি দেখতে পাচ্ছেন, 1 জিবি-র বেশির জন্য অনুরোধ করার চেষ্টা করার সময় এটি বন্ধ হয়ে যায়।
দ্রষ্টব্য, -v
ভার্চুয়াল মেমরি বরাদ্দ (মোট, অর্থাত্ শারীরিক + সোয়াপ) পরিচালনা করে।
স্থায়ী সুরক্ষা
ভার্চুয়াল মেমরি বরাদ্দ সীমিত করতে, as
এর সমতূল্য -v
জন্য limits.conf
।
কোনও একক খারাপ আচরণ থেকে রক্ষা পেতে আমি নিম্নলিখিতটি করি:
- সমস্ত প্রক্রিয়া জন্য একটি হার্ড ঠিকানা স্থান সীমা সেট করুন।
address space limit = <physical memory> - 256MB
।
- অতএব, লোভী মেমরির ব্যবহার বা একটি সক্রিয় লুপ এবং মেমরি ফাঁস সহ কোনও একক প্রক্রিয়া সমস্ত শারীরিক স্মৃতি গ্রহণ করতে পারে না।
- 256 এমবি হেডরুমটি এসএসএস বা কনসোল সহ প্রয়োজনীয় প্রক্রিয়াকরণের জন্য রয়েছে।
এক রৈখিক:
$ sudo bash -c "echo -e \"*\thard\tas\t$(($(grep -E 'MemTotal' /proc/meminfo | grep -oP '(?<=\s)\d+(?=\skB$)') - 256*2**10))\" > /etc/security/limits.d/mem.conf"
বৈধকরণের জন্য, এর ফলাফল নিম্নলিখিত (যেমন 16 গিগাবাইট সিস্টেমে):
$ cat /etc/security/limits.d/mem.conf
* hard as 16135196
$ ulimit -H -v
161351960
মন্তব্য:
- মেমরির ব্যবহারের সাথে ওভারবোর্ডে যাওয়া একক প্রক্রিয়াটির বিরুদ্ধে কেবল প্রশমিত করে।
- ভারী মেমরির চাপ সহ একটি মাল্টি-প্রসেস ওয়ার্কলোডকে আটকাবে না যার ফলে থ্রেশিং হয় (সিগ্রুপগুলি এর পরে উত্তর হয়)।
rss
সীমাবদ্ধতা বিকল্প ব্যবহার করবেন না । এটি নতুন কার্নেল দ্বারা সম্মানিত নয়।
- এটা রক্ষণশীল।
- তত্ত্ব অনুসারে, একটি প্রক্রিয়া অনুমানমূলকভাবে প্রচুর মেমরির জন্য অনুরোধ করতে পারে তবে কেবল সক্রিয়ভাবে একটি উপসেট ব্যবহার করে (ছোট কার্যনির্বাহী সেট / বাসিন্দার স্মৃতি ব্যবহার)।
- উপরের হার্ড সীমাটি এই জাতীয় প্রক্রিয়াগুলি বাতিল করতে বাধ্য করবে (এমনকি যদি তারা অন্যথায় সূক্ষ্মভাবে লিনাক্স চালাতে পারে তবে ভার্চুয়াল মেমরি অ্যাড্রেস স্পেসকে অতিরিক্ত অনুমতি দেওয়া হতে পারে)।
আরও নতুন সিগ্রুপস
আরও নিয়ন্ত্রণ সরবরাহ করে তবে বর্তমানে ব্যবহার করা আরও জটিল:
- উলামিট অফারে উন্নতি করে।
memory.max_usage_in_bytes
অ্যাকাউন্ট এবং পৃথকভাবে শারীরিক স্মৃতি সীমাবদ্ধ করতে পারেন।
- যেখানে
ulimit -m
এবং / অথবা rss
ইন limits.conf
একইরকম কার্যকারিতা সরবরাহ করার জন্য বোঝানো হয়েছিল, তবে কার্নেল লিনাক্স ২.৪.৩০ থেকে এটি কার্যকর হয় না!
- প্রয়োজনের বুট-লোডার মধ্যে কিছু কার্নেল নির্ধারিত সঠিক cgroup- পতাকা সক্ষম করতে:
cgroup_enable=memory swapaccount=1
।
- উবুন্টু 16.04 এর সাথে এটি ডিফল্টরূপে ঘটেনি।
- সম্ভবত অতিরিক্ত অ্যাকাউন্টিং ওভারহেডের কিছু কার্য সম্পাদনের কারণে lic
- সিগ্রুপ / সিস্টেমযুক্ত স্টাফগুলি তুলনামূলকভাবে নতুন এবং একটি মোটামুটি বিট পরিবর্তন করা যায়, সুতরাং ফ্লাক্স আপস্ট্রিমটি বোঝায় লিনাক্স ডিস্ট্রো বিক্রেতারা এখনও এটি ব্যবহার করা সহজ করেনি। 14.04LTS এবং 16.04LTS এর মধ্যে, সিগ্রুপগুলি ব্যবহার করতে ব্যবহারকারীর স্পেস টুলিং পরিবর্তন হয়েছে changed
cgm
এখন আনুষ্ঠানিকভাবে সমর্থিত ইউজারস্পেস সরঞ্জাম বলে মনে হচ্ছে।
- সিস্টেমড ইউনিট ফাইলগুলিতে এসএসএসের মতো গুরুত্বপূর্ণ পরিষেবাদির অগ্রাধিকার পাওয়ার জন্য কোনও পূর্বনির্ধারিত "বিক্রেতা / ডিস্ট্রো" ডিফল্ট নেই বলে মনে হয়।
যেমন বর্তমান সেটিংস পরীক্ষা করতে:
$ echo $(($(cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes) / 2**20)) MB
11389 MB
$ cat /sys/fs/cgroup/memory/memory.stat
...
যেমন একটি একক প্রক্রিয়ার স্মৃতি সীমিত করতে:
$ cgm create memory mem_1G
$ cgm setvalue memory mem_1G memory.limit_in_bytes $((1*2**30))
$ cgm setvalue memory mem_1G memory.memsw.limit_in_bytes $((1*2**30))
$ bash
$ cgm movepid memory mem_1G $$
$ r2(){ r2 $@$@;};r2 r2
Killed
এটিকে র্যামকে একটি পটভূমি প্রক্রিয়া হিসাবে চিবানো এবং তারপরে মারা যাওয়ার ক্রিয়াতে দেখতে:
$ bash -c 'cgm movepid memory mem_1G $$; r2(){ r2 $@$@;};r2 r2' & while [ -e /proc/$! ]; do ps -p $! -o pcpu,pmem,rss h; sleep 1; done
[1] 3201
0.0 0.0 2876
102 0.2 44056
103 0.5 85024
103 1.0 166944
...
98.9 5.6 920552
99.1 4.3 718196
[1]+ Killed bash -c 'cgm movepid memory mem_1G $$; r2(){ r2 $@$@;};r2 r2'
মেমোরি অনুরোধে সূচকীয় (2 পাওয়ার) বৃদ্ধি দ্রষ্টব্য।
ভবিষ্যতে, এসএসএইচ এবং গ্রাফিকাল স্ট্যাকের মতো গুরুত্বপূর্ণ জিনিসের জন্য "ডিস্ট্রো / বিক্রেতাদের" সি-গ্রুপ কনফিগারেশন প্রি-কনফিগার করা অগ্রাধিকার এবং সীমাগুলি (সিস্টেমড ইউনিটগুলির মাধ্যমে) দেখার আশা করি, যাতে তারা কখনও স্মৃতিশক্তি না খেয়ে থাকে।