শীর্ষ এবং পিএস একই সিপু ফলাফল দেখাচ্ছে না


54

এটি এই প্রশ্নের সাথে জড়িত ।

আমি যখন চালিত হয় topআমি নিম্নলিখিত ফলাফল পেতে:

এখানে চিত্র বর্ণনা লিখুন

পিড 303818% সিপিইউ ব্যবহার করছে, তবে চলমান অবস্থায়

এখানে চিত্র বর্ণনা লিখুন

ফলাফল 5.5%। এবং এই সংখ্যাটি সময়ের সাথে পরিবর্তিত হয় না বলে মনে হয় (অর্থাত্ কিছুক্ষণ পরে একই কমান্ডটি চালানোর সময়) ...

psকমান্ডটি কি কোনওভাবে সিপিইউ ব্যবহারের গড় বাড়ছে?

উত্তর:


87

man psমধ্যে NOTESঅধ্যায়।

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

এবং, অনুমান আপনি জানেন, কিন্তু আপনি এটি করতে পারেন:

top -p <PID>

সম্পাদনা করুন : অন্য উত্তরে আপনার মন্তব্য হিসাবে;

" হুম হ্যাঁ আমি ভাবছি কিভাবে পিএস থেকে এটি (তাত্ক্ষণিক সিপিইউ শতাংশ) পাবেন? "

সংক্ষিপ্ত উত্তর: আপনি পারবেন না।

এটা এমন কেন?

এটি কাউকে ছবি থেকে গাড়ির গতি গণনা করতে বলার মতো।

যদিও topএকটি নিরীক্ষণ সরঞ্জাম, psএটি একটি স্ন্যাপশট সরঞ্জাম। এটি এরকমভাবে ভাবুন: যে কোনও মুহুর্তে একটি প্রক্রিয়া হয় সিপিইউ ব্যবহার করে না হয়। সুতরাং আপনার সেই সঠিক মুহুর্তে 0% বা 100% লোড রয়েছে।

প্রদান: যদি psদিতে হবে তাত্ক্ষণিক CPU ব্যবহারের এটা হয় 0% বা 100% হতে হবে।

top অন্যদিকে ভোটদানের সংখ্যা রাখুন এবং সময়ের সাথে সাথে লোড গণনা করুন।

psবর্তমান ব্যবহার করতে পারে - তবে এর জন্য একাধিকবার ডেটা পড়তে হবে এবং প্রতিটি পঠনের মধ্যে ঘুমানো দরকার। এটা হয় না।

পিএস% সিপিইউর জন্য গণনা

ps নিম্নলিখিত পদ্ধতিতে সিপিইউ ব্যবহার গণনা করে:

আপটাইম = মোট সময় সিস্টেম চলছে।
পিএস_টাইম = প্রক্রিয়া শুরু করার সময়টি বুট থেকে সেকেন্ডে পরিমাপ করা হয়।
পু_টাইম = মোট সময় প্রক্রিয়া সিপিইউ ব্যবহার করে চলেছে।

;; দ্বিতীয় প্রক্রিয়া চলছে:
সেকেন্ড = আপটাইম - পিএস_টাইম
;; ব্যবহার:
সিপিইউ_সেজ = পু_টাইম * 1000 / সেকেন্ড

মুদ্রণ: cpu_usage / 10 "। cpu_usage% 10


উদাহরণ: আপটাইম = 344,545 পিএস_টাইম = 322,462 পু_টাইম = 3,383 সেকেন্ড = 344,545 - 322,462 = 22,083 সিপিইউ_উসেজ = 3,383 * 1,000 / 22,083 = 153 মুদ্রণ: 153/10 "। 153% 10 => 15.3

সুতরাং মুদ্রিত নম্বরটি হ'ল: প্রক্রিয়াটি তার জীবদ্দশায় সিপিইউ ব্যবহার করে চলেছে। উপরের উদাহরণ হিসাবে। এটি তার জীবদ্দশার 15.3% সালে এটি করেছে। 84,7% সময়ের মধ্যে এটি সিপিইউতে বাগ লাগছিল না।

তথ্য পুনরুদ্ধার

psপাশাপাশি সেইসাথে topসঞ্চিত ফাইলগুলি /proc/- বা প্রক্রিয়া সম্পর্কিত তথ্য সিউডো-ফাইল সিস্টেমের ডেটা ব্যবহার করে ।

এর মূলে আপনার কয়েকটি ফাইল /proc/রয়েছে যা সিস্টেমের সামগ্রিক অবস্থা সম্পর্কে বিভিন্ন তথ্য রয়েছে। এছাড়াও প্রতিটি প্রক্রিয়াটির নিজস্ব সাব ফোল্ডার রয়েছে /proc/<PID>/যেখানে প্রক্রিয়া নির্দিষ্ট ডেটা সংরক্ষণ করা হয়। সুতরাং, উদাহরণস্বরূপ আপনার প্রশ্ন থেকে প্রক্রিয়াটিতে একটি ফোল্ডার ছিল /proc/3038/

psসিপিইউ ব্যবহারের গণনা করা হলে এটি দুটি ফাইল ব্যবহার করে:

/ প্রকল্প / আপটাইম সিস্টেমের আপটাইম (সেকেন্ড) এবং অলস প্রক্রিয়াতে (সেকেন্ড) সময় ব্যয়।
/ proc / [PID] / প্রক্রিয়া সম্পর্কিত স্থিতির তথ্য।
  • uptimeএটি থেকে প্রথম মান ( আপটাইম ) ব্যবহার করে ।
  • [PID]/statএটি থেকে নিম্নলিখিতটি ব্যবহার করে:
 # নাম বর্ণনা
