यह एक प्रश्न है जिसे कई बार पूछा गया है, हालांकि मुझे कोई अच्छा समर्थन नहीं मिला है।लिनक्स में प्रतिशत में दिए गए CPU उपयोग की सटीक गणना?
कई लोग शीर्ष आदेश का उपयोग करने का सुझाव देते हैं, लेकिन यदि आप एक बार शीर्ष पर दौड़ते हैं (क्योंकि आपके पास प्रत्येक 1 सेकंड में सीपीयू उपयोग एकत्र करने के लिए एक स्क्रिप्ट है) तो यह हमेशा एक ही सीपीयू उपयोग परिणाम (example 1, example 2) प्रदान करेगा।
CPU उपयोग गणना करने के लिए एक अधिक सटीक तरीका, /proc/stat
से मूल्यों को पढ़ने के द्वारा होता है, लेकिन उत्तर के सबसे केवल /proc/stat
से पहले 4 क्षेत्रों में यह (एक उदाहरण here) की गणना करने का उपयोग करें।
/proc/stat/
में 10 फ़ील्ड प्रति सीपीयू कोर लिनक्स कर्नेल 2.6.33 के रूप में है!
मुझे यह भी Accurately Calculating CPU Utilization in Linux using /proc/stat प्रश्न मिला जो एक ही मुद्दे को इंगित कर रहा है, लेकिन अधिकांश अन्य प्रश्न केवल कई क्षेत्रों में से 4 को ध्यान में रखते हैं- लेकिन फिर भी यहां दिया गया उत्तर "मुझे लगता है" (निश्चित नहीं) से शुरू होता है , और इसके अलावा, यह केवल पहले 7 फ़ील्ड (/proc/stat/
में 10 में से) के बारे में चिंतित है)
This perl स्क्रिप्ट सीपीयू उपयोग की गणना करने के लिए सभी क्षेत्रों का उपयोग करता है, जो मुझे लगता है कि कुछ और के बाद सही नहीं है जाँच पड़ताल।
कर्नेल कोड here में शीघ्रता से अवलोकन करने के बाद, ऐसा लगता है, जैसे उदाहरण के लिए, guest_nice
और guest fields
हमेशा एक साथ nice
और user
साथ (ताकि वे CPU उपयोग गणना में शामिल नहीं किया जाना चाहिए बढ़ रही हैं, क्योंकि वे शामिल किए गए हैं पहले से ही nice
और user
क्षेत्रों)
/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update
* @cputime_scaled: cputime scaled by cpu frequency
*/
static void account_guest_time(struct task_struct *p, cputime_t cputime,
cputime_t cputime_scaled)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;
/* Add guest time to process. */
p->utime += cputime;
p->utimescaled += cputime_scaled;
account_group_user_time(p, cputime);
p->gtime += cputime;
/* Add guest time to cpustat. */
if (task_nice(p) > 0) {
cpustat[CPUTIME_NICE] += (__force u64) cputime;
cpustat[CPUTIME_GUEST_NICE] += (__force u64) cputime;
} else {
cpustat[CPUTIME_USER] += (__force u64) cputime;
cpustat[CPUTIME_GUEST] += (__force u64) cputime;
}
}
में तो योग करने के लिए, लिनक्स में CPU उपयोग गणना करने के लिए एक सटीक तरीका है क्या और खेतों जो गणना और कैसे में विचार किया जाना चाहिए (जो खेतों निष्क्रिय करने के लिए जिम्मेदार ठहराया जाता है समय और कौन सा क्षेत्र गैर-निष्क्रिय समय के लिए)?
सही तरीके से CPU उपयोग जानकारी हर दूसरे 'शीर्ष चलाने के लिए -b' लगातार है इकट्ठा करने के लिए। –
मैं किसी तृतीय पक्ष स्क्रिप्ट का उपयोग करके डेटा एकत्र करना चाहता हूं और सीपीयू केवल मेट्रिक्स में से एक है जिसे एकत्रित करने की आवश्यकता है। इसलिए मैं इस तीसरे पक्ष की स्क्रिप्ट के पिछले रन (अंतराल भिन्न हो सकता है) के बाद से CPU उपयोग की गणना करना चाहता हूं। 'टॉप-बी' लगातार चलता है, इसलिए इसे एक अलग थ्रेड में चलाया जाता है और एकत्रित डेटा को एक अलग आउटपुट में सहेजना पड़ता है। –
क्या सीपीयू उपयोग की तलाश है? एक प्रक्रिया? प्रणाली विस्तृत? इसे प्रतिशत, सेकंड, ... के रूप में व्यक्त किया जाना चाहिए? – wallyk