मैं पाइथन में लिखी गई किसी भी प्रकार की सिस्टम सेवा (वास्तव में यह केवल एक लॉग पार्सर) पर काम कर रहा हूं। इस कार्यक्रम को लंबे समय तक लगातार काम करना चाहिए (उम्मीद है कि मेरे बिना दिन और सप्ताह असफलताओं और पुनरारंभ की जरूरत है)। यही कारण है कि मैं स्मृति खपत के बारे में चिंतित हूं।लिनक्स पर पाइथन मेमोरी खपत: भौतिक और वर्चुअल मेमोरी बढ़ रही है जबकि ढेर का आकार वही रहता है
मैं एक साधारण समारोह में विभिन्न साइटों से प्रक्रिया स्मृति उपयोग के बारे में एक साथ विभिन्न जानकारी डाल:
#!/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
मुझे आश्चर्य है कि मेरी प्रक्रिया के पता स्थान के साथ क्या चल रहा है। ढेर के निरंतर आकार से पता चलता है कि सभी गतिशील वस्तुओं को सही ढंग से हटा दिया जाता है। लेकिन मुझे कोई संदेह नहीं है कि बढ़ती स्मृति खपत लंबे समय तक इस जीवन-महत्वपूर्ण प्रक्रिया की स्थिरता को प्रभावित करेगी।
किसी को भी इस मुद्दे को स्पष्ट कर सके कृपया? धन्यवाद।
(मैं अजगर 2.6.6 के साथ RHEL 6.4 का उपयोग करें, कर्नेल 2.6.32-358)
जब आप 20 मिनट के बजाय कई घंटे के लिए चलाने के लिए कैसे चार्ट नज़र करता – 2rs2ts
ओह, संभवतः संबंधित:। http://stackoverflow.com/q/1194416/691859 – 2rs2ts
@ 2rs2ts, आपके उत्तर के लिए धन्यवाद मैं जब मैं काम पर आऊंगा तो कल चार्ट अपडेट करूँगा :) –