2012-01-11 14 views
5

में मल्टीप्रोसेस अनुप्रयोग के सीपीयू उपयोग की गणना कैसे करें मैं लिनक्स में शीर्ष कमांड की तरह व्यवहार करने के लिए सी/सी ++ के साथ प्रोग्राम बनाने का प्रयास करता हूं। मैंने कुछ शोध किया है और पहले ही ज्ञात है कि प्रक्रिया के CPU उपयोग को कैसे गिनना है। हम मौजूदा समय में/proc/[PID]/stat से stime + utime की गणना करके और कई सेकंड के बाद CPU उपयोग प्राप्त कर सकते हैं। फिर स्टेम + यूटिम मतभेदों की गणना करें और परिणाम को अपटाइम मतभेदों के साथ विभाजित करें, फिर हमें CPU उपयोग प्रतिशत प्राप्त होता है। यह एकल प्रक्रिया/बहुप्रचार प्रक्रिया पर इतना आसान होगा।लिनक्स

समस्या httpd जैसे मामले में है, जहां यह multiprocess के रूप में काम करता है। जब वेबसर्वर व्यस्त होता है, httpd अनुरोधों के समूह की सेवा करने के लिए बाल प्रक्रियाओं को फोर्क करेगा। फिर मैं कुल प्रक्रिया की संख्या गिनता हूं, आइए 500 कहें। मैं उन प्रक्रियाओं के सीपीयू उपयोग की गणना करना चाहता हूं, लेकिन उन्हें सारांशित करता हूं इसलिए मुझे केवल 1 httpd CPU उपयोग दिखाई देता है। लेकिन अगर मैं उपरोक्त वर्णित एल्गोरिदम करता हूं, तो कई सेकंड के बाद प्रक्रियाओं की संख्या < 500 में घट जाती है, तो मुझे नकारात्मक मान मिलते हैं, क्योंकि गणना इस तरह होगी (उदाहरण के लिए, मैं यादृच्छिक संख्या चुनता हूं, बस , STIME + Utime के डेल्टा नकारात्मक मूल्य में परिणाम है, प्रक्रिया की संख्या के बाद से कम हो रही है कि आप ऊपर के उदाहरण देखें, तो

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874 
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874 

, और कुछ मिलीसेकंड के बाद कम मूल्य दे: आप संक्षिप्त विवरण दें)। मैं बस जानना चाहता हूं, क्या इस तरह की प्रक्रिया की गणना करने का कोई और तरीका इस तरह व्यवहार करता है? धन्यवाद।

+0

आप प्रक्रियाओं के सेट को कैसे जानते हैं? इसके प्रक्रिया समूह द्वारा? कार्यक्रम के नाम से? –

+0

सबसे पहले, मुझे मुख्य अभिभावक प्रक्रिया मिलती है। मुझे पता है क्योंकि इसमें पीपीआईडी ​​1 है और चलिए इसकी पिड 1227 कहें। फिर, पूरी/proc/निर्देशिका खोजें, जिसमें पीपीआईडी ​​1227 है। अगर/proc/pid1/stat में ppid 1227 है, तो मैं इसके utime और stime को जोड़ता हूं 1227 यूटिम और स्टेम। –

उत्तर

1

मैं प्रत्येक प्रक्रिया के लिए अलग-अलग डेटा रखने का सुझाव देता हूं।
जब आपके पास नया नमूना होता है, तो प्रत्येक प्रक्रिया तीन श्रेणियों में से एक में हो सकती है:
1. पहले से और बाद में मौजूद - नए से पुराने घटाना।
2. अभी मौजूद है, लेकिन पहले नहीं - बस नए मान लें।
3. पहले मौजूद, लेकिन अभी नहीं - इसे अनदेखा करें। आप यहां कुछ खो रहे हैं, क्योंकि यह आपके नमूना अवधि के 90% के दौरान सीपीयू का उपयोग कर सकता है, लेकिन मुझे उम्मीद है कि आपको सही सटीकता की आवश्यकता नहीं है।

यह आपको नमूने के बीच अधिक डेटा रखता है, और अधिक जटिल डेटा संरचना का उपयोग करने की आवश्यकता है, लेकिन इसे उचित परिणाम देना चाहिए।

+0

हाँ, मुझे लगता है कि समस्या हल हो जाएगी, लेकिन कुछ जटिल काम की लागत है। मैं शीर्ष 200 पीआईडी ​​रखने की कोशिश करूंगा जो काफी लंबे समय तक मौजूद है, और जब तक कोई 0 न हो जाए और उसे नवागंतुक के साथ प्रतिस्थापित न करें तब तक उन्हें घटाएं। घटाव तब एक कंटेनर में जोड़ा जाएगा, जिसे नवागंतुक के साथ मिश्रित किया जाएगा। मुझे लगता है कि मुझे वह कोशिश करनी चाहिए। धन्यवाद। –

0

यदि आपको सटीक परिणाम की आवश्यकता है या यदि प्रक्रियाओं का जीवनकाल छोटा है, तो आपको इसे समाप्त होने पर प्रक्रिया के समय का उपयोग पढ़ना होगा।

1) wait4(2) या wait3(2) कार्यों का प्रयोग करें प्रक्रिया समाप्ति प्रतीक्षा करने के लिए:

कम से कम दो तरीके है। वे कार्य प्रक्रिया के उपयोग और समय को वापस कर देंगे।

2) /prox/<pid>/stat पढ़ने तक ज़ोंबी राज्य में प्रक्रिया समाप्त कर दें।