एक बहु उपयोगकर्ता प्रणाली पर, मैं cpu समय के सेकंड में प्रत्येक उपयोगकर्ता के CPU उपयोग को मापना चाहता हूं। इस माप के उद्देश्य के लिए, मैं यह मानता हूं कि यदि कोई PID किसी उपयोगकर्ता का है, तो यह उपयोगकर्ता CPU समय का कारण बन रहा है - अर्थात मैं डेमॉन और कर्नेल को अनदेखा कर रहा हूं।
वर्तमान में मैं यह कर रहा हूँ, हर पाँच सेकंड:
- प्रत्येक उपयोगकर्ता और उनके द्वारा चलाए जा रहे पीआईडी प्राप्त करें
ps aux
- प्रत्येक PID के लिए, से
x
, उपयोग, कटौती, स्टाइम और cstime का योग/proc/[pid]/stat
- गणना
t = x / interval
(अंतराल हमेशा उच्च लोड होने पर 5 सेकंड नहीं होता है)
यदि मैं इसे चलाता हूं, तो मुझे समझदार दिखने वाले मूल्य मिलते हैं। उदाहरण के लिए: इस सिस्टम पर एक उपयोगकर्ता अजगर ( while True: pass
) में घूम रहा था , और सिस्टम 750 मिली सेकेंड के सीपीयू समय प्रति सेकंड के आसपास गोल दिखा रहा था। जब सिस्टम थोड़ा सा लटका, तो उसने 1 सेकंड के एक सेकंड के लिए 1600 ग्राम की सूचना दी। जो सही के बारे में लगता है, लेकिन मैं यह कहता हूं कि ये मूल्य धोखेबाज हो सकते हैं, विशेष रूप से मुझे वास्तव में उन्हें समझ में नहीं आता है।
तो मेरा सवाल ये है:
प्रति उपयोगकर्ता के आधार पर सीपीयू लोड को मापने का एक उचित और सही तरीका क्या है?
विधि बल्कि सटीक होना चाहिए। इस प्रणाली पर कई सैकड़ों उपयोगकर्ता हो सकते हैं, इसलिए इससे प्रतिशत निकालना ps aux
पर्याप्त सटीक नहीं होगा, खासकर अल्पकालिक धागे के लिए जो सॉफ्टवेयर के कई टुकड़े स्पॉन को पसंद करते हैं।
हालांकि यह जटिल हो सकता है, मुझे पता है कि यह संभव है। यह मेरा शुरुआती बिंदु था:
कर्नेल एक प्रक्रिया निर्माण समय के साथ-साथ सीपीयू समय का भी ध्यान रखता है जो वह अपने जीवनकाल में खाता है। प्रत्येक घड़ी टिक, कर्नेल समय की राशि को अद्यतन करता है जो कि वर्तमान प्रक्रिया ने सिस्टम और उपयोगकर्ता मोड में खर्च किया है। - ( लिनक्स डॉक्यूमेंटेशन प्रोजेक्ट से )
उसके बाद जो मूल्य है, वह सेकंड (या jiffies) की राशि है जो एक उपयोगकर्ता ने सीपीयू पर खर्च किया है, सिस्टम लोड या सीपीयू उपयोग का प्रतिशत नहीं।
यह महत्वपूर्ण है कि हम सीपीयू समय को मापें जबकि प्रक्रियाएं अभी भी चल रही हैं। कुछ प्रक्रियाएं केवल आधे सेकंड तक चलेगी, कुछ कई महीनों तक चलेगी - और हमें दोनों प्रकारों को पकड़ने की आवश्यकता है, ताकि हम उपयोगकर्ताओं के सीपीयू समय को बारीक रूप से देख सकें।
top
हैं कि बैच मोड क्या कर सकता है? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
उस पल में {user} के लिए लोड दिखाना चाहिए।