2010-12-15 13 views
5

द्वारा यूनिक्स में एक ही प्रक्रिया द्वारा सीपीयू प्रतिशत की गणना, मैं जानना चाहता हूं कि "शीर्ष" कमांड किसी भी प्रक्रिया द्वारा उपयोग किए गए सीपीयू प्रतिशत की गणना कैसे करता है।"शीर्ष" कमांड

मैंने/proc निर्देशिका में "psinfo" बाइनरी फ़ाइल पढ़ने का प्रयास किया है, लेकिन यह परिणाम खोजने में मदद नहीं करता है।

कृपया कोई जानकारी दें कि यह कैसे किया जा सकता है।

अग्रिम धन्यवाद।

+1

डुप्लिकेट नहीं बल्कि संबंधित - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder

उत्तर

9

top कमांड proc file system में डेटा का उपयोग कर CPU उपयोग की गणना करता है। सीपीयू उपयोग डेटा वाली वास्तविक फ़ाइल एक प्लेटफ़ॉर्म से दूसरे प्लेटफ़ॉर्म में भिन्न हो सकती है। उदाहरण के लिए, लिनक्स में यह /proc/<pid>/stat में पाया जाता है और सोलारिस के लिए यह /proc/<pid>/psinfo में पाया जाता है। CPU उपयोग को संचयी CPU समय में भिन्नता के रूप में गणना की जाती है जो अद्यतनों के बीच मापा गया समय की मात्रा से विभाजित होती है।


लिनक्स के लिए, आप procps स्रोत है जो ps, top शामिल है, और http://procps.sourceforge.net से अन्य प्रक्रिया उपकरण निरीक्षण कर सकते हैं। विशेष रूप से readproc.c फ़ाइल में डेटा पुनर्प्राप्त करने की कार्यक्षमता शामिल है।


सोलारिस के लिए, आप https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproc से libproc स्रोत निरीक्षण कर सकते हैं। prog_get_info.c फ़ाइल में डेटा पुनर्प्राप्त करने और इसे psinfo_t संरचना में संग्रहीत करने की कार्यक्षमता शामिल है।


लिनक्स, सोलारिस, और दूसरों के लिए, आप http://sourceforge.net/projects/unixtop से Unix Top स्रोत निरीक्षण कर सकते हैं। machine निर्देशिका में प्लेटफ़ॉर्म-विशिष्ट स्रोत फ़ाइलों में डेटा पुनर्प्राप्त करने की कार्यक्षमता शामिल है।


अद्यतन

एक प्रक्रिया के लिए CPU समय पुन: प्राप्त करने के लिए एक और विकल्प (सोलारिस केवल) ioctl() सिस्टम कॉल करने के लिए PIOCPSINFO या PIOCSTATUS विकल्प के लिए गुजर जा सकता है। PIOCPSINFO विकल्प prpsinfo_t संरचना में विविध प्रक्रिया जानकारी देता है। PIOCSTATUS विकल्प prstatus_t संरचना में प्रक्रिया के लिए स्थिति की स्थिति देता है।

http://getthegood.com/TechNotes/Papers/ProcStatistics.html में उदाहरण कोड से अनुकूलित:

int main(int argc, char* argv[]) 
{ 
    int fd; 
    prpsinfo_t info; 
    prstatus_t status; 
    char procbuf[50]; 

    sprintf(procbuf, "/proc/%d", getpid()); 
    fd = open(procbuf, O_RDONLY); 

    ioctl(fd, PIOCPSINFO, &info); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Reaped children user+sys time = %ld sec %ld nsec\n", 
      info.pr_time.tv_sec, info.pr_time.tv_nsec, 
      info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec); 

    ioctl(fd, PIOCSTATUS, &status); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Sum of children's user+sys time = %ld sec %ld nsec\n", 
      status.pr_utime.tv_sec+status.pr_stime.tv_sec, 
      status.pr_utime.tv_nsec+status.pr_stime.tv_nsec, 
      status.pr_cutime.tv_sec+status.pr_cstime.tv_sec, 
      status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec); 

    close(fd); 
    exit(0); 
} 

नोट: यह कोड अपरीक्षित है और सादगी के लिए जाँच त्रुटि अस्वीकार करते हैं।

+0

इनपुट के लिए धन्यवाद। मैं आपके द्वारा दिए गए सभी विकल्पों की जांच कर रहा हूं, हालांकि psinfo ने पहले भी मेरे लिए काम नहीं किया था। – Arunmu

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