शीर्ष और पीएस एक ही सीपीयू परिणाम नहीं दिखा रहा है


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 निम्नलिखित तरीके से CPU उपयोग की गणना करता है:

uptime = कुल समय प्रणाली चल रही है।
ps_time = प्रक्रिया प्रारंभ समय बूट से सेकंड में मापा जाता है।
pu_time = कुल समय प्रक्रिया CPU का उपयोग कर रही है।

;; सेकंड प्रक्रिया चल रही है:
सेकंड = अपटाइम - ps_time
;; उपयोग:
cpu_usage = pu_time * 1000 / सेकंड

प्रिंट: cpu_usage / 10 "।" cpu_usage% 10


उदाहरण: अपटाइम = 344,545 ps_time = 322,462 pu_time = 3,383 सेकंड = 344,545 - 322,462 = 22,083 cpu_usage = 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/

जब psCPU उपयोग की गणना करता है तो यह दो फाइलों का उपयोग करता है:

/ proc / uptime सिस्टम का अपटाइम (सेकंड), और निष्क्रिय प्रक्रिया (सेकंड) में बिताए समय की मात्रा।
/ proc / [PID] / प्रक्रिया के बारे में स्टेटस की जानकारी।
  • इसमें से uptimeपहले मूल्य ( अपटाइम ) का उपयोग किया जाता है ।
  • इसमें से [PID]/statनिम्नलिखित का उपयोग किया गया है:
 # नाम का विवरण
उपयोगकर्ता कोड में बिताए 14 utime CPU समय, jiffies में मापा जाता है
15 stime CPU समय कर्नेल कोड में बिताया, jiffies में मापा जाता है
बच्चों से समय सहित उपयोगकर्ता कोड में 16 कटाइम सीपीयू समय बिताया
17 cstime CPU समय बच्चों से समय सहित कर्नेल कोड में बिताया 
22 शुरुआत समय जब प्रक्रिया शुरू हुई, जिफ़ियों में मापा गया

एक जिफ़ी घड़ी की टिक टिक है। इसलिए इसके अलावा यह विभिन्न तरीकों का उपयोग करता है, अर्थात, sysconf(_SC_CLK_TCK)सिस्टम के हर्ट्ज़ (प्रति सेकंड टिक्सेस की संख्या) प्राप्त करने के लिए - अंततः अन्य विकल्पों को समाप्त करने के बाद फ़ॉल-बैक के रूप में 100 का उपयोग करना।

तो अगर 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सीपीयू के उपयोग और गणना के समय का उपयोग किया जा सकता है । जब इसके बारे में सोचना वास्तव में उपयोगी हो सकता है, तो कुछ सीमाओं के साथ।

यह सीपीयू उपयोग की लंबी अवधि में गणना करने के लिए उपयोगी हो सकता है। Ie का कहना है कि आप plugin-containerफ़ायरफ़ॉक्स से संबंधित कार्य करते समय फ़ायरफ़ॉक्स में औसत सीपीयू लोड की निगरानी करना चाहते हैं ।

से उत्पादन का उपयोग करके:

$ ps -p -o cputime, etimes

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>/आदि।

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

इस अवधि के दौरान CPU 38% प्रक्रिया का उपयोग कर रहा था।

कोड को देखो

यदि आप psयह जानना चाहते हैं कि यह कैसे होता है, और थोड़ा सी पता है, तो करें (ऐसा लगता है कि आप ग्नोम देबैन डेरियावेंन्ट चलाते हैं) - टिप्पणियों आदि के बारे में कोड में अच्छा रवैया:

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

मैं वर्तमान सीपीयू लोड के साथ अधिक जानकारी के साथ अद्यतन कर सकता हूं top, और निरंतर निगरानी - या देरी उर्फ ​​" ps" के साथ।
रनियम

2
वास्तव में महान जवाब!
थियोडोर

पूरे सिस्टम में कुल सीपीयू उपयोग की गणना करते समय क्या होगा। क्या उपकरण स्नैपशॉट के माध्यम से सीपीयू का उपयोग करने की कोशिश कर रहे हैं, या समय के साथ इसे औसत कर रहे हैं?
CMCDragonkai

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 }'
फिल्पवॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.