সিপিইউ ব্যবহারের 10% এর বেশি না হওয়ার প্রক্রিয়া সীমাবদ্ধ করা


32

আমি একটি লিনাক্স সিস্টেম পরিচালনা করি যার প্রচুর ব্যবহারকারী থাকে তবে কখনও কখনও অপব্যবহার ঘটে; যেখানে কোনও ব্যবহারকারী এমন একক প্রক্রিয়া চালাতে পারেন যা সিপিইউ / মেমরির 80% এর বেশি ব্যবহার করে।

সুতরাং কোনও প্রক্রিয়া কীভাবে ব্যবহার করতে পারে CPU ব্যবহারের পরিমাণ সীমিত করে (উদাহরণস্বরূপ 10% থেকে) সীমাবদ্ধ করে এটি হওয়ার কোনও উপায় আছে? আমি সচেতন cpulimit, তবে দুর্ভাগ্যক্রমে আমি যে প্রক্রিয়াগুলিকে সীমাবদ্ধ করার নির্দেশ দিয়েছি তার সীমাবদ্ধতা প্রয়োগ করে (উদাহরণস্বরূপ একক প্রক্রিয়া)। সুতরাং আমার প্রশ্নটি হল, আমি উদাহরণস্বরূপ তাদের আইডি / পথ সরবরাহ না করে ভবিষ্যতে সঞ্চালিত সমস্ত চলমান প্রক্রিয়া এবং প্রক্রিয়াগুলির সীমাটি কীভাবে প্রয়োগ করতে পারি?


আপনি কি কর্মক্ষমতা সমস্যা অনুভব করছেন? বা এটি কেবল যে সংখ্যাগুলি আপনাকে বিরক্ত করে?
ctrl-alt-delor

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

2
খুব অল্প সময়ের জন্য, প্রক্রিয়া প্রক্রিয়াগুলিও 100% হতে পারে এমন হত্যা প্রক্রিয়া সম্পর্কে সতর্ক থাকুন। cpulimitআপনার অনুসন্ধান স্ক্রিপ্টের সাথে একত্রে বিবেচনা করুন । একটি নীতি আছে এবং ব্যবহারের পরামর্শ দিন cpulimit, তারপরে 10% এর বেশি অনুসন্ধান করুন এবং তারপরে 5% সীমাবদ্ধ করুন (যাতে ব্যবহারকারীরা ব্যবহার করতে উত্সাহিত হন cpulimit)। এছাড়াও নিশ্চিত করুন যে আপনি একক ব্যবহারকারীর জন্য আরও 10% যোগ করে একাধিক প্রক্রিয়া সনাক্ত করতে পারেন।
ctrl-alt-delor

@ রিচার্ড এই সমস্ত দরকারী দরকারী মন্তব্যের জন্য রিচার্ডকে ধন্যবাদ! তারা আমাকে অনেক সাহায্য করেছে! আপনার ব্যবহারের পরামর্শটি cpulimitপ্রক্রিয়াটি হত্যার চেয়ে আরও ভাল উপায়, কারণ এটি পরে ব্যবহারকারী দ্বারা পুনরায় চালু করা যেতে পারে (আপনার মন্তব্যের একটিতে নির্দেশিত হিসাবে)। ধন্যবাদ!
জিওভান্নি মাউনির

উত্তর:


20

যদিও এটি মেমরির জন্য অপব্যবহার হতে পারে, এটি সিপিইউর জন্য নয়: যখন কোনও সিপিইউ নিষ্ক্রিয় থাকে, তখন একটি চলমান প্রক্রিয়া ("চলমান" দ্বারা, আমি বোঝাতে চাইছি যে প্রক্রিয়াটি I / O বা অন্য কোনও কিছুর জন্য অপেক্ষা করছে না) গ্রহণ করবে ডিফল্টরূপে 100% সিপিইউ সময়। এবং সীমা প্রয়োগের কোনও কারণ নেই।

