2014-04-29 6 views
17

मैं पाइथन में लिखी गई किसी भी प्रकार की सिस्टम सेवा (वास्तव में यह केवल एक लॉग पार्सर) पर काम कर रहा हूं। इस कार्यक्रम को लंबे समय तक लगातार काम करना चाहिए (उम्मीद है कि मेरे बिना दिन और सप्ताह असफलताओं और पुनरारंभ की जरूरत है)। यही कारण है कि मैं स्मृति खपत के बारे में चिंतित हूं।लिनक्स पर पाइथन मेमोरी खपत: भौतिक और वर्चुअल मेमोरी बढ़ रही है जबकि ढेर का आकार वही रहता है

मैं एक साधारण समारोह में विभिन्न साइटों से प्रक्रिया स्मृति उपयोग के बारे में एक साथ विभिन्न जानकारी डाल:

#!/usr/bin/env python 
from pprint import pprint 
from guppy import hpy 
from datetime import datetime 
import sys 
import os 
import resource 
import re 

def debug_memory_leak(): 
    #Getting virtual memory size 
    pid = os.getpid() 
    with open(os.path.join("/proc", str(pid), "status")) as f: 
     lines = f.readlines() 
    _vmsize = [l for l in lines if l.startswith("VmSize")][0] 
    vmsize = int(_vmsize.split()[1]) 

    #Getting physical memory size 
    pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

    #Analyzing the dynamical memory segment - total number of objects in memory and heap size 
    h = hpy().heap() 
    if __debug__: 
     print str(h) 
    m = re.match(
     "Partition of a set of ([0-9]+) objects. Total size = ([0-9]+) bytes(.*)", str(h)) 
    objects = m.group(1) 
    heap = int(m.group(2))/1024 #to Kb 

    current_time = datetime.now().strftime("%H:%M:%S") 
    data = (current_time, objects, heap, pmsize, vmsize) 
    print("\t".join([str(d) for d in data])) 

इस समारोह मेरी लंबे-चलने प्रक्रिया की स्मृति की खपत की गतिशीलता का अध्ययन करने के लिए इस्तेमाल किया गया है, और मैं अभी भी इसके व्यवहार की व्याख्या नहीं कर सकते हैं। आप देख सकते हैं कि ढेर आकार और ऑब्जेक्ट्स की कुल मात्रा में बदलाव नहीं हुआ, जबकि भौतिक और वर्चुअल मेमोरी इन बीस मिनट के दौरान 11% और 1% की वृद्धि हुई।

यूपीडी: प्रक्रिया इस पल तक लगभग 15 घंटे तक काम कर रही है। ढेर अभी भी वही है, लेकिन भौतिक स्मृति छह गुना बढ़ गई है और वर्चुअल मेमोरी में 50% की वृद्धि हुई है।

समय Obj ढेर PHM वीएम

19:04:19 31424 3928 5460 143732

19:04:29: वक्र पर 3:00 पूर्वाह्न अजीब बाहरी कारकों के कारण छोड़कर रैखिक होने लगते है 30582 3704 10276 158240

19:04:39 30582 3704 10372 157772

19:04:50 30582 3709 10372 157772

19:05:00 30582 3704 10372 157772

(...)

19:25:00 30583 3704 11524 159900

09:53:23 30581 3704 62380 210756

मुझे आश्चर्य है कि मेरी प्रक्रिया के पता स्थान के साथ क्या चल रहा है। ढेर के निरंतर आकार से पता चलता है कि सभी गतिशील वस्तुओं को सही ढंग से हटा दिया जाता है। लेकिन मुझे कोई संदेह नहीं है कि बढ़ती स्मृति खपत लंबे समय तक इस जीवन-महत्वपूर्ण प्रक्रिया की स्थिरता को प्रभावित करेगी।

enter image description here

किसी को भी इस मुद्दे को स्पष्ट कर सके कृपया? धन्यवाद।

(मैं अजगर 2.6.6 के साथ RHEL 6.4 का उपयोग करें, कर्नेल 2.6.32-358)

+4

जब आप 20 मिनट के बजाय कई घंटे के लिए चलाने के लिए कैसे चार्ट नज़र करता – 2rs2ts

+0

ओह, संभवतः संबंधित:। http://stackoverflow.com/q/1194416/691859 – 2rs2ts

+0

@ 2rs2ts, आपके उत्तर के लिए धन्यवाद मैं जब मैं काम पर आऊंगा तो कल चार्ट अपडेट करूँगा :) –

उत्तर

5

जानते हुए भी कि अपने कार्यक्रम कर रहा है बिना, इस मदद कर सकता है।

मैं एक समय पहले जब एक परियोजना पर काम इस लेख भर में आया था: http://chase-seibert.github.io/blog/2013/08/03/diagnosing-memory-leaks-python.html कौन कहता है, "लंबे समय से अजगर नौकरियों है कि स्मृति का उपयोग करते हैं चलाते समय चल रहा है प्रक्रिया जब तक कि स्मृति वापस नहीं कर सकते ऑपरेटिंग सिस्टम के लिए वास्तव में समाप्त हो जाता है, भले ही सब कुछ कचरा ठीक से इकट्ठा किया गया हो।"

मैं बहु मॉड्यूल का उपयोग कर अपने प्रोजेक्ट कांटा एक अलग प्रक्रिया है और वापस जाने के लिए जब यह काम करने के लिए की जरूरत समाप्त हो गया है, और मैं के बाद से किसी भी स्मृति मुद्दों पर ध्यान नहीं दिया है।

कि या अजगर में यह कोशिश 3.3 http://bugs.python.org/issue11849

+0

दुर्भाग्य से, मैं जिस लाइब्रेरी का उपयोग कर रहा हूं (औपर्स - लिनक्स में ऑडिट के साथ जाता है) अभी भी तीसरी शाखा में नहीं है। –

+0

@ user3588162: यह मेरे लिए काम किया। धन्यवाद एक टन। – Prateek

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