একক সিপিইউতে হোয়াইটলিস্ট ব্যতীত সমস্ত প্রক্রিয়া সীমাবদ্ধ করতে কীভাবে সিগ্রুপগুলি ব্যবহার করবেন?


26

রেড হ্যাট থেকে সিগ্রুপের জন্য একটি গাইড রয়েছে যা সম্ভবত এক ধরণের সহায়ক (তবে এই প্রশ্নের উত্তর দেয় না)।

আমি জানি যে কীভাবে একটি নির্দিষ্ট প্রক্রিয়া একটি নির্দিষ্ট সিপিইউতে সীমাবদ্ধ করতে হয়, সেই প্রক্রিয়াটি শুরু করার কমান্ড চলাকালীন:

প্রথমে নিম্নলিখিতটি * প্রবেশ করান /etc/cgconfig.conf:

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

এবং তারপরে একটি প্রক্রিয়া শুরু করুন এবং এটি ব্যবহার করে এটি নির্দিষ্টভাবে সেই সিগ্রুপকে নির্দিষ্ট করুন:

cgexec -g cpuset:cpu0only myprocessname

আমি নির্দিষ্ট প্রক্রিয়া নামের সমস্ত দৃষ্টান্ত স্বয়ংক্রিয়ভাবে সীমাবদ্ধ করতে পারি (আমার মনে হয় এটিকে সঠিক) নীচে রেখে /etc/cgrules.conf:

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

আমার প্রশ্ন: আমি কীভাবে বিপরীতটি করতে পারি ?

অন্য কথায়, শ্বেত তালিকাভুক্ত প্রক্রিয়াগুলির একটি নির্দিষ্ট সেট এবং তাদের বাচ্চাদের একটি সীমাবদ্ধ সিগ্রুপে বাদে আমি কীভাবে সমস্ত প্রক্রিয়া বরাদ্দ করতে পারি ?


আমি যা অধ্যয়ন করেছি তার ভিত্তিতে, কিন্তু পরীক্ষা করেছি না, আমি বিশ্বাস করি যে একটি আংশিক সমাধান হবে:

একটি "বাধাবদ্ধ" সিগ্রুপ যুক্ত করুন:

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

আমার প্রক্রিয়াটি স্পষ্টভাবে বাধা না দেওয়া গোষ্ঠীতে এবং সমস্ত কিছু সীমাবদ্ধ গোষ্ঠীতে অর্পণ করুন:

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

যাইহোক, এ সম্পর্কে সতর্কতা মনে হয় (ডকগুলি পড়া থেকে, পরীক্ষার ফলে নয়, তাই লবণের দানা) যে বাচ্চাদের myprocessnameসীমাবদ্ধ cpu0onlyক্রগোষ্ঠে পুনর্নির্দিষ্ট করা হবে ।

একটি সম্ভাব্য বিকল্প পদ্ধতি হ'ল চালানোর জন্য কোনও ব্যবহারকারী তৈরি করা myprocessnameএবং সেই ব্যবহারকারীর সমস্ত প্রক্রিয়া সীমিত না হওয়া এবং অন্য সব কিছু সীমাবদ্ধ। তবে, আমার আসল ব্যবহারের ক্ষেত্রে, প্রক্রিয়াটি রুট দ্বারা চালানো দরকার, এবং অন্যান্য প্রক্রিয়াগুলিও রুট দ্বারা চালিত হতে হবে যা সীমাবদ্ধ করা উচিত

আমি কীভাবে সিগ্রুপের সাহায্যে এটি সম্পাদন করতে পারি?


যদি সিজিগ্রুপগুলির মাধ্যমে এটি সম্ভব না হয় (যা আমি এখন সন্দেহ করি তবে এটি) আমার আংশিক সমাধানের ধারণাগুলি কি সঠিক এবং তারা কি আমার চিন্তাভাবনা অনুসারে কাজ করবে?

* অস্বীকৃতি: এটি সম্ভবত কোনও ন্যূনতম কোড উদাহরণ নয়; আমি সমস্ত অংশগুলি বুঝতে পারি না তাই কোনটি প্রয়োজনীয় নয় তা আমি জানি না।

উত্তর:


30

আপডেট: নোট করুন যে নীচের উত্তরটি RHEL 6 এর ক্ষেত্রে প্রযোজ্য R


এই প্রশ্নটি পোস্ট করার পর থেকে আমি উপরে উল্লিখিত পুরো গাইডটি, পাশাপাশি সিংহভাগ cgroups.txt ডকুমেন্টেশন এবং cpusets.txt অধ্যয়ন করেছি । আমি এখন সিগ্রুপ সম্পর্কে শিখার চেয়ে বেশি জানলাম, তাই আমি এখানে আমার নিজের প্রশ্নের উত্তর দেব।

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