জিফিতে পরিমাপকৃত ইউজার কোডে 14 ইউটাইম সিপিইউ সময় ব্যয় করেছে
জিফিতে পরিমাপ করা, কর্নেল কোডে ব্যয় করা 15 স্টিমি সিপিইউ সময়
বাচ্চাদের সময় সহ ইউজার কোডে 16 কিউটাইম সিপিইউ সময় ব্যয় করেছে
বাচ্চাদের সময় সহ কর্নেল কোডে 17 সিএসটাইম সিপিইউ সময় ব্যয় করেছে 
22 প্রারম্ভকালীন সময় যখন প্রক্রিয়া শুরু হয়, জিফিতে পরিমাপ করা হয়

একটি জিফি হ'ল ক্লক টিক। সুতরাং এটির পাশাপাশি sysconf(_SC_CLK_TCK)সিস্টেমের হার্টজ (প্রতি সেকেন্ডে টিক্সের সংখ্যা) পেতে বিভিন্ন পদ্ধতি ব্যবহার করা হয় - শেষ পর্যন্ত অন্যান্য বিকল্পগুলি ক্লান্ত করার পরে ১০০ টি ফল-ব্যাক হিসাবে ব্যবহার করা হয়।

সুতরাং যদি utime1234 হয় এবং হার্টজ 100 হয় তবে:

seconds = utime / Hertz = 1234 / 100 = 12.34

আসল গণনাটি দ্বারা করা হয়:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

উদাহরণ (একটি কাস্টম বাশ স্ক্রিপ্ট থেকে আউটপুট):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

পিএস দিয়ে "বর্তমান" লোড গণনা করা হচ্ছে

এটি একটি (বিট?) ছায়াময় প্রচেষ্টা কিন্তু ঠিক আছে। যেতে দাও।

কেউ এর দ্বারা প্রদত্ত সময়গুলি ব্যবহার করতে পারে psএবং এ থেকে সিপিইউ ব্যবহার গণনা করতে পারে । এটি সম্পর্কে চিন্তা করার সময় এটি কিছুটা সীমাবদ্ধতার সাথে বরং বরং কার্যকর হতে পারে।

এটি দীর্ঘ সময়ের জন্য সিপিইউ ব্যবহার গণনা করতে দরকারী হতে পারে। অর্থাৎ আপনি plugin-containerফায়ারফক্স সম্পর্কিত কিছু কাজ করার সময় ফায়ারফক্সে গড় সিপিইউ লোড নিরীক্ষণ করতে চান ।

এর থেকে আউটপুট ব্যবহার করে:

$ পিএস-পি-সিপিটাইম, ইটাইমস

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

আমি ব্যবহার etimeউপর etimesএই নমুনা এ, গণনার উপর, শুধুমাত্র একটি বিট আরো স্পষ্ট করা। এছাড়াও "মজাদার" জন্য আমি% সিপিইউ যুক্ত করি। অর্থাত্ একটি বাশ স্ক্রিপ্টটিতে অবশ্যই স্পষ্টভাবে ব্যবহার করা হবে etimes- বা আরও ভাল থেকে পড়া /proc/<PID>/etc.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

প্রক্রিয়াটি এই সময়ের মধ্যে 38% সময় সিপিইউ ব্যবহার করে।

কোড দেখুন

আপনি যদি psএটি জানতে চান এবং একটি সামান্য সি জানেন, তাহলে (মনে হয় আপনি জ্নোম দেবাইন ডেরাইভেন্ট চালাচ্ছেন) - মন্তব্য সম্পর্কিত কোডে সুন্দর আচরণ .:

apt-get source procps
cd procps*/ps
vim HACKING

আমি আরও তথ্যের সাথে topএবং অবিচ্ছিন্ন মনিটরিং - বা psবর্তমান সিপিইউ লোডের সাথে দেরি ওরফে ওরফে স্ন্যাপ দিয়ে আপডেট করতে পারি ।
রানিয়াম

2
সত্যিই দুর্দান্ত উত্তর!
থিওডর

পুরো সিস্টেম জুড়ে মোট সিপিইউ ব্যবহার গণনা করার সময় কী হয়। সরঞ্জামগুলি কি কোনও স্ন্যাপশটের মাধ্যমে সিপিইউ ব্যবহারের চেষ্টা করছে, বা সময়ের সাথে সাথে এটি গড় করছে?
সিএমসিডিগ্রাগনকাই

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

হুম হ্যাঁ আমি ভাবছি কীভাবে এটি (তাত্ক্ষণিক সিপিইউ শতাংশ) পেতে হয়ps
থিওডোর

2
আপনি শীর্ষস্থানীয় উদাহরণ থেকে নিষ্কাশন করতে পারেনtop -p 3343 -n1 | awk '/ R /{print $10}'
রাহুল পাতিল

1
অসাধারণ. আমি দেখতে পেয়েছি awk: কাজটি pidআরও ভাল করার জন্য , যেমনটি ছিলtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
থিওডোর

1
ধন্যবাদ "টপ-পি" দুর্দান্ত, আমি এই বিকল্পটি কখনই লক্ষ্য করিনি! তবে আমি পিআইডি অনুসন্ধান করতে চাই না, যদি সুযোগক্রমে ফ্রি মেমরি বিভাগে বা অন্য কোনও ক্ষেত্রে একই অঙ্কগুলি উপস্থিত হয় তবে কী হবে। আমার সিস্টেমে তথ্যগুলি 8 ম লাইন এবং 9 ম কলামে রয়েছে তাই আমি করি:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
ফিলিওউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.