আমি কীভাবে এমন প্রক্রিয়াটি দ্রুত বন্ধ করব যা মজাদার চাপ বাড়িয়ে তুলছে (অতিরিক্ত মেমরি বরাদ্দের কারণে)?


19

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

একটি মাতলাব স্ক্রিপ্ট একটি হাস্যকরভাবে বিশাল ম্যাট্রিক্স বরাদ্দের চেষ্টা করার কারণে আমি সম্প্রতি আমার উবুন্টু ল্যাপটপে এটির অভিজ্ঞতা পেয়েছি। ~ 5 + মিনিট ছোটাছুটি করার পরে, আমি কনসোলটিতে Ctrl-F1 করতে পেরেছিলাম এবং মতলবকে হত্যা করতে সক্ষম হয়েছি। আমার কাছে বরং কিছু হট-চাবি ছিল যা আমাকে তাত্ক্ষণিকভাবে সিস্টেমের নিয়ন্ত্রণ দিত এবং আমাকে আপত্তিকর প্রক্রিয়াটি মেরে ফেলতে দিত; অথবা, সম্ভবত, নিঃশব্দে এত বড় বাফার বরাদ্দ করতে অস্বীকার করুন।

  1. অতিরিক্ত অদলবদলের কারণে এমন কোনও লিনাক্স সিস্টেমের নিয়ন্ত্রণ ফিরে পাওয়ার দ্রুততম উপায় কী যা প্রতিক্রিয়াশীল বা অত্যন্ত আলস্য হয়ে উঠেছে?

  2. এই ধরণের অদলবদলকে প্রথমে ঘটে যাওয়া রোধ করার কোনও কার্যকর উপায় আছে, উদাহরণস্বরূপ, কোনও প্রক্রিয়া বরাদ্দ করার চেষ্টা করার জন্য মেমরির পরিমাণ সীমিত করে?

উত্তর:


12

সর্বাধিক স্মৃতি ব্যবহার করে প্রক্রিয়াটি শেষ করতে Alt-SysRq-F টিপুন :

  • সিসআরকি কীটি সাধারণত মুদ্রণ কীতে ম্যাপ করা হয়।
  • আপনি যদি একটি গ্রাফিকাল ডেস্কটপ ব্যবহার করছেন তবে আপনাকে Alt-SysRq চাপার ক্ষেত্রে Ctrl-Alt-SysRq-F টি চাপতে হতে পারে অন্য কোনও ক্রিয়াকলাপ (যেমন স্ন্যাপশট প্রোগ্রাম) টিপবে
  • আপনি যদি কোনও ল্যাপটপ ব্যবহার করছেন তবে আপনার একটি ফাংশন কী টিপতে হবে।
  • আরও তথ্যের জন্য উইকিপিডিয়া নিবন্ধ পড়ুন

5

আমি এই উদ্দেশ্যে একটি স্ক্রিপ্ট তৈরি করেছি - https://github.com/tobixen/thrash-protect

আমি এই স্ক্রিপ্টটি ভাল সাফল্যের সাথে প্রডাকশন সার্ভার, ওয়ার্কস্টেশন এবং ল্যাপটপে চালিয়েছি। এই স্ক্রিপ্টটি প্রক্রিয়াগুলিকে হত্যা করে না, তবে এগুলি অস্থায়ীভাবে স্থগিত করে - পরে আমার বেশ কয়েকটি পরিস্থিতি হয়েছিল যেখানে আমি নিশ্চিত যে আমি যদি এই সাধারণ স্ক্রিপ্টটির জন্য না থাকি তবে ছিটকে যাওয়ার কারণে নিয়ন্ত্রণ হারিয়ে ফেলতাম। "সবচেয়ে খারাপ" ক্ষেত্রে আপত্তিকর প্রক্রিয়াটি অনেক ধীর হয়ে যাবে এবং শেষ পর্যন্ত কার্নেল (ওওএম) দ্বারা হত্যা করা হবে, "সেরা" ক্ষেত্রে আপত্তিজনক প্রক্রিয়াটি আসলে সম্পূর্ণ হবে ... যে কোনও ক্ষেত্রে সার্ভার বা ওয়ার্কস্টেশন তুলনামূলকভাবে প্রতিক্রিয়াশীল থাকবে যাতে পরিস্থিতি তদন্ত করা সহজ।

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


Swix অক্ষম করার বিষয়ে, unix.stackexchange.com/a/24646/9108 অনুসারে এটি সর্বোত্তম বিকল্প নাও হতে পারে।
সাশোলাম

প্রকৃতপক্ষে, কেউ আমার সম্পর্কে একই মন্তব্য করেছে, তাই আমি সেই মুহুর্তে থ্রেশ-সুরক্ষা ডকটি সংশোধন করেছি।
tobixen