অতিরিক্তভাবে, আমি কিছু সিগ্রুপ বেসিক ডেটা উল্লেখ করতে চাই যা আমি আমার প্রশ্ন পোস্ট করার সময় অনুপস্থিত ছিল।


সিগ্রুপগুলি ইনস্টল হওয়ার উপর নির্ভর করে নাlibcgroup তবে, সিগ্রুপের কনফিগারেশন এবং প্রক্রিয়া অ্যাসাইনমেন্টগুলি স্বয়ংক্রিয়ভাবে হ্যান্ডলিংয়ের জন্য এটি সরঞ্জামগুলির একটি সেট এবং এটি খুব সহায়ক হতে পারে।

আমি দেখতে পেয়েছি যে libcgroup সরঞ্জামগুলিও বিভ্রান্তিমূলক হতে পারে, কারণ libcgrou প্যাকেজটি আপনার নিজস্ব cgroups ব্যবহার সম্পর্কে বিমূর্ততা এবং অনুমানের উপর সেট করা হয়েছে, যা cgroups এর প্রকৃত কার্নেল স্তর প্রয়োগের চেয়ে কিছুটা আলাদা। (আমি উদাহরণ স্থাপন করতে পারি তবে এতে কিছুটা সময় লাগবে; আপনার আগ্রহ থাকলে মন্তব্য করুন))

অতএব, libcgroup সরঞ্জাম ব্যবহার করার আগে (যেমন /etc/cgconfig.conf, /etc/cgrules.conf, cgexec, cgcreate, cgclassify, ইত্যাদি) আমি অত্যন্ত সঙ্গে খুব পরিচিত পেয়ে সুপারিশ /cgroupভার্চুয়াল ফাইল সিস্টেম নিজে এবং ম্যানুয়ালি Cgroups, নির্ধারিত সঠিক cgroup- শ্রেণীবিন্যাসের (সংযুক্ত একাধিক সাব সঙ্গে শ্রেণীবিন্যাসের সহ, যা sneakily libcgroup এবং leakily বিমূর্ত তৈরি দূরে), চালনা করে বিভিন্ন সিগ্রুপগুলিতে প্রক্রিয়াগুলি পুনরায় অর্পণ এবং হুডের অধীনে সম্পাদিত echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasksঅন্যান্য আপাতদৃষ্টিতে যাদুকরী কাজগুলি libcgroup


আরেকটি মৌলিক ধারণা আমি অনুপস্থিত ছিল যে যদি /cgroupভার্চুয়াল ফাইল সিস্টেম এ সব আপনার সিস্টেমে মাউন্ট করা (বা আরো সঠিকভাবে, যদি নির্ধারিত সঠিক cgroup- সাব ওরফে "কন্ট্রোলার" এ সব মাউন্ট করা হয় কোন), তারপর যে আপনার সমগ্র সিস্টেমে প্রক্রিয়া হয় একটি নির্ধারিত সঠিক cgroup-। "কিছু প্রক্রিয়া একটি গ্রুপে রয়েছে এবং কিছুতে নেই" এর মতো কোনও জিনিস নেই।

প্রদত্ত শ্রেণিবিন্যাসের জন্য মূল সিগ্রুপ বলা হয় , যা সংযুক্ত সাবসিস্টেমগুলির জন্য সমস্ত সিস্টেমের সংস্থার মালিকানাধীন । উদাহরণস্বরূপ একটি নির্ধারিত সঠিক cgroup- অনুক্রমের cpuset এবং blkio সাব সংযুক্ত করেছেন যে, একজন রুট নির্ধারিত সঠিক cgroup- মালিক হবে হবে সব সিস্টেমে CPU ও সিস্টেমের সব blkio এবং যাদের সম্পদের কিছু শেয়ার করতে পারে শিশু Cgroups। আপনি রুট সিগ্রুপকে সীমাবদ্ধ করতে পারবেন না কারণ এটি আপনার সিস্টেমের সমস্ত সংস্থার মালিকানাধীন , তাই এটি সীমাবদ্ধ করা এমনকি অর্থবোধ করে না।


লাইবগ্রুপ সম্পর্কে আমি অনুপস্থিত কিছু অন্যান্য সাধারণ ডেটা:

আপনি যদি ব্যবহার করেন তবে /etc/cgconfig.confআপনার অবশ্যই এটি নিশ্চিত করা উচিত chkconfig --list cgconfigযে cgconfigএটি সিস্টেম বুটে চালিত হবে।