এখন, আপনি অগ্রাধিকার সেট আপ করতে পারেন ধন্যবাদ nice। যদি আপনি চান যে এগুলি কোনও প্রদত্ত ব্যবহারকারীর জন্য সমস্ত প্রসেসে প্রয়োগ করতে চান তবে আপনাকে কেবল তার লগইন শেলটি চালিত হয়েছে তা নিশ্চিত করতে হবে nice: শিশু প্রক্রিয়াগুলি niceমানটির উত্তরাধিকারী হবে । এটি ব্যবহারকারীরা কীভাবে লগ ইন করে তার উপর নির্ভর করে instance উদাহরণস্বরূপ ssh লগইনগুলিকে প্রাধান্য দিন nice

বিকল্পভাবে, আপনি ভার্চুয়াল মেশিন সেট আপ করতে পারেন। প্রকৃতপক্ষে প্রতি-প্রক্রিয়া সীমা নির্ধারণ করা এতটা অর্থবোধ করে না যেহেতু ব্যবহারকারী অনেকগুলি প্রক্রিয়া শুরু করতে পারে, সিস্টেমটিকে অপব্যবহার করে। ভার্চুয়াল মেশিনের সাহায্যে সমস্ত সীমা ভার্চুয়াল মেশিনে বৈশ্বিক হবে।

আরেকটি সমাধান হ'ল /etc/security/limits.confসীমা নির্ধারণ; সীমাবদ্ধতা কনফ (5) ম্যান পৃষ্ঠা দেখুন। উদাহরণস্বরূপ, আপনি প্রতি লগইন সর্বাধিক সিপিইউ সময় এবং / অথবা প্রতি লগইন সর্বাধিক সংখ্যক প্রক্রিয়া নির্ধারণ করতে পারেন। আপনি maxloginsপ্রতিটি ব্যবহারকারীর জন্য 1 এ সেট করতে পারেন ।


1
@ জিওভান্নি মাউনির আমার অর্থ: ব্যবহারকারী প্রতি এক ভার্চুয়াল মেশিন।
ভিঙ্ক 17

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

1
@ জিওভান্নি মাউনির আপনি কয়েকটি ভার্চুয়াল মেশিনের মধ্যে পার্টিশন ভাগ করতে পারেন।
ভিঙ্ক 17

@GiovanniMounir আপনি ব্যবহার করতে পারেন LXC বা Docker প্রায় শূন্যের ভার্চুয়ালাইজেশন ওভারহেড হ্রাস। এছাড়াও "পছন্দ করা" একটি শক্ত কারণ নয়। উদাহরণস্বরূপ আমি আপনার সমাধানের সাথে যাচ্ছি যদি আপনি একটি ভাগ করা পিএইচপি হোস্ট পরিচালনা করে থাকেন কারণ এলএক্সসি বা ভার্চুয়াল মেশিনগুলি করার জন্য k 15 / $ 5 লাইসেন্সযুক্ত সফটওয়্যারটির পুনর্লিখনের প্রয়োজন হবে যা ওভারকিল is
পুয়ান খোসরাভি

আমার বোঝাটি হ'ল চমৎকার অন্যান্য প্রসেসের তুলনায় কেবলমাত্র তুলনামূলক সিপিইউ সেট করে। অন্য কোনও প্রক্রিয়া যদি সিপিইউ ব্যবহার না করে তবে আপনার প্রক্রিয়াটি 100% সিপিইউ ব্যবহার করবে, এটি 10% এর মধ্যে সীমাবদ্ধ নয়।
জন কেন

25

সুন্দর / রেনিস

nice কোনও সিস্টেমে 'ওয়ান অফ' টুইট করার জন্য দুর্দান্ত সরঞ্জাম।

 nice COMMAND

cpulimit

cpulimit যদি আপনার কোনও সিপিইউ নিবিড় কাজ চালানো দরকার হয় এবং কোনও সিস্টেমের প্রতিক্রিয়াশীলতার জন্য ফ্রি সিপিইউ সময় থাকা অপরিহার্য।

