2009-11-02 7 views
8

में प्रति प्रक्रिया प्रोग्रामेटिक संसाधन निगरानी, ​​मैं जानना चाहता हूं कि लिनक्स में प्रक्रिया संसाधन खपत (सीपीयू, मेमोरी, नेटवर्क बैंडविड्थ) की निगरानी करने के लिए कोई कुशल समाधान है या नहीं। मैं सी ++ में एक डिमन लिखना चाहता हूं जो कुछ दिए गए पीआईडी ​​के लिए यह निगरानी करता है। जो मुझे पता है, क्लासिक समाधान समय-समय पर जानकारी को/proc से पढ़ना है, लेकिन यह सबसे प्रभावी तरीका प्रतीत नहीं होता है (इसमें कई सिस्टम कॉल शामिल हैं)। उदाहरण के लिए 50 प्रक्रियाओं के लिए हर सेकेंड मेमोरी उपयोग की निगरानी करने के लिए, मुझे 50 फाइलों को खोलना, पढ़ना और बंद करना है (जिसका अर्थ है 150 सिस्टम कॉल) प्रत्येक सेकेंड/proc से। इन फ़ाइलों को पढ़ने के दौरान शामिल पार्सिंग का जिक्र नहीं करना चाहिए।लिनक्स

नेटवर्क बैंडविड्थ खपत एक और समस्या है: इसे प्रत्येक प्रक्रिया के लिए आसानी से गणना नहीं की जा सकती है जिसे मैं मॉनीटर करना चाहता हूं। नेटहोग्स द्वारा अपनाए गए समाधान में मेरी राय में एक बहुत ऊंचा ओवरहेड शामिल है: यह libpcap का उपयोग करके प्रत्येक पैकेट को कैप्चर और विश्लेषण करता है, फिर प्रत्येक पैकेट के लिए स्थानीय पोर्ट निर्धारित होता है और इसी प्रक्रिया को खोजने के लिए/proc में खोजा जाता है।

क्या आप जानते हैं कि इन विधियों के लिए अधिक कुशल विकल्प हैं या इस समस्या से निपटने वाले किसी भी पुस्तकालय?

उत्तर

5

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstats प्रति-कार्य और प्रति-प्रक्रिया आँकड़े गिरी से यूज़रस्पेस लिए भेजने के लिए एक नेटलिंक आधारित अंतरफलक है।

Taskstats निम्नलिखित लाभ के लिए डिजाइन किया गया था:

  • कुशलता से एक काम के जीवनकाल के दौरान और उसके बाहर निकलने पर कई लेखांकन उप भावी लेखांकन पैच
  • द्वारा उपयोग के लिए
  • तानाना के लिए
  • एकीकृत इंटरफेस आंकड़े उपलब्ध कराते हैं

यह इंटरफ़ेस आपको सीपीयू, मेमोरी और आई/ओ उपयोग की निगरानी करने देता है आपके चयन की प्रक्रियाएं। आपको केवल एक सॉकेट पर संदेश सेट अप और प्राप्त करने की आवश्यकता है।

यह डिस्क I/O बनाम नेटवर्क I/O को अलग नहीं करता है (उदाहरण के लिए)। यदि यह आपके लिए महत्वपूर्ण है, तो आप LD_PRELOAD इंटरसेप्शन लाइब्रेरी के साथ जा सकते हैं जो सॉकेट ऑपरेशंस को ट्रैक करता है। यह मानते हुए कि आप उन कार्यक्रमों के स्टार्टअप को नियंत्रित कर सकते हैं जिन्हें आप देखना चाहते हैं और वे निश्चित रूप से आपकी पीठ के पीछे चालबाजी नहीं करेंगे।

यदि वे अभी भी असफल होते हैं तो मैं किसी भी हल्के वजन समाधान के बारे में नहीं सोच सकता, लेकिन linux-audit विश्व स्तर पर सिस्कोल का पता लगा सकता है, जो आपके नेटवर्क यातायात का पुन: कब्जा करने और विश्लेषण करने से थोड़ा अधिक प्रत्यक्ष लगता है।