4
  1. অতিরিক্ত অদলবদলের কারণে এমন কোনও লিনাক্স সিস্টেমের নিয়ন্ত্রণ ফিরে পাওয়ার দ্রুততম উপায় কী যা প্রতিক্রিয়াশীল বা অত্যন্ত আলস্য হয়ে উঠেছে?

ইতিমধ্যে Alt-SysRq-F দিয়ে উপরে উত্তর দেওয়া হয়েছে

  1. এই ধরণের অদলবদলকে প্রথমে ঘটে যাওয়া রোধ করার কোনও কার্যকর উপায় আছে, উদাহরণস্বরূপ, কোনও প্রক্রিয়া বরাদ্দ করার চেষ্টা করার জন্য মেমরির পরিমাণ সীমিত করে?

আমি এই দ্বিতীয় অংশের উত্তর দিচ্ছি। হ্যাঁ, 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 পাওয়ার) বৃদ্ধি দ্রষ্টব্য।

ভবিষ্যতে, এসএসএইচ এবং গ্রাফিকাল স্ট্যাকের মতো গুরুত্বপূর্ণ জিনিসের জন্য "ডিস্ট্রো / বিক্রেতাদের" সি-গ্রুপ কনফিগারেশন প্রি-কনফিগার করা অগ্রাধিকার এবং সীমাগুলি (সিস্টেমড ইউনিটগুলির মাধ্যমে) দেখার আশা করি, যাতে তারা কখনও স্মৃতিশক্তি না খেয়ে থাকে।


2

আপনি প্রোগ্রামটি স্থগিত করতে Ctrl- টিপতে সক্ষম হতে পারেন z। তারপরে আপনি kill %1(বা কাজের নম্বর যাই হোক না কেন বা পিআইডি ব্যবহার করতে পারেন) করতে পারেন।

ulimitকোনও প্রক্রিয়াতে উপলব্ধ মেমরির পরিমাণ সীমাবদ্ধ করার চেষ্টা করতে আপনি কমান্ডটি ব্যবহার করতে পারেন ।


Ctrl-Z দুর্দান্ত, তবে সাধারণত আমি একটি মতলব জিইআই চালাচ্ছি এবং নিয়ন্ত্রণকারী টার্মিনালের ট্র্যাকটি হারিয়ে ফেলেছি, সুতরাং Ctrl-Z কী কী চাপ দিতে পারে তার কোনও সহজ উপায় নেই। জিইউআইয়ের কাছে হ'ল অ্যাপ্লিকেশনটির যা কিছু ফোকাস রয়েছে তাতে সাইনস্টপ প্রেরণের জন্য একটি গরম কী থাকলে ভাল লাগবে!
নিবোট

আপনি চালাতে পারেন kill -STOP <pid>যা Ctrl-Z হিসাবে একই কাজ করবে।
hlovdal

হ্যাঁ, তবে পুরো সমস্যাটি হ'ল, এমন পরিস্থিতিতে সিস্টেমটি এতটা প্রতিক্রিয়াশীল যে কমান্ড প্রম্পটে যেতে দীর্ঘ সময় (বা চিরকালের) লাগে।
নিবোট

1

আপনি রিসোর্সের ব্যবহার সীমাবদ্ধ করতে এবং এই জাতীয় সমস্যাগুলি রোধ করতে সিগ্রুপগুলি ব্যবহার করতে পারেন: https://en.wikedia.org/wiki/Cgroups


দয়া করে আপনার উত্তরে প্রয়োজনীয় তথ্য অন্তর্ভুক্ত করুন এবং লিঙ্কটি কেবলমাত্র বিশিষ্টতা এবং আরও পড়ার জন্য ব্যবহার করুন। সেই লিঙ্কটি সিগ্রুপগুলি কী তা বর্ণনা করে তবে সমস্যাটি সমাধানের জন্য কীভাবে এটি ব্যবহার করা যায় তা লিঙ্ক থেকে স্পষ্ট নয়। আপনি প্রশ্নের উত্তর বর্ণনা করতে আপনার উত্তর প্রসারিত করতে পারেন? ধন্যবাদ।
ফিক্সার 1234

0

জিইউআইয়ের কাছে হ'ল অ্যাপ্লিকেশনটির যা কিছু ফোকাস রয়েছে তাতে সাইনস্টপ প্রেরণের জন্য একটি গরম কী থাকলে ভাল লাগবে!

সর্বদা ক্লাসিকাল xkillকমান্ড থাকে (আমার সিস্টেমে xorg-x11-apps-7.4-14.fc14.src.rpm থেকে)। আমি অনুমান করি যে লক্ষ্যযুক্ত উইন্ডোটি হত্যার পরিবর্তে সাইনস্টপ পাঠায় এমন একটি ক্লোন তৈরি করা খুব বেশি কঠিন হওয়া উচিত নয়।


কী কী সংমিশ্রণের প্রেসে আমি এক্সকিলকে দ্রুত শুরু করতে পারি?
নিবোট

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