cpulimit -l 50 COMMAND

Cgroups

cgroups কেবলমাত্র একের চেয়ে প্রসেসের একটি সেটটিতে সীমাবদ্ধতা প্রয়োগ করুন

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

সম্পদ

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
যারা সিপিইউ ব্যবহারের জন্য কঠোর সীমা নির্ধারণ করতে চাইছেন, এমনকি অন্য কোনও প্রক্রিয়া চলমান না থাকলেও cpu.cfs_quota_usপ্যারামিটারটি দেখুন ( ম্যানুয়াল দেখুন )
ডিয়েগো

সিস্টেমেড নির্দেশিকাগুলির জন্য cgroups ব্যবহার করা আরও সহজ ... একটি ইউনিট তৈরি করুন সিস্টেম বা ব্যবহারকারীকে সেই উদ্দেশ্যে সর্বোত্তম বিকল্প
Yves Martin

একটি চলমান প্রক্রিয়া প্রাক্তন জন্য .:sudo cgclassify -g cpu:cpulimited 2315444
কুম্ভ শক্তি

1
আমার বোঝাটি হ'ল চমৎকার অন্যান্য প্রসেসের তুলনায় কেবলমাত্র তুলনামূলক সিপিইউ সেট করে। অন্য কোনও প্রক্রিয়া যদি সিপিইউ ব্যবহার না করে তবে আপনার প্রক্রিয়াটি 100% সিপিইউ ব্যবহার করবে, এটি 10% এর মধ্যে সীমাবদ্ধ নয়।
জন কেন

10

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


যদিও সিজি গ্রুপগুলি হ'ল উপায়। আমি শেয়ার করা কম্পিউটার সার্ভারগুলিও চালিত করি এবং সম্পূর্ণ লগইন সেশনটি ব্যবহার করতে পারে এমন সর্বাধিক সংখ্যক কোর সীমাবদ্ধ করতে আমরা সিগ্রুপগুলি ব্যবহার করি। এইভাবে, যদি ব্যক্তিটি নতুন প্রক্রিয়াগুলি শুরু করে রাখে তবে প্রত্যেকে একটি আরও ছোট টুকরো পায়। স্মৃতি ব্যবহারের জন্য একই। আপনি ব্যবহারকারীদের পাম_সিগ্রুপস এবং সিগ্রুএলসেংড পরিষেবা সহ স্বয়ংক্রিয়ভাবে একটি সিগ্রুপে রাখতে পারেন। প্রতিটি ব্যবহারকারীর নিজস্ব সিগ্রুপে রাখার জন্য আপনি সিগকনফিগ ফাইলে একটি 'টেম্পলেট' ব্যবহার করতে পারেন। cgrulesengd আপনার স্ক্রিপ্টের মতো কাজ করে, হত্যার প্রক্রিয়াগুলি বাদ দিয়ে, এটি প্রতিটি প্রক্রিয়াটি সঠিক সিগ্রুপে রয়েছে তা নিশ্চিত করে।
jsbillings

এমনকি আপনি যদি রিসোর্সের ব্যবহার সীমাবদ্ধ করার জন্য সিগ্রুপগুলি ব্যবহার না করেন, তবে প্রতিটি সংস্থার জন্য 'স্ট্যাট' ফাইলটি দেখে কোনও ব্যক্তি কতগুলি সংস্থান ব্যবহার করছেন তা মূল্যায়ন করতে আপনি এটি ব্যবহার করতে পারেন , তবে সেই তথ্যটি আপনার 5 মিনিটের স্ক্রিপ্টের জন্য ব্যবহার করুন।
jsbillings

3

স্মৃতির জন্য, আপনি যা খুঁজছেন তা হ'ল ulimit -v। নোটটি যা ulimitশিশু প্রক্রিয়াগুলির দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত, তাই আপনি যদি লগইন করার সময় ব্যবহারকারীর লগইন শেলটিতে এটি প্রয়োগ করেন তবে এটি তার সমস্ত প্রক্রিয়াগুলিতে প্রযোজ্য।