+0

टास्कस्टैट में केवल डिस्क I/O है, नेट और डिस्क दोनों नहीं – tuxx

+0

सुधार: टास्कस्टैट केवल पढ़ने/लिखने के सिस्कोल पर नज़र रखता है, और recv/send और friends नहीं (लेकिन यह कर्नेल के अंदर आसानी से संशोधित किया जा सकता है)। फिर भी धन्यवाद। यह अब तक का सबसे अच्छा समाधान प्रतीत होता है। – tuxx

2

लिनक्स ट्रेस टूलकिट (एलटीटीएनजी) पर एक नज़र डालें। यह कर्नेल में ट्रेसपॉइंट्स डालता है और आपके द्वारा पूछे जा रहे कुछ प्रकार के आंकड़े प्राप्त करने के लिए कुछ पोस्ट प्रोसेसिंग है। यदि आप सबकुछ कैप्चर करते हैं तो ट्रेस फाइलें बड़ी होती हैं, लेकिन यदि आप अपने द्वारा आयोजित घटनाओं के प्रकारों को सीमित करते हैं तो आप चीज़ों को व्यवस्थित रख सकते हैं।

अधिक जानकारी के लिए http://lttng.org ...

2

नेटवर्क बैंडविड्थ के बारे में: This Superuser answer का वर्णन करता है प्रसंस्करण/proc/net/टीसीपी नेटवर्क बैंडविड्थ उपयोग लेने के लिए।

मुझे पता है कि iptables का उपयोग नेटवर्क एकाउंटिंग करने के लिए किया जा सकता है (देखें, उदा।, LWN's, Linux.com's, या Shorewall's लेख), लेकिन मुझे प्रति-प्रक्रिया के आधार पर लेखांकन करने का कोई व्यावहारिक तरीका नहीं दिख रहा है।

0

पढ़ना/proc अंततः कर्नेल में कोड को इंजेक्शन दिए बिना व्यक्तिगत प्रक्रियाओं द्वारा सीपीयू और मेमोरी उपयोग की निगरानी करने का एकमात्र तरीका है। यदि आप शीर्ष (1) देखते हैं, तो आप देखेंगे कि/proc में बहुत सी फाइलें ठीक हैं जो यह हर सेकेंड में करती है। इस प्रकार की जानकारी को पुनः प्राप्त करने वाले सभी उपयोगकर्ता-मोड टूल और पुस्तकालयों को इसे/proc से प्राप्त करना होगा।

नेटवर्क बैंडविड्थ उपयोग के साथ, कई दृष्टिकोण हैं, जो सभी नेटवर्क यातायात को बॉक्स में और बाहर कैप्चर करने के लिए उबालते हैं। आप एक विशेष नेटफिल्टर (आईपीटीबल्स) मॉड्यूल लिखने पर भी विचार कर सकते हैं जो ट्रैफिक कैप्चरिंग के ऊपरी हिस्से के बिना आपको गिनती के प्रकार की आवश्यकता होती है।

0

मैं बस इस पर आया क्योंकि मैं एक ही चीज़ के उत्तर की तलाश में था। बस एक नोट - जब/proc फाइल सिस्टम का उपयोग करते समय, आपको प्रत्येक पढ़ने के बाद फ़ाइल को बंद करने की आवश्यकता नहीं होती है। आप फ़ाइल को खुले रख सकते हैं और प्रत्येक बार जब आप पढ़ते हैं तो आपको नए आंकड़े मिलेंगे ... इसलिए, जब भी आप आंकड़े प्राप्त करना चाहते हैं तो आपको खोलने और बंद करने का ओवरहेड नहीं होना चाहिए ... मेरे पास यह काम कर रहा है node.js पर जावास्क्रिप्ट अगर आप एक उदाहरण चाहते हैं ...