লিনাক্সে একটি প্রক্রিয়াটির সমস্ত থ্রেড (এবং শিশুদের) কীভাবে পুনরায় ব্যবহার করবেন?


22

লিনাক্স (এখনও) পসিক্স ১ মান অনুসরণ করে না যা বলে যে একটি reniceপ্রক্রিয়া "প্রসেসের সমস্ত সিস্টেম স্কোপ থ্রেডগুলিকে" প্রভাবিত করে, কারণ পাইথ্রেড ()) ডক অনুযায়ী "থ্রেডগুলি একটি সাধারণ সুন্দর মান ভাগ করে না"।

যাইহোক, কখনও কখনও, reniceপ্রদত্ত প্রক্রিয়া সম্পর্কিত "সমস্ত কিছু" সুবিধাজনক হতে পারে (একটি উদাহরণ অ্যাপাচি শিশু প্রক্রিয়া এবং তাদের সমস্ত থ্রেড হবে)। সুতরাং,

  • আমি একটি প্রদত্ত প্রক্রিয়া সম্পর্কিত reniceসমস্ত থ্রেড কীভাবে পারি ?
  • আমি কীভাবে একটি প্রদত্ত প্রক্রিয়াভুক্ত reniceসমস্ত শিশু প্রক্রিয়া করতে পারি ?

আমি মোটামুটি সহজ সমাধান খুঁজছি।

আমি জানি যে প্রক্রিয়া গোষ্ঠীগুলি মাঝে মাঝে সহায়ক হতে পারে তবে যাইহোক, আমি যা করতে চাই তা সবসময় তার সাথে মেলে না: তারা বিস্তৃত বা বিভিন্ন প্রক্রিয়াগুলির সেট অন্তর্ভুক্ত করতে পারে।

cgroupদ্বারা পরিচালিত ব্যবহার systemdকরাও সহায়ক হতে পারে তবে আমি যদি এটি সম্পর্কে শুনতে আগ্রহী তবে আমি বেশিরভাগই একটি "স্ট্যান্ডার্ড" সমাধান খুঁজছি।

সম্পাদনা: এছাড়াও, man (7) pthreadsবলেছেন যে "একটি প্রক্রিয়াতে সমস্ত থ্রেড একই থ্রেড গ্রুপে স্থাপন করা হয়; একটি থ্রেড গ্রুপের সমস্ত সদস্য একই পিআইডি ভাগ করে নেয়"। সুতরাং, এমন কি এটির পক্ষেও কি সম্ভব reniceযার নিজস্ব পিআইডি নেই?

উত্তর:


19

আপনি /proc/$PID/taskপ্রদত্ত প্রক্রিয়াটির সমস্ত থ্রেড সন্ধান করতে ব্যবহার করতে পারেন, তাই আপনি ব্যবহার করতে পারেন

$ ls /proc/$PID/task | xargs renice $PRIO

থেকে reniceসব থ্রেড একটি প্রদত্ত প্রক্রিয়া একাত্মতার।

