2011-04-01 15 views
14

का उपयोग कर लिनक्स में सीपीयू उपयोग की सटीक गणना करना/proc/stat में आंकड़ों का उपयोग करके सीपीयू उपयोग को कैसे प्राप्त करें इस पर कई पोस्ट और संदर्भ हैं। हालांकि, उनमें से अधिकतर लिनक्स 2.6 (iowait, irq, softirq) में मौजूद शेष जिफी सीपीयू गणनाओं को अनदेखा करते हुए, 7+ CPU आंकड़ों (उपयोगकर्ता, अच्छा, सिस्टम और निष्क्रिय) में से केवल चार का उपयोग करते हैं।/proc/stat

उदाहरण के तौर पर, Determining CPU utilization देखें।

मेरा प्रश्न यह है: क्या iowait/irq/softirq संख्याओं को पहले चार नंबरों (उपयोगकर्ता/अच्छा/सिस्टम/निष्क्रिय) में से एक में भी गिना जाता है? दूसरे शब्दों में, क्या कुल जिफी गणना पहले चार आंकड़ों के बराबर होती है? या, कुल 7 आंकड़ों के योग के बराबर कुल जिफी गणना है? यदि बाद में सच है, तो एक CPU उपयोग सूत्र संख्या के सभी को ध्यान में इस तरह लेना चाहिए,:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    long double a[7],b[7],loadavg; 
    FILE *fp; 

    for(;;) 
    { 
    fp = fopen("/proc/stat","r"); 
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]); 
    fclose(fp); 
    sleep(1); 
    fp = fopen("/proc/stat","r"); 
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3],&b[4],&b[5],&b[6]); 
    fclose(fp); 

    loadavg = ((b[0]+b[1]+b[2]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[4]+a[5]+a[6])) 
     /((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6])); 
    printf("The current CPU utilization is : %Lf\n",loadavg); 

    } 

    return(0); 
} 
+1

मैं इस प्रश्न के बारे में भी उत्सुक हूं। क्या आपको किसी अन्य स्रोत से उत्तर मिला? – justinzane

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/23376195/85696)। – danadam

उत्तर

9

मुझे लगता है कि iowait/आईआरक्यू/softirq पहले 4 संख्या में से एक में गिने जाते हैं।

(Linux kernel 4.1.1 के लिए)

2815 * Tick demultiplexing follows the order 
2816 * - pending hardirq update <-- this is irq 
2817 * - pending softirq update <-- this is softirq 
2818 * - user_time 
2819 * - idle_time   <-- iowait is included in here, discuss below 
2820 * - system time 
2821 * - check for guest_time 
2822 * - else account as system_time 

account_idle_time समारोह निष्क्रिय समय से निपटने के लिए, देखें:: आप और अधिक विस्तार के लिए कर्नेल कोड में irqtime_account_process_tick की टिप्पणी देख सकते हैं

2772 /* 
2773 * Account for idle time. 
2774 * @cputime: the cpu time spent in idle wait 
2775 */ 
2776 void account_idle_time(cputime_t cputime) 
2777 { 
2778   u64 *cpustat = kcpustat_this_cpu->cpustat; 
2779   struct rq *rq = this_rq(); 
2780 
2781   if (atomic_read(&rq->nr_iowait) > 0) 
2782     cpustat[CPUTIME_IOWAIT] += (__force u64) cputime; 
2783   else 
2784     cpustat[CPUTIME_IDLE] += (__force u64) cputime; 
2785 } 

cpu है निष्क्रिय और कुछ आईओ लंबित है, यह समय CPUTIME_IOWAIT में गिना जाएगा। अन्यथा, यह CPUTIME_IDLE में गिना जाता है।

निष्कर्ष निकालने के लिए, मुझे लगता है कि irq/softirq में jiffies को cpu के लिए "व्यस्त" के रूप में गिना जाना चाहिए क्योंकि यह वास्तव में कुछ आईआरक्यू या सॉफ्ट आईआरक्यू को संभालने वाला था। दूसरी तरफ, "iowait" में jiffies को cpu के लिए "निष्क्रिय" के रूप में गिना जाना चाहिए क्योंकि यह कुछ नहीं कर रहा था लेकिन लंबित आईओ होने का इंतजार कर रहा था।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^