2011-03-16 11 views
7

फ्रीबीएसडी पर सी में, सीपीयू उपयोग को कैसे एक्सेस करता है?सी से सिस्टम कॉल का उपयोग करके, मैं सीपीयू का उपयोग कैसे प्राप्त करूं?

मैं HTTP रीडायरेक्ट को संभालने के लिए कुछ कोड लिख रहा हूं। यदि सीपीयू लोड एक FReeBSD सिस्टम पर थ्रेसहोल्ड से ऊपर चला जाता है, तो मैं क्लाइंट अनुरोधों को पुनर्निर्देशित करना चाहता हूं। मैन पेजों को देखकर, kvm_getpcpu() सही जवाब प्रतीत होता है, लेकिन मैन पेज (जो मैंने पढ़ा है) उपयोग को दस्तावेज नहीं करता है।

कोई सुझाव या पॉइंटर्स का स्वागत होगा - धन्यवाद!


यहां जवाब पढ़ने के बाद, मैं नीचे के साथ आने में सक्षम था। खराब दस्तावेज के कारण, मुझे 100% यकीन नहीं है कि यह सही है, लेकिन शीर्ष सहमत है। प्रत्येक उत्तर देने वाले का धन्यवाद।

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/sysctl.h> 
#include <unistd.h> 

#define CP_USER 0 
#define CP_NICE 1 
#define CP_SYS 2 
#define CP_INTR 3 
#define CP_IDLE 4 
#define CPUSTATES 5 

int main() 
{ 
     long cur[CPUSTATES], last[CPUSTATES]; 
     size_t cur_sz = sizeof cur; 
     int state, i; 
     long sum; 
     double util; 

     memset(last, 0, sizeof last); 

     for (i=0; i<6; i++) 
     { 
       if (sysctlbyname("kern.cp_time", &cur, &cur_sz, NULL, 0) < 0) 
       { 
         printf ("Error reading kern.cp_times sysctl\n"); 
         return -1; 
       } 

       sum = 0; 
       for (state = 0; state<CPUSTATES; state++) 
       { 
         long tmp = cur[state]; 
         cur[state] -= last[state]; 
         last[state] = tmp; 
         sum += cur[state]; 
       } 

       util = 100.0L - (100.0L * cur[CP_IDLE]/(sum ? (double) sum : 1.0L)); 
       printf("cpu utilization: %7.3f\n", util); 
       sleep(1); 
     } 

     return 0; 
} 

उत्तर

4
आदमी पृष्ठों

नाम

kvm_getmaxcpu, kvm_getpcpu से

- पहुँच प्रति-सीपीयू डेटा

लाइब्रेरी

कर्नेल डेटा एक्सेस लाइब्रेरी (libkvm, -lkvm)

SYNOPSIS

#include <sys/param.h> 
#include <sys/pcpu.h> 
#include <sys/sysctl.h> 
#include <kvm.h> 

int 
kvm_getmaxcpu(kvm_t *kd); 

void * 
kvm_getpcpu(kvm_t *kd, int cpu); 

वर्णन

kvm_getmaxcpu() और kvm_getpcpu() फ़ंक्शन गिरी केडी ने संकेत में सक्रिय प्रोसेसर की प्रति-सीपीयू डेटा का उपयोग किया जाता है। kvm_getmaxcpu() फ़ंक्शन कर्नेल की अधिकतम संख्या कर्नेल द्वारा समर्थित करता है। Kvm_getpcpu() फ़ंक्शन एक बफर को प्रति -एक सीपीयू डेटा के लिए एक सीपीयू डेटा देता है। इस बफर को स्ट्रक्चर pcpu प्रकार द्वारा वर्णित किया गया है। कॉलर पर कॉल के माध्यम से बफर को मुक्त करने के लिए ज़िम्मेदार है (3) जब इसकी आवश्यकता नहीं है। यदि सीपीयू सक्रिय नहीं है, तो NULL इसके बदले में लौटाया गया है।

कैशिंग

इन कार्यों विभिन्न कर्नेल चर जो लगातार कॉल में पुन: उपयोग कर रहे हैं के लिए nlist मूल्यों कैश। आप इस कैश को साफ़ करने के लिए एनडीएल के लिए केडी सेट के साथ फ़ंक्शन को कॉल कर सकते हैं।

वापसी मान

सफलता पर, kvm_getmaxcpu() फ़ंक्शन गिरी द्वारा समर्थित CPU की अधिकतम संख्या देता है। यदि कोई त्रुटि उत्पन्न होती है, तो यह इसके बदले -1 देता है।

सफलता पर, kvm_getpcpu() फ़ंक्शन आवंटित बफर या NULL को पॉइंटर देता है। यदि कोई त्रुटि उत्पन्न होती है, तो यह इसके बदले -1 देता है।

या तो समारोह एक त्रुटि का सामना करना पड़ता है, तो एक त्रुटि संदेश kvm_geterr के ज़रिये पुनः प्राप्त हो सकता है


संपादित

यहाँ kvm_t struct है (3।):

struct __kvm { 
    /* 
    * a string to be prepended to error messages 
    * provided for compatibility with sun's interface 
    * if this value is null, errors are saved in errbuf[] 
    */ 
    const char *program; 
    char *errp;   /* XXX this can probably go away */ 
    char errbuf[_POSIX2_LINE_MAX]; 
    #define ISALIVE(kd) ((kd)->vmfd >= 0) 
    int  pmfd;   /* physical memory file (or crashdump) */ 
    int  vmfd;   /* virtual memory file (-1 if crashdump) */ 
    int  unused;   /* was: swap file (e.g., /dev/drum) */ 
    int  nlfd;   /* namelist file (e.g., /kernel) */ 
    struct kinfo_proc *procbase; 
    char *argspc;   /* (dynamic) storage for argv strings */ 
    int  arglen;   /* length of the above */ 
    char **argv;   /* (dynamic) storage for argv pointers */ 
    int  argc;   /* length of above (not actual # present) */ 
    char *argbuf;  /* (dynamic) temporary storage */ 
    /* 
    * Kernel virtual address translation state. This only gets filled 
    * in for dead kernels; otherwise, the running kernel (i.e. kmem) 
    * will do the translations for us. It could be big, so we 
    * only allocate it if necessary. 
    */ 
    struct vmstate *vmst; 
}; 
0

मुझे सटीक लाइब्रेरी, कमांड या सिस्टम कॉल नहीं पता है; हालांकि, अगर आप वास्तव में अटक जाते हैं, तो स्रोत कोड को शीर्ष पर डाउनलोड करें। जब आप "-P" ध्वज का उपयोग करते हैं तो यह प्रति-सीपीयू आंकड़े प्रदर्शित करता है, और इसे कहीं से उस जानकारी को प्राप्त करना होगा।

1

मुझे विश्वास है कि आप 'मैन sysctl' में देखना चाहते हैं।

+0

धन्यवाद - यह बहुत उपयोगी था! –

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

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