प्रति सीपीयू समय - प्रति उपयोगकर्ता की निगरानी का सबसे उचित तरीका क्या है?


25

एक बहु उपयोगकर्ता प्रणाली पर, मैं cpu समय के सेकंड में प्रत्येक उपयोगकर्ता के CPU उपयोग को मापना चाहता हूं। इस माप के उद्देश्य के लिए, मैं यह मानता हूं कि यदि कोई PID किसी उपयोगकर्ता का है, तो यह उपयोगकर्ता CPU समय का कारण बन रहा है - अर्थात मैं डेमॉन और कर्नेल को अनदेखा कर रहा हूं।

वर्तमान में मैं यह कर रहा हूँ, हर पाँच सेकंड:

  1. प्रत्येक उपयोगकर्ता और उनके द्वारा चलाए जा रहे पीआईडी ​​प्राप्त करें ps aux
  2. प्रत्येक PID के लिए, से x, उपयोग, कटौती, स्टाइम और cstime का योग/proc/[pid]/stat
  3. गणना t = x / interval(अंतराल हमेशा उच्च लोड होने पर 5 सेकंड नहीं होता है)

यदि मैं इसे चलाता हूं, तो मुझे समझदार दिखने वाले मूल्य मिलते हैं। उदाहरण के लिए: इस सिस्टम पर एक उपयोगकर्ता अजगर ( while True: pass) में घूम रहा था , और सिस्टम 750 मिली सेकेंड के सीपीयू समय प्रति सेकंड के आसपास गोल दिखा रहा था। जब सिस्टम थोड़ा सा लटका, तो उसने 1 सेकंड के एक सेकंड के लिए 1600 ग्राम की सूचना दी। जो सही के बारे में लगता है, लेकिन मैं यह कहता हूं कि ये मूल्य धोखेबाज हो सकते हैं, विशेष रूप से मुझे वास्तव में उन्हें समझ में नहीं आता है।

तो मेरा सवाल ये है:

प्रति उपयोगकर्ता के आधार पर सीपीयू लोड को मापने का एक उचित और सही तरीका क्या है?

विधि बल्कि सटीक होना चाहिए। इस प्रणाली पर कई सैकड़ों उपयोगकर्ता हो सकते हैं, इसलिए इससे प्रतिशत निकालना ps auxपर्याप्त सटीक नहीं होगा, खासकर अल्पकालिक धागे के लिए जो सॉफ्टवेयर के कई टुकड़े स्पॉन को पसंद करते हैं।

हालांकि यह जटिल हो सकता है, मुझे पता है कि यह संभव है। यह मेरा शुरुआती बिंदु था:

कर्नेल एक प्रक्रिया निर्माण समय के साथ-साथ सीपीयू समय का भी ध्यान रखता है जो वह अपने जीवनकाल में खाता है। प्रत्येक घड़ी टिक, कर्नेल समय की राशि को अद्यतन करता है जो कि वर्तमान प्रक्रिया ने सिस्टम और उपयोगकर्ता मोड में खर्च किया है। - ( लिनक्स डॉक्यूमेंटेशन प्रोजेक्ट से )

उसके बाद जो मूल्य है, वह सेकंड (या jiffies) की राशि है जो एक उपयोगकर्ता ने सीपीयू पर खर्च किया है, सिस्टम लोड या सीपीयू उपयोग का प्रतिशत नहीं।

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


1
500 प्रतिष्ठा: beginers के लिए ओ अच्छा मौका है
Tachyons

मेरे लीग से थोड़ा बाहर, लेकिन एक बहुत ही दिलचस्प सवाल इसलिए मैंने थोड़ा सा खोदा और कुछ ऐसा पाया जिसकी मुझे उम्मीद है कि इसे हल करने में आपकी मदद करने के लिए कम से कम उपयोगी है: stackoverflow.com/a/1424556/905573
Kingmilo

1
क्या आप जानते topहैं कि बैच मोड क्या कर सकता है? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'उस पल में {user} के लिए लोड दिखाना चाहिए।
रिनविंड

जवाबों:


11

लगता है जैसे आपको प्रक्रिया लेखांकन की आवश्यकता है।

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

उबंटू में, प्रक्रिया लेखांकन उपकरण acctपैकेज में हैं एक्ट स्थापित करें

प्रति-उपयोगकर्ता रिपोर्ट प्राप्त करने के लिए, चलाएं

sa -m

दुर्भाग्य से, यह मेरे लिए काम नहीं करेगा क्योंकि "सा" लंबी-चलने वाली प्रक्रियाओं की गिनती नहीं करेगा। मुझे जो कुछ भी चाहिए (मुझे लगता है) शुरू करने और समाप्त होने वाली प्रक्रियाओं का पता लगाने और उन्हें छोड़ने के समय उनके सीपीयू समय को रिकॉर्ड करने का एक तरीका है, साथ ही साथ वे चल रहे हैं।
Stefano Palazzo

@StefanoPalazzo मेरा मानना ​​है कि यह आपको मिलेगा सबसे अच्छा है। से चलने वाली प्रक्रियाओं के लिए इसे समय के साथ संवर्धित करें /proc/[pid]/stat
ændrük

जैसा कि यह पता चला है, ऐसा लगता है कि अधिकांश सभी प्रक्रियाओं को sa(.ps.gz) द्वारा ठीक से हिसाब दिया जाएगा । और मेरे पास उन लंबी चलने वाली प्रक्रियाओं को "अनुमान" करने का भी एक अच्छा तरीका है, इससे पहले कि उन लोगों के लिए भी एक सटीक मूल्य मिल जाए। तो हम इसे सब के बाद उपयोग करेंगे, और मैं आपके उत्तर के लिए इनाम देने के लिए अधिक खुश हूं। बहुत बहुत धन्यवाद!
Stefano Palazzo

3

यह प्रत्येक उपयोगकर्ता को उपयोगकर्ता नाम और उनके कुल सीपीयू समय के लिए एक पंक्ति देगा:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

अधिक स्पष्ट उत्तरों में से एक यह है कि अभी जो आप अभी कर रहे हैं, उसका विस्तार करें।

मैं उपयोगकर्ताओं के सीपीयू समय को ट्रैक करने के लिए बैश स्क्रिप्टिंग और mysql का उपयोग करने के लिए इस मॉनीटर प्रक्रिया में आया था, लेकिन जितना आप के बारे में बात कर रहे थे उससे कहीं अधिक बड़े समय सीमा में इसे प्रतिबंधित किया गया था।

उम्मीद है कि यह आपको उस दिशा के बारे में कुछ और विचार दे सकता है, जिसमें आप सिर की ओर देख रहे हैं।

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm


0

यह उन प्रक्रियाओं को भी संभालेगा जो दिनों से चल रही हैं। सुनिश्चित करें कि हफ्तों / महीनों / वर्षों तक विस्तार कैसे करें।

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.