2016-02-26 4 views
9

के साथ मेमोरी विखंडन को कम करें मैं लंबे समय से चल रहे पायथन 2 प्रक्रिया में स्मृति प्रबंधन को प्रभावित करने के लिए MALLOC_MMAP_THRESHOLD_ और MALLOC_MMAP_MAX_ env चर के साथ प्रयोग कर रहा हूं। देखें http://man7.org/linux/man-pages/man3/mallopt.3.htmlMALLOC_MMAP_THRESHOLD_ और MALLOC_MMAP_MAX_

मैं इस बग रिपोर्ट से विचार आया: http://bugs.python.org/issue11849

परिणाम रहा है प्रोत्साहित कर रहे हैं: स्मृति विखंडन कम हो जाता है और ठेठ उच्च पानी के निशान स्मृति में दिखाई दे रहा लंबे समय से चल प्रक्रियाओं द्वारा इस्तेमाल किया कम है ।

मेरी एकमात्र चिंता यह है कि ऐसे कम स्तर के बदलावों का उपयोग करते समय अन्य दुष्प्रभाव होते हैं जो पीछे काट सकते हैं। क्या किसी का उपयोग करने में कोई अनुभव है? https://gist.github.com/lbolla/8e2640133032b0a6bb9c बस "alloc.sh" चलाने के लिए और उत्पादन की तुलना:

यहाँ एक उदाहरण स्क्रिप्ट पता चलता है कि कैसे वे चर एक स्क्रिप्ट है कि एक बड़ी शब्दकोश उत्पन्न में आरएसएस स्मृति को प्रभावित है।

MALLOC_MMAP_THRESHOLD_=None MALLOC_MMAP_MAX_=None 
N=9 RSS=120968 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=None 
N=9 RSS=157008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=None 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=None 
N=9 RSS=98528 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=0 
N=9 RSS=121012 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=0 
N=9 RSS=121000 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=157004 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98528 

आप देख सकते हैं प्रयोग किया जाता है राष्ट्रीय स्वयंसेवक संघ के बारे में 20% इस उदाहरण के लिए वेनिला अजगर से कम है,: यहाँ मेरे लिए उत्पादन होता है।

+0

इसके आसपास काम करने का एक तरीका एक फोर्क प्रक्रिया में काम करना है जो तब निकलता है। – o9000

+0

@ o9000 मैं ऐसा नहीं कर सकता, क्योंकि प्रश्न में प्रक्रिया लंबे समय से चल रही है। यह एक सर्वर है, जो लंबे समय तक वहां होना चाहिए। – lbolla

+0

@ इबोला आप सर्वर मामलों में भी ऐसा कर सकते हैं। सर्वर प्रक्रिया से कांटा, स्मृति आवंटन ऑपरेशन चलाएं, फोर्क प्रक्रिया से सर्वर प्रक्रिया में वापस लौटें, फोर्कड प्रक्रिया समाप्त करें, ग्राहक से अनुरोध करें कि वह अनुरोध करे। अब, इसका मतलब यह नहीं है कि आपने समस्या हल कर ली है। हो सकता है कि इनपुट और आउटपुट इतने बड़े हों कि उन्हें सर्वर पर भारी मेमोरी आवंटन की आवश्यकता होगी। वाईएमएमवी लेकिन आप इसे कर सकते हैं। – marr75

उत्तर

3

बिना किसी समस्या के लंबे समय तक इस चिमटा के साथ उत्पादन में होना। तो, मुझे लगता है कि कुछ मामलों में लंबे समय से चल रहे पायथन प्रक्रियाओं में स्मृति उपयोग में सुधार करने के लिए यह एक व्यवहार्य विकल्प है।

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