2009-05-13 17 views
6

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

उपकरण top की तरह सीमित उपयोग की हैं, क्योंकि वे सिर्फ बताओ कि कितना स्मृति एक कार्यक्रम की पता अंतरिक्ष में मैप किया गया है, और इसके बारे में कितना शारीरिक रैम का निवासी हो। इसी तरह, रिसाव डिटेक्टर केवल तभी बताएंगे जब स्मृति पहुंच योग्य नहीं है, अगर नहीं तो इसका उपयोग नहीं किया जा रहा है।

क्या कोई मौजूदा उपकरण है जो इस तरह से सक्रिय रूप से उपयोग/अप्रयुक्त स्मृति को ट्रैक कर सकता है? यदि संभव हो, तो मैं न केवल ढेर पर बल्कि ट्रैक संग्रहण कार्यक्रम/लाइब्रेरी कोड में भी ट्रैक ट्रैक करना चाहता हूं।


संपादित करें: मैं स्पष्ट करना चाहते हैं: मैं बहुत अधिक स्मृति एक कार्यक्रम वास्तव में, पढ़ता लिखते हैं, या एक निश्चित बिंदु के बाद निष्पादित करता है, जैसे कि, एक बार यह एक निश्चित अवस्था में पहुँचता है जानना चाहते हैं। जबकि पता स्थान में पृष्ठों की संख्या और निवासी पृष्ठों की संख्या महत्वपूर्ण माप हैं, यह वही नहीं है जो मैं ढूंढ रहा हूं।

मैं तीन तरीकों का पीछा कर रहा हूँ अभी:

  1. मैं एक पुस्तकालय है कि सभी स्मृति क्षेत्रों के संरक्षण बिट्स को साफ करता है/proc/self/नक्शे से पढ़ा (ढेर और अपने स्वयं के कोड को छोड़कर) में लिखा है 'mprotect` का उपयोग कर। इसमें एक सेगफॉल्ट हैंडलर है जो सुरक्षा बिट्स को पुनर्स्थापित करता है और काउंटर को बढ़ाता है। मैं इसे 'एलडी_PRELOAD` के साथ लोड करता हूं, और यह सिग्नल की प्राप्ति पर स्मृति पहुंच को ट्रैक करना शुरू करता है। इसने कुछ वास्तविक दोषों को प्रतीत होता है जो प्रतीत होता है कि वे फर्जी पतों (वे गलती के समय किसी भी रजिस्ट्रार या पास की मेमोरी में संग्रहीत नहीं हैं)।
  2. मैंने एक 'purge` प्रोग्राम लिखा है जो `mmap` का उपयोग करके स्मृति से आवंटित और पढ़ता है जब तक कि' mmap` त्रुटि देता है। यह उम्मीद है कि लक्षित प्रक्रिया से सभी पृष्ठों को मजबूर कर दिया जाएगा, जिन्हें 'शुद्ध' चल रहा है जबकि निलंबित कर दिया गया है। फिर मैं 'pidstat` का उपयोग करके लक्ष्य प्रक्रिया फिर से शुरू होने पर पेज-इन्स की संख्या गिनती हूं। ऐसा लगता है लेकिन यह एक बहुत ही बदमाश साधन है। यह पेजों को छुआ जाने के बारे में कोई जानकारी नहीं देता है।
  3. मुझे बताया गया है कि वालग्रिंड आपको प्लग-इन लिखने की अनुमति देता है जो कुछ घटनाओं पर कुछ क्रियाओं को निष्पादित करने का कारण बनता है, उदाहरण के लिए, स्मृति एक्सेस करता है। यह अब तक आशाजनक लग रहा है।
+0

डुप्लिकेट: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual मेमोरी-उपयोग के-एक-आवेदन या प्रक्रिया – lothar

उत्तर

2

वालग्रिंड टूल कैशग्रींड स्मृति उपयोग को ट्रैक करने का एक अच्छा काम करता है।

कुछ टूल्स भी हैं जो कैश्रिंड ग्राफिकल रूप से आउटपुट दिखाते हैं।

अद्यतन जानकारी का जवाब देने के लिए संपादित करें:
वालग्रिंड के उद्भव से पहले, मैंने mpatrol नामक एक प्रोजेक्ट का उपयोग किया।
यह पृष्ठों को केवल पढ़ने के लिए mprotect() का उपयोग करता है और
पृष्ठों तक पहुंच ट्रैक करता है। यह रिपोर्टिंग शुरू करने और रोकने के लिए निर्दिष्ट करता है,
एनएच मॉलोक के बाद, अन्य विनिर्देशों के बीच।

यह कई, या उन सभी सुविधाओं को कर सकता है जिन्हें आप ढूंढ रहे हैं।

एक चेतावनी है, यह ज्यादा valgrind की तुलना में धीमी है।

2

यह डेटा/proc/पिड/smaps में डेटा से लिया जा सकता है। यह प्रत्येक मैप किए गए क्षेत्र (स्टैक, टेक्स्ट/डेटा, और गुमनाम रूप से मैप किए गए क्षेत्रों सहित) के लिए आरएसएस मूल्य को तोड़ देता है, ताकि आप प्रत्येक लोड ऑब्जेक्ट के साथ-साथ स्टैक और ढेर के लिए निवासी क्या देख सकें।

कुछ लिंक है कि उपयोगी हो सकता है:

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