/proc/$PID/task/$PID/childrenসমস্ত শিশু প্রক্রিয়াগুলি (বা /proc/$PID/task/*/childrenআপনি যদি একটি প্রদত্ত প্রক্রিয়ার সমস্ত থ্রেডের সমস্ত শিশু প্রক্রিয়া চান তবে) একই পদ্ধতি ব্যবহার করতে পারেন ।

$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO

man (7) pthreadsবর্তমান (এনপিটিএল) বাস্তবায়ন সম্পর্কে বলেছেন: "একটি প্রক্রিয়াতে সমস্ত থ্রেড একই থ্রেড গ্রুপে স্থাপন করা হয়; থ্রেড গ্রুপের সমস্ত সদস্য একই পিআইডি ভাগ করে নেয়" এবং "থ্রেডগুলি একটি সাধারণ সুন্দর মান ভাগ করে না"। তারপরে, আপনি কীভাবে কোনও থ্রেডটি পুনরায় ভাড়া করতে পারেন যার নিজস্ব পিআইডি নেই, যখন এটি reniceকরার জন্য কোনও পিআইডি ব্যবহার করে?
টোটার

আমি থ্রেড আইডিতে রিনিস চেষ্টা করেছি এবং এটি প্রতিবেদন করে 24995 (process ID) old priority 0, new priority -10। 24995 উপস্থিত হয় না ps, সুতরাং এটি কোনও প্রক্রিয়া নয়। রেনিস-ইনড থ্রেডগুলি আসলে কাজ করে?
স্টেফান রেইচ

9

ভাল মূল্য নাকি সিপিইউ শেয়ার?

দয়া করে মনে রাখবেন আজকাল, চমৎকার মান না, তাই প্রাসঙ্গিক "সিস্টেম-ব্যাপী" স্বয়ংক্রিয় গোষ্ঠীবদ্ধ, espacially যখন ব্যবহার টাস্ক কারণ হতে পারে, systemd হল । আরও বিশদ জন্য দয়া করে এই উত্তর দেখুন।

থ্রেড এবং প্রক্রিয়া মধ্যে পার্থক্য

লিনাক্সের ক্ষেত্রে গুরুত্বপূর্ণ প্রশ্ন, কারণ ডকুমেন্টেশন সন্দেহকে স্থায়ী করে তোলে (উদাহরণস্বরূপ থ্রেডগুলির নিজস্ব পিআইডি নেই)।

দ্রষ্টব্য: এই উত্তরটি লিনাক্স থ্রেডগুলি স্পষ্টভাবে ব্যাখ্যা করে explains

সংক্ষেপে: কার্নেলটি কেবল "চলমানযোগ্য সত্তা" পরিচালনা করে, যা চালানোনির্ধারিত কিছু । কার্নেল অনুযায়ী, এই সত্তাগুলি প্রসেস বলে called একটি থ্রেড, হ'ল এক ধরণের প্রক্রিয়া যা মেমরির স্থান এবং কমপক্ষে অন্যটির সাথে সংকেত হ্যান্ডলারগুলি ভাগ করে দেয়।

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

ফলস্বরূপ, আপনি পৃথকভাবে প্রতিটি "থ্রেড" করতে পারেন renice কারণ তাদের নিজস্ব পিআইডি 1 রয়েছে

পুনরাবৃত্তভাবে সমস্ত পিআইডি সন্ধান করাrenice

আমাদের সমস্ত প্রক্রিয়ার পিআইডি ("সাধারণ" বা "থ্রেড") পেতে হবে যা বংশধর হতে হবে (শিশুরা বা থ্রেড গ্রুপে) হতে হবে-হওয়া-করা প্রক্রিয়াটির। এটি পুনরাবৃত্ত হওয়া উচিত (বাচ্চাদের বাচ্চাদের বিবেচনা করে)।

অ্যান্টন লিওন্টিভ উত্তরগুলি এটি করার ইঙ্গিত দেয়: এর মধ্যে সমস্ত ফোল্ডারের নাম /proc/$PID/task/থ্রেডের পিআইডি হ'ল একটি childrenফাইলের সম্ভাব্য বাচ্চাদের প্রক্রিয়াগুলির তালিকাবদ্ধ করে।

তবে এটির পুনরুক্তি নেই, তাই এটিগুলি খুঁজে পাওয়ার জন্য এখানে দ্রুত এবং নোংরা শেল স্ক্রিপ্ট রয়েছে:

#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1

PID_LIST=
findpids() {
        for pid in /proc/$1/task/* ; do
                pid="$(basename "$pid")"
                PID_LIST="$PID_LIST$pid "
                for cpid in $(cat /proc/$1/task/$pid/children) ; do
                        findpids $cpid
                done
        done
}

findpids $1
echo $PID_LIST

প্রক্রিয়া পিআইডি 1234 যদি আপনি পুনরাবৃত্তভাবে সুন্দর করতে চান তবে এখন আপনি এটি করতে পারেন:

renice -n 15 -p $(/path/to/findchildren.sh 1234)

1 উল্লেখ্য, POSIX মেনে চলার জন্য, কলিং getpid(2)একটি থ্রেড মধ্যে হবে না আপনি এই runnable সত্তা সিস্টেম-ব্যাপী অনন্য আইডি (PID) বরং "থ্রেড গ্রুপ" মধ্যে মূল প্রক্রিয়া এর PID, দিতে, কিন্তু। gettid(2)পরিবর্তে আপনাকে কল করতে হবে। আরও তথ্যের জন্য এই উত্তর দেখুন ।


6

আমাদের প্রসেস পিআইডি এবং থ্রেড আইডিটি কিছু সময় লিখিত টিআইডি বা পিএস কমান্ড এলপিডাব্লুতে বিভ্রান্ত করা উচিত নয়। sকমান্ড প্রদর্শন থ্রেড অপশন আছে, এবং অধীন topবা htopআপনার দ্বারা থ্রেড এবং প্রক্রিয়া মধ্যে স্যুইচ Hচিঠি। যেমন আগে @ টোটার বলেছিলেন, এনপিটিএল দিয়ে, যা কার্নেল> ২.6 সহ বর্তমান বাস্তবায়ন, সমস্ত থ্রেডের সমান পিড থাকে তবে তাদের আলাদা আলাদা জোয়ার থাকে। আপনি কোনও প্রক্রিয়াটির সমস্ত থ্রেড এ দ্বারা দেখান:

$ ps -Ljf <pid>

এই জোয়ারটি নীচে থাকা ডিরেক্টরিগুলির নাম /proc/<pid>/task, এবং এমনকি যদি রাইনিস (1) বলে যে এটির ডিফল্ট আর্গুমেন্টটি একটি পিড হিসাবে প্রয়োগ করা হয় তবে এটি কেবলমাত্র মূল থ্রেডটিকে পুনরায় ব্যবহার করে (সেটআপপ্রাইটিটিতে লিখিতভাবে এটি লিনাক্স প্রয়োগের ক্ষেত্রে একটি বাগ) ) ), এটি একটি জোয়ারের জন্যও প্রয়োগ করা যেতে পারে এবং এটি থ্রেডটি নতুন করে দেয়। যেহেতু @ অ্যান্টনের উত্তরটি বৈধ।

তবে বেশিরভাগ ক্ষেত্রে পছন্দসই ফলাফল অর্জনের একটি সহজ উপায় রয়েছে, এই সমস্ত থ্রেড একই পিজিডি ভাগ করে যা গ্রুপ নেতার পিড; আপনি জারি করে পিজিডি দ্বারা পুনর্নবীকরণ করতে পারেন:

$ renice -g <pgid>

আপনি যদি একই গ্রুপ নেতার উপর নির্ভর করে অন্য কোনও প্রক্রিয়া পুনরায় ভাড়া না নিতে চান তবে আপনাকে @ অ্যান্টনের রেসিপিটি ব্যবহার করতে হবে:

$ renice <priority> $(ls -1 /proc/<pid>/task)

বা:

$renice <priority> $(ps --no-header -Lo tid <pid>)

আপনি যে পদ্ধতিতে পুনরায় ভাড়া নিতে চান তার চেয়ে একই গ্রুপের অন্যান্য প্রক্রিয়াগুলি কী কী তা আপনি জানতে চাইতে পারেন, এটিই সেই প্রক্রিয়া যা ভাগ একই পিজিআইডি রয়েছে। আপনি PS (1) ব্যবহার করতে পারেন , psগ্রুপ লিডার দ্বারা প্রক্রিয়াগুলি নির্বাচন করার অনুমতি দেয় না, তবে আপনি এটি করতে গ্রেপ করতে পারেন ps। Pgid সহ প্রক্রিয়াগুলি 1908কমান্ড দ্বারা দেওয়া হবে:

$ ps --no-header axo pid,pgid |sed -n '/^ *[0-9][0-9]*  *1908/s/[0-9][0-9]* *$//p'

বা যদি আপনি খারাপ লাগাতে পছন্দ করেন:

$ ps --no-header axo pid,pgid|awk '{if ($2=="1908") print $1;}'

এটি 4.19.4-তে সঠিকভাবে কাজ করছে বলে মনে হচ্ছে না (যেমন এখনকার দেবিয়ান স্ট্রেচ): $ renice -n 18 -g 8524 renice: failed to get priority for 8524 (process group ID): No such process $ ps --no-header axo pid,pgid|awk '{if ($2=="8524") print $1;}' যদিও টোটারের পদ্ধতিটি এখনও / এখনও কাজ করে: $ /bin/ls /proc/8524/task | /usr/bin/xargs renice 19 2739 (process ID) old priority 19, new priority 19 2740 (process ID) old priority 19, new priority 19 ... আমি / প্রোক, হটপ, স্ট্রিট্রি ইত্যাদি দিয়ে নিশ্চিত করেছি যে আমার কাছে সঠিক টপ- স্তর পিআইডি গত এক বছরে হয়ত কিছু পরিবর্তন হয়েছে।
বিল ম্যাকগনিগল

আমি জানি না আপনি কীভাবে আপনার বিল @ ম্যাকগনিগল আপনার পরীক্ষা করেছেন, আমি দেবিয়ান স্ট্রেচে ৪.৯.০ মাত্র তিনটি কার্নেল দিয়ে চেষ্টা করেছি; দেবিয়ান পরীক্ষায় 4.18.0 এবং 4.19.0; আমি এটি উপরে বলেছি এবং এটি কাজ করে।
মার্জ

যেমনটি আমি বলেছিলাম, ডেমিয়ান স্ট্রেচটি 4.19.4-এ কমান্ড এবং আউটপুট প্রদর্শিত হবে; পার্থক্যটি 4.19.0 বনাম 4.19.4 বলে মনে হচ্ছে তবে আমি অবাক হয়েছি যে এই জাতীয় ছোট সংস্করণগুলির মধ্যে অনেক পরিবর্তন হবে।
বিল ম্যাকগনিগল

আমার অনুমান যে আপনার প্রক্রিয়া 8524 সমস্ত থ্রেডেড প্রক্রিয়া টিআইডি বা এলপিডাব্লুয়ের পিআইডি, তবে প্রক্রিয়া গ্রুপ নয়, অবশ্যই আপনি সমস্ত থ্রেড খুঁজে পেয়েছেন /proc/8524/taskতবে renice -gব্যর্থ। আপনি যখন একটি প্রক্রিয়া গাছ দেখেন তখন একটি শাখা একই প্রক্রিয়া গ্রুপে থাকে, কেবল একটি থ্রেডেড প্রক্রিয়া নয় process এর ফলাফল চেক করতে আবার চেষ্টা করুন ps -Ljf
মার্জ

0

আমি রেনিস ব্যবহার করার সময় -p (প্রসেস আইডি) এর পরিবর্তে -g (প্রক্রিয়া গ্রুপ) যুক্তি ব্যবহার করার পরামর্শ দিতে চাই। এটি বাশ-ফু ছাড়া একই কাজ করে।

অর্থাত

(sudo) renice -n <NEW_PRIORITY> -g <MAIN_PROCESS_ID>

মার্ক্স এর উত্তর ইতিমধ্যে এটি উল্লেখ করেছে।
টোটার

-1

এখানে আমার একটি লিপি রয়েছে:

pgrep -v <PROCESS_NAME> | sudo xargs renice <NEW_PRIORITY>

1
এটি আপনার নাম বাদে প্রতিটি প্রসেসে রেনিস চালু করে। আমি ব্যক্তিগতভাবে এই আদেশটি বিপজ্জনক এবং অপর্যাপ্ত হিসাবে বিবেচনা করি।
টোটার

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