আপনি যদি পরিবর্তন করেন তবে পরিবর্তনগুলি লোড করার জন্য /etc/cgconfig.confআপনাকে চালনা service cgconfig restartকরতে হবে। (এবং পরিষেবাটি বন্ধ করা বা চালানো সমস্যাগুলি cgclearপরীক্ষার আশেপাশে বোকা বানাতে খুব সাধারণ বিষয় ug ডিবাগিংয়ের জন্য আমি সুপারিশ করি, উদাহরণস্বরূপ lsof /cgroup/cpuset, যদি cpusetআপনি যে সিগ্রুপ হায়ারার্কির নাম ব্যবহার করছেন))

আপনি যদি ব্যবহার করতে চান তবে আপনাকে /etc/cgrules.conf"সিগ্রুপ বিধি ইঞ্জিন ডেমন" ( cgrulesengd) চলছে কিনা তা নিশ্চিত করতে হবে : service cgred startএবং chkconfig cgred on। (এবং পৃষ্ঠার নীচের অংশে ২.৮.১ বিভাগে রেড হ্যাট রিসোর্স ম্যানেজমেন্ট গাইডে বর্ণিত, এই পরিষেবাদি সম্পর্কিত আপনার সম্ভাব্য তবে সম্ভাবনাময় বর্ণের অবস্থা সম্পর্কে সচেতন হওয়া উচিত ।)

আপনি যদি নিজেই বোকা বানাতে চান এবং ভার্চুয়াল ফাইল সিস্টেম (যা আমি প্রথম ব্যবহারের জন্য প্রস্তাব দিই) ব্যবহার করে আপনার সিগ্রুপ সেট আপ করতে চাইলে আপনি এটি করতে পারেন এবং তারপরে বিভিন্ন বিকল্পের cgconfig.confসাহায্যে আপনার সেটআপটি আয়না করার জন্য একটি ফাইল তৈরি করতে পারেন cgsnapshot


এবং অবশেষে, আমি নিম্নলিখিতটি লিখতে গিয়ে তথ্যটির মূল অংশটি অনুপস্থিত ছিল:

যাইহোক, এই বিষয়ে সতর্কতাই বলে মনে হচ্ছে ... যে মাইপ্রোসেসনামের বাচ্চাদের সীমাবদ্ধ cpu0only সিগ্রুপে পুনরায় নিয়োগ দেওয়া হবে।

আমি সঠিক ছিলাম, তবে এমন একটি বিকল্প আছে যা সম্পর্কে আমি অজানা ছিলাম।

cgexec একটি প্রক্রিয়া শুরু করার / কমান্ড চালানোর এবং এটি একটি সিগ্রুপকে নির্ধারণ করার জন্য আদেশ command

cgclassify ইতিমধ্যে চলমান প্রক্রিয়াটি একটি সিগ্রুপকে নির্ধারণের জন্য আদেশ।

এই দুটি এছাড়াও প্রতিরোধ করবে cgred( cgrulesengdএকটি ভিন্ন উপর ভিত্তি করে নির্ধারিত সঠিক cgroup- নির্দিষ্ট প্রক্রিয়া পুনরায় নির্ধারণের থেকে) /etc/cgrules.conf

উভয়ই cgexecএবং পতাকা cgclassifyসমর্থন করে --sticky, যা অতিরিক্ত ভিত্তিতে শিশু প্রক্রিয়াগুলি cgredপুনরায় নিয়োগ করা থেকে বাধা দেয় ।/etc/cgrules.conf


সুতরাং, আমি যেমন এটি লিখেছি প্রশ্নের উত্তর (যদিও উপরে বর্ণিত রেড হ্যাট টেকনিক্যাল আর্কিটেক্টের পরামর্শের কারণে আমি প্রয়োগটি শেষ করেছিলাম তা সেটআপ না হলেও) হ'ল:

আমার প্রশ্নে বর্ণিত হিসাবে cpu0onlyএবং anycpuসিগ্রুপ তৈরি করুন । ( cgconfigবুট চলাকালীন নিশ্চিত করা হয়েছে))

* cpuset cpu0onlyআমার প্রশ্নে বর্ণিত নিয়মটি তৈরি করুন । (এবং নিশ্চিত cgredহ'ল বুট চালানো হবে))

কোনো প্রসেস আমি চাই শুরু অবাধ সঙ্গে cgexec -g cpuset:anycpu --sticky myprocessname

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


কি দারুন. শীতল। এটি কিভাবে 0 ভোট ছিল?
মাইক্রজারভ

@ মাইকজার, ধন্যবাদ। :) আপনার প্রশ্নের উত্তর: তারিখগুলি পরীক্ষা করুন; আমি এই উত্তরটি গতকালই লিখেছি।
ওয়াইল্ডকার্ড

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