क्या एक बार पढ़ने / प्रोक / स्टेट के द्वारा प्रतिशत CPU उपयोग की गणना करने का कोई तरीका है?


12

मुझे लगता है कि सवाल यह है कि क्या मैं किसी भी तरह सीपीयू उपयोग प्रतिशत की गणना केवल एक बार / प्रोक / स्टेट पढ़कर कर सकता हूं?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

मैं IOWait को छोड़कर कॉलम को सारांशित करने के बारे में सोच रहा हूं (मैं कहीं पढ़ रहा था कि यह बेकार में गिना जाता है) और इससे मुझे 100% मिलेगा और प्रत्येक व्यक्तिगत कॉलम को 100% (कॉलम / 100_percent) 100% में बदल दिया जा सकता है।

  • उपयोगकर्ता: उपयोगकर्ता मोड में निष्पादन की सामान्य प्रक्रिया
  • अच्छा: उपयोगकर्ता मोड में निष्पादित प्रक्रियाएँ
  • सिस्टम: कर्नेल मोड में निष्पादन की प्रक्रिया
  • निष्क्रिय: अंगूठे
  • iowait: I / O के पूरा होने की प्रतीक्षा कर रहा है
  • irq: सर्विसिंग में रुकावट आती है
  • softirq: सर्विसिंग softirqs
  • चोरी: अनैच्छिक इंतजार
  • अतिथि: एक सामान्य अतिथि चल रहा है
  • Guest_nice: एक अतिथि अतिथि चल रहा है

क्या यह एक व्यवहार्य दृष्टिकोण है या मैं पूरी तरह से ट्रैक से दूर हूं?

जवाबों:


11

आप सही रास्ते पर हैं, topइस उद्देश्य के लिए इस फ़ाइल का उपयोग करता है। लेकिन आपको इसे एक से अधिक बार पढ़ने की आवश्यकता है।

उपयोग समय के साथ उपयोग का एक उपाय है। आप इसे होस्ट के सेकंड्स में अपटाइम जानने के बाद एक बार पढ़ सकते हैं, फिर उसी से विभाजित कर सकते हैं, लेकिन इससे आपको मशीन के बूट होने के बाद होस्ट की उपयोगिता दर मिल जाएगी।

यदि आप 5 सेकंड से अधिक की दर चाहते हैं, तो आप फ़ाइल को एक बार पढ़ेंगे, 5 सेकंड के लिए सोएंगे, इसे फिर से पढ़ेंगे, गणना का अंतर प्राप्त करेंगे और 5 से विभाजित करेंगे।


6

आपका दृष्टिकोण सही है। आप कच्चे डेटा के रूप में उपयोग / खरीद सकते हैं और इसके साथ उदाहरण के लिए rrdtool फ़ीड कर सकते हैं। मैंने अपने आप को कुछ इस तरह से किया है इसलिए मुझे पता है कि यह 100% संभव है। आप अच्छी तरह से तो पूरे सिस्टम लोड या प्रत्येक कोर व्यक्तिगत रूप से रेखांकन कर सकते हैं।

यहाँ मेरे अपने काम का एक उदाहरण है: यहाँ छवि विवरण दर्ज करें

Reassuming -> आप इसे कर सकते हैं, यह केवल मूल गणित कठिन नहीं है और मेरे रेखांकन इसका एक जीवंत उदाहरण हैं। डेटा एकत्र करने के लिए मैं रैमडिस्क पर स्थानीय स्तर पर एक अस्थायी फ़ाइल के लिए / proc / stat का एक स्नैपशॉट करता हूं और फिर मैं उस फ़ाइल को हर 1 मिनट में डेटा एकत्र करने के लिए पार्स करता हूं।

मैं डेटा को कैसे पार्स करूं (बैश स्क्रिप्ट का टुकड़ा):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

के बाद आप डेटाबेस में डेटा मिलता है आप ग्राफ और आकाश कर सकते हैं सीमा है :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


आप डेटा को पार्स कैसे करते हैं?
इविविट

@ewwhite -> मैंने अपने उत्तर को यह दिखाने के लिए संपादित किया कि मैं डेटा को कैसे पार्स करता हूं।
बार्टोलोमिएज ज़र्ज़ेकी

सुंदर रेखांकन! : अपने लापता स्तंभ एनोटेशन के बारे में askubuntu.com/a/120961/451886 । यदि यह VM में चल रहा है, तो शायद यह "चोरी" काउंटर है।
रेकजेरर

Rrdtool और ramdisk के लिए +1!
shadi

4

यदि आप ऑनलाइनर चाहते हैं तो यह इस तरह दिख सकता है:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

परिणाम: 97.17000000000000000000

यह काम किस प्रकार करता है:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

पैदा करता है ( 1055057784 - 1055058055 )/100तो इस लाइन ई.पू. के लिए खाते हैं। कुछ पसंद होगा -7.84000000000000000000, तो बस इसे लपेटो 100-$(value)और फिर से ई.पू.

वहाँ: sleep #- 1 सेकंड की देरी, यदि आप इस मान को बदलते हैं, तो मध्यवर्ती परिणाम को सेकंड की संख्या में विभाजित किया जाना चाहिए। $5- 5 वीं फील्ड, man procऔर http://www.linuxhowtos.org/System/procstat.htm के अनुसार

कृपया मुझे बताएं कि क्या यह आपके लिए काम नहीं करता है।


0

या अगर आप अभी जागने के बाद सिर्फ दो अंकों से खुश हैं तो यह सब बहुत सरल और अधिक पठनीय हो सकता है:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.