যদি আপনার ব্যবহারকারীরা সকলেই bashলগইন শেল হিসাবে ব্যবহার করেন তবে নিম্নলিখিত লাইনটি প্রবেশের /etc/profileফলে সমস্ত ব্যবহারকারীর প্রক্রিয়াগুলি 1 গিগাবাইটের সীমাবদ্ধ হয়ে উঠবে (আরও সঠিকভাবে, এক মিলিয়ন কিলোবাইট):

ulimit -vH 1000000

বিকল্পটি Hনিশ্চিত করে যে এটি একটি শক্ত সীমা, অর্থাৎ ব্যবহারকারী এটি পরে ব্যাক আপ সেট করতে পারে না। অবশ্যই ব্যবহারকারী একবারে পর্যাপ্ত অনেক প্রক্রিয়া শুরু করে মেমরিটি পূরণ করতে পারে।

অন্যান্য শেলগুলির জন্য, আপনাকে কী সূচনা ফাইলগুলি পরিবর্তে পড়বে তা খুঁজে বের করতে হবে (এবং ulimitতারা ব্যবহার করার পরিবর্তে অন্য কোন আদেশ দেয় )।

সিপিইউয়ের জন্য, আপনি যা চাইছেন তা আমার কাছে বোধগম্য নয়। কেবলমাত্র একটি প্রক্রিয়া চলাকালীন 90% সিপিইউকে অব্যবহৃত রাখার ব্যবহার কী হবে? আমি মনে করি আপনি যা চান তা হ'ল nice(এবং সম্ভবত ionice)। উল্লেখ্য, মত ulimit, niceমান শিশু প্রক্রিয়ার মাধ্যমে উত্তরাধিকারসূত্রে, তাই লগইন করার সময় যথেষ্ট এ লগ-ইন শেল প্রতি প্রয়োগ করে। আমার ধারণা এটিও প্রযোজ্য ioniceতবে আমি নিশ্চিত নই।


মেমরির পরামর্শের জন্য ধন্যবাদ! লগিনের সময় ব্যবহারকারীর লগইন শেলটিতে এটি প্রয়োগ করার জন্য আপনি কি আমাকে একটি উদাহরণ দেখিয়ে দিতে পারেন? আমি কীভাবে এটি করব তা নিশ্চিত নয়। যথেষ্ট পরিষ্কার না হওয়ার জন্য আমিও দুঃখিত; আমি যা করার চেষ্টা করছি তা কোনও প্রক্রিয়াকে সিপিইউর 10% এর বেশি ব্যবহার করার অনুমতি দেয় না। সুতরাং আপনি কি মনে করেন যে niceএটি করার পক্ষে যথেষ্ট ভাল হবে? যদি তা হয় তবে আপনি কি মনে করেন এটি অর্জনের জন্য আপনি আমাকে একটি উদাহরণ দেখাতে পারেন?
জিওভান্নি মাউনির

আমি কেবল একটি প্রক্রিয়া চলাকালীন সিপিইউ 90% অলস রাখার পয়েন্টটি এখনও পাই না।
celtschk

1
যদি বর্তমানে 10 টিরও কম প্রক্রিয়াগুলি একই সাথে চলমান হয় (এবং দৌড়ের অর্থ আসলেই চলমান, কেবল ব্যবহারকারী ইনপুট বা ডিস্ক I / O এর জন্য অপেক্ষা না করে) তবে কার্যত গ্যারান্টিযুক্ত যে এর মধ্যে একটিতে 10% এর বেশি সিপিইউ থাকবে। অন্যথায় সিপিইউ কার্যত অলস হবে। এবং যদি আপনি কেবল 10% এর উপরে চলে যাওয়া কোনও প্রক্রিয়াটি হত্যা করেন তবে আমি নিশ্চিত যে আপনার অনেক ব্যবহারকারী রয়েছেন যারা আপনাকে হত্যা করতে চাইবে বা কমপক্ষে, এমন কোনও ব্যক্তির দ্বারা আপনাকে প্রতিস্থাপনের চেষ্টা করবে যার এই সংখ্যার অর্থ কী তা সম্পর্কে একটি ধারণা রয়েছে যা আপনার মনে হয় না।
celtschk

@Celtschk এর মন্তব্যের বিপরীতে, যদি 11 বা ততোধিক প্রক্রিয়া চলমান থাকে (সিপিইউ আবদ্ধ) তবে সেগুলি 9.09% এরও কম হবে। সুতরাং আমি যদি এমন কোনও সিস্টেমের ব্যবহারকারীর হয়ে থাকি যা 10% সিপিইউ ব্যবহারের উপর নিষেধাজ্ঞা জারি করে আমি 11 বা আরও বেশি প্রক্রিয়া চালাতে পারি এবং রাডারটির নীচে লুকিয়ে থাকি।
ctrl-alt-delor

@richard আপনি ঠিকই বলেছেন, সম্ভবত স্ক্রিপ্টটি ব্যবহারকারীর দ্বারা ব্যবহৃত মেমরি / সিপিইউর মোট পরিমাণ যোগ করে এবং শতাংশ নির্দিষ্ট পরিমাণে পৌঁছালে এই ব্যবহারকারীর সমস্ত প্রক্রিয়া বন্ধ করে দেয় (তাই তাকে লগও করা হবে) আউট)
জিওভান্নি মাউনির

3

যেহেতু আপনি চিঠিতে হয় যে cpulimit আপনার ক্ষেত্রে ব্যবহারিক হবে না, তারপর আমি আপনাকে পরামর্শ দিচ্ছি আপনি তাকান সুন্দর , renice এবং taskset , যা আপনি কি অর্জন করতে চান পাসে আসতে পারে, যদিও taskset একটি প্রসেস এর CPU- র সম্বন্ধ সেট করতে পারবেন, তাই এটি আপনার ক্ষেত্রে অবিলম্বে সহায়ক নাও হতে পারে।


1
niceএবং renice? ওটা সুন্দর! আমি তাদের ম্যানুয়াল পৃষ্ঠাগুলি দেখেছি, তবে এখনও মনে হয় না যে তারা এখনও এটিকে সাহায্য করতে পারে কারণ আপনার এখনও একটি প্রক্রিয়া আইডি সেট করতে হবে। তবে আপনি যদি আমাকে এমন কোনও উদাহরণ দিতে পারেন যা এই চলমান প্রক্রিয়াগুলি / ভবিষ্যতের প্রক্রিয়াগুলির সীমাটি প্রয়োগ করার জন্য এই প্যাকেজগুলিকে অন্তর্ভুক্ত করে যা দুর্দান্ত হবে!
জিওভান্নি মাউনির

1

যেহেতু আপনার ট্যাগগুলি রয়েছে তাই centosআপনি ব্যবহার করতে পারেন systemd

উদাহরণস্বরূপ আপনি যদি আইডি সহ ব্যবহারকারীকে সীমাবদ্ধ করতে চান 1234:

sudo systemctl edit --force user-1234.slice

তারপরে এটি টাইপ করুন এবং সংরক্ষণ করুন:

[Slice] CPUQuota=10%

পরবর্তী সময় যে ব্যবহারকারীর লগ ইন, এটি প্রভাবিত করবে।

ম্যান পৃষ্ঠাসমূহ: systemctl, systemd.slice, systemd.resource-control...


0

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

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

আমার ক্ষেত্রে pypdfocrলোভী প্রবর্তন tesseract

এছাড়াও কিছু ক্ষেত্রে আপনার সিপিইউ বেশ ভাল ছিল আপনি ঠিক এর reniceমতো ব্যবহার করতে পারেন :

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.