Django मेमोरी उपयोग को कम करना। काफी नीचे लटकते फल?


136

समय के साथ मेरी मेमोरी का उपयोग बढ़ता है और Django को फिर से शुरू करना उपयोगकर्ताओं के लिए दयालु नहीं है।

मैं अनिश्चित हूं कि मैमोरी यूसेज का इस्तेमाल कैसे किया जाए लेकिन मापने की शुरुआत कैसे की जाए, इस पर कुछ टिप्स उपयोगी होंगे।

मुझे लगता है कि कुछ सरल कदम हैं जो बड़े लाभ पैदा कर सकते हैं। 'डिबग' को सुनिश्चित करना 'गलत' पर आधारित है, यह एक स्पष्ट बात है।

क्या कोई दूसरों को सुझाव दे सकता है? कम ट्रैफ़िक वाली साइटों पर कैशिंग में कितना सुधार होगा?

इस मामले में मैं mod_python के साथ Apache 2.x के तहत चल रहा हूं। मैंने सुना है mod_wsgi थोड़ा दुबला है, लेकिन जब तक मुझे पता है कि लाभ महत्वपूर्ण होगा इस स्तर पर स्विच करना मुश्किल होगा।

संपादित करें: अब तक सुझावों के लिए धन्यवाद। किसी भी सुझाव कैसे स्मृति का उपयोग कर रहा है की खोज करने के लिए? क्या पायथन मेमोरी प्रोफाइलिंग के लिए कोई गाइड हैं?

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

संपादित करें: कार्ल ने यहां थोड़ा और विस्तृत उत्तर पोस्ट किया जो पढ़ने योग्य है: Django परिनियोजन: कटिंग अपाचे का ओवरहेड

संपादित करें: ग्राहम डम्पल्टन का लेख सबसे अच्छा मैंने एमपीएम और mod_wsgi संबंधित सामान पर पाया है। मैं इस बात से निराश हूं कि कोई भी ऐप में मेमोरी यूजेज डिबगिंग के बारे में कोई जानकारी नहीं दे सकता है।

फाइनल एडिट: खैर मैं इस बारे में वेबफिकेशन के साथ चर्चा कर रहा हूं कि क्या वे अपाचे को फिर से बनाने में मदद कर सकते हैं और यह इस मामले पर उनका शब्द है:

"मैं वास्तव में यह नहीं सोचता कि एमपीएम वर्कर + mod_wsgi सेटअप पर स्विच करने से आपको बहुत लाभ मिलेगा। मेरा अनुमान है कि आप लगभग 20 एमबी को बचाने में सक्षम हो सकते हैं, लेकिन शायद इससे अधिक नहीं।"

इसलिए! यह मुझे मेरे मूल प्रश्न पर वापस लाता है (जो मैं अभी भी समझदार नहीं हूं)। समस्याओं की पहचान करने के बारे में किसी की पहचान कैसे होती है? यह एक अच्छी तरह से ज्ञात अधिकतम है जिसे आप परीक्षण के बिना ऑप्टिमाइज़ नहीं करते हैं जहां आपको अनुकूलन करने की आवश्यकता है, लेकिन पायथन मेमोरी के उपयोग को मापने के लिए ट्यूटोरियल के तरीके में बहुत कम है और Django के लिए विशिष्ट कोई भी नहीं है।

सभी की सहायता के लिए धन्यवाद, लेकिन मुझे लगता है कि यह सवाल अभी भी खुला है!

एक और अंतिम संपादन ;-)

मैंने इसे django-users की सूची पर पूछा और कुछ बहुत ही उपयोगी उत्तर मिले

ईमानदारी से अंतिम अद्यतन कभी!

यह अभी जारी किया गया था। अभी तक सबसे अच्छा समाधान हो सकता है: प्रोफाइलिंग Django ऑब्जेक्ट आकार और मेमोरी उपयोग Pympler के साथ

जवाबों:


50

सुनिश्चित करें कि आप डेटा के लिए वैश्विक संदर्भ नहीं रख रहे हैं। यह अजगर कचरे के संग्रहकर्ता को मेमोरी जारी करने से रोकता है।

उपयोग न करें mod_python। यह अपाचे के अंदर एक दुभाषिया लोड करता है। यदि आपको अपाचे का उपयोग करने की आवश्यकता है, तो mod_wsgiइसके बजाय का उपयोग करें । यह स्विच करने के लिए मुश्किल नहीं है। यह बहुत आसान है। मस्तिष्क-मृत की तुलना में django केmod_wsgi लिए कॉन्फ़िगर करना आसान है mod_python

यदि आप अपनी आवश्यकताओं से अपाचे निकाल सकते हैं, तो यह आपकी स्मृति के लिए भी बेहतर होगा। spawningअजगर वेब अनुप्रयोगों को चलाने के लिए नया तेज़ स्केलेबल तरीका प्रतीत होता है।

संपादित करें : मैं नहीं देखता कि कैसे mod_wsgi पर स्विच करना " मुश्किल " हो सकता है । यह बहुत आसान काम होना चाहिए। कृपया उस समस्या के बारे में विस्तार से बताएं जो आप स्विच के साथ कर रहे हैं।


4
@ जोश: यदि आप अपाचे केवल सुविधाओं का उपयोग नहीं कर रहे हैं तो अपाचे का ब्लोट और मेमोरी का उपयोग बेवकूफ है। यह सिर्फ एक अनावश्यक परत है।
nosklo

3
Django अभी भी mod_python का समर्थन करता है क्योंकि mod_wsgi अभी भी काफी नया है, और वे रूढ़िवादी बनना चाहते हैं। लेकिन अगर आप Django समुदाय का अनुसरण करते हैं तो आप लोगों को mod_wsgi en masse पर स्विच करते देखेंगे। अनुशंसित विकल्प होने से पहले इसमें बहुत समय नहीं लगेगा।
कार्ल मेयर

1
@ टियागो: अपाचे अच्छा है जब आपके पास पहले से बहुत सारे अपाचे वर्चुअल होस्ट हैं, पहले से ही अपाचे के साथ एसएसएल का उपयोग करते हुए, आदि इस मामले में, mod_wsgi का उपयोग करें। यदि आप नए सिरे से शुरू कर रहे हैं, तो स्पॉनिंग का उपयोग करें। कभी भी mod_python का उपयोग न करें।
नोसकोलो

1
धन्यवाद, nosklo। मैं स्पॉन पर एक नज़र डाल रहा हूं .. लगता है कि कोई भी दस्तावेज नहीं है .. मैं ब्लॉग पोस्ट में पाए गए कुछ निर्देशों का पालन करने की कोशिश करूंगा और देखूंगा कि मुझे कहां मिल सकता है।
टियागो

1
हम्म, जैसा कि किसी ने सिर्फ Django का उपयोग करना शुरू कर दिया है, मैं ध्यान रखूंगा कि मुझे mod_wsgi का उपयोग करना चाहिए।
पॉवरलॉर्ड

28

यदि आप mod_wsgi के तहत चल रहे हैं, और संभवतः यह WSGI अनुरूप है, तो आप अपनी मेमोरी के उपयोग को देखने के लिए Dozer का उपयोग कर सकते हैं ।

Mod_wsgi के तहत इसे अपनी WSGI स्क्रिप्ट के निचले भाग में जोड़ें:

from dozer import Dozer
application = Dozer(application)

फिर अपने ब्राउज़र को अपने सभी मेमोरी आवंटन की सूची देखने के लिए http: // domain / _dozer / index पर इंगित करें ।

मैं भी mod_wsgi के समर्थन की अपनी आवाज़ जोड़ूंगा। यह mod_python पर प्रदर्शन और मेमोरी उपयोग के मामले में अंतर की दुनिया बनाता है। Mod_wsgi के लिए ग्राहम डम्पलटन का समर्थन बकाया है, दोनों सक्रिय विकास के संदर्भ में और मेलिंग सूची पर लोगों की मदद करने के लिए उनके प्रतिष्ठानों का अनुकूलन करने के लिए। Curse.com पर David Cramer ने कुछ चार्ट पोस्ट किए हैं (जो कि मुझे अब दुर्भाग्य से नहीं मिल रहे हैं) सीपीयू और मेमोरी उपयोग में भारी कमी को दर्शाने के बाद उन्होंने उस उच्च ट्रैफ़िक साइट पर mod_wsgi पर स्विच किया। Django के कई देवता स्विच कर चुके हैं। गंभीरता से, यह एक नहीं brainer है :)


जिस स्थिति में मैं जल्द ही एक सवाल पोस्ट करूंगा कि कैसे django के उपयोगकर्ताओं के लिए स्थिर फ़ाइलों तक पहुँचने के लिए कुकी आधारित प्रमाणीकरण हो जाता है ...
एंडी बेकर

15

ये पायथन मेमोरी प्रोफाइलर समाधान हैं, जिनके बारे में मुझे पता है (Django संबंधित नहीं):

  • Heapy
  • Pysizer (बंद)
  • पायथन मेमोरी वैलिडेटर (वाणिज्यिक)
  • Pympler

डिस्क्लेमर: मेरे पास बाद में हिस्सेदारी है।

व्यक्तिगत परियोजना के प्रलेखन से आपको पायथन अनुप्रयोगों के स्मृति व्यवहार का विश्लेषण करने के लिए इन उपकरणों का उपयोग करने का एक विचार देना चाहिए।

निम्नलिखित एक अच्छी "युद्ध कहानी" है जो कुछ सहायक संकेत भी देती है:


5

इसके अतिरिक्त, जांचें कि क्या आप किसी भी ज्ञात रिसाव का उपयोग नहीं करते हैं। MySQLdb को यूनिकोड हैंडलिंग में बग के कारण Django के साथ बड़ी मात्रा में मेमोरी को लीक करने के लिए जाना जाता है। इसके अलावा, Django डीबग टूलबार आपको हॉग को ट्रैक करने में मदद कर सकता है।


amix.dk/blog/viewEntry/19420 शो से पता चलता है कि MySQLdb मेमोरी लीक कर रहा था। MySQLdb 1.2.3c1 और बाद में इसे ठीक करता है।
msanders 15

कैसे django-debug-toolbarमदद कर सकता है?
16

4

बड़ी डेटा ऑब्जेक्ट्स के वैश्विक संदर्भों के आसपास नहीं रखने के अलावा, जहाँ भी संभव हो, बड़े डेटासेट्स को मेमोरी में लोड करने से बचने की कोशिश करें।

डेमन मोड में mod_wsgi पर जाएं, और प्रीफ़ॉर्क के बजाय Apache के कार्यकर्ता mpm का उपयोग करें। यह बाद वाला कदम आपको बहुत कम मेमोरी ओवरहेड के साथ कई अधिक समवर्ती उपयोगकर्ताओं की सेवा करने की अनुमति दे सकता है।


इसके अलावा कार्ल का जवाब यहां देखें: stackoverflow.com/questions/488864/…
एंडी बेकर

इसके अलावा - कुछ पोस्टों में मैंने पढ़ा है कि वास्तविक लाभ mod_wsgi के उपयोग के बजाय कार्यकर्ता MPM पर स्विच करने में है ...
एंडी बेकर

4

Webfaction में वास्तव में django मेमोरी उपयोग को कम रखने के लिए कुछ सुझाव हैं

प्रमुख बिंदु:

  • सुनिश्चित करें कि डीबग झूठी पर सेट है (आप पहले से ही जानते हैं कि)।
  • अपने Apache config में "ServerLimit" का प्रयोग करें
  • जांचें कि कोई बड़ी वस्तुएं मेमोरी में लोड नहीं हो रही हैं
  • एक अलग प्रक्रिया या सर्वर में स्थिर सामग्री परोसने पर विचार करें।
  • अपने Apache config में "MaxRequestsPerChild" का उपयोग करें
  • पता करें और समझें कि आप कितनी मेमोरी का उपयोग कर रहे हैं

2
धन्यवाद, मैंने पहले ही पढ़ लिया था। यह संख्या 3 और 6 है मैं कुछ अधिक विस्तार की उम्मीद कर रहा था! ;-)
एंडी बेकर

3

Mod_wsgi के लिए एक और प्लस: maximum-requestsअपने WSGIDaemonProcessनिर्देश में एक पैरामीटर सेट करें और mod_wsgi हर इतनी बार डेमन प्रक्रिया को पुनः आरंभ करेगा। उपयोगकर्ता के लिए कोई दृश्य प्रभाव नहीं होना चाहिए, एक धीमी पृष्ठ लोड के अलावा पहली बार एक ताजा प्रक्रिया हिट होती है, क्योंकि यह मेमोरी में Django और आपके एप्लिकेशन कोड को लोड कर रही होगी।

लेकिन फिर भी अगर आप कर स्मृति लीक, कि बहुत बड़ा हो रहा से इस प्रक्रिया को आकार रखना चाहिए, अपने उपयोगकर्ताओं के लिए बाधा सेवा के बिना है।


1
कुछ इसी तरह का उल्लेख यहां किया गया है: mail-archive.com/django-users@googlegroups.com/msg84698.html केवल वे अधिकतम अनुरोधों के बजाय निष्क्रियता-समय-सीमा का उपयोग करते हैं।
टॉमस एंड्रेल

3

यहाँ वह स्क्रिप्ट है जिसका उपयोग मैं mod_wsgi (जिसे wsgi.py कहा जाता है, और अपने django प्रोजेक्ट को बंद कर देता हूं) में किया गया है:

import os
import sys
import django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

Myproject.settings और आवश्यकतानुसार पथ समायोजित करें। मैं सभी आउटपुट / dev / null को रीडायरेक्ट करता हूं क्योंकि डिफ़ॉल्ट रूप से mod_wsgi प्रिंटिंग को रोकता है। इसके बजाय लॉगिंग का उपयोग करें।

अपाचे के लिए:

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/apache2/error-myhost.log
   CustomLog /var/log/apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

उम्मीद है कि कम से कम आपको mod_wsgi सेट करने में मदद करनी चाहिए ताकि आप देख सकें कि क्या फर्क पड़ता है।


1

कैश: सुनिश्चित करें कि वे प्लावित हो रहे हैं। कैश में उतरने के लिए कुछ आसान है, लेकिन कैश संदर्भ के कारण कभी भी GC'd नहीं होना चाहिए।

Swig'd कोड: सुनिश्चित करें कि किसी भी स्मृति प्रबंधन को सही ढंग से किया जा रहा है, इसका वास्तव में अजगर में याद करना आसान है, विशेष रूप से अन्य पार्टी लाइब्रेरी के साथ

निगरानी: यदि आप कर सकते हैं, तो स्मृति उपयोग और हिट के बारे में डेटा प्राप्त करें। आमतौर पर आपको एक निश्चित प्रकार के अनुरोध और मेमोरी उपयोग के बीच सहसंबंध दिखाई देगा।


1

हम बड़े साइटमैप (10.000 आइटम) के साथ Django में एक बग पर ठोकर खाई। लगता है कि Django साइटमैप बनाते समय उन सभी को मेमोरी में लोड करने की कोशिश कर रहा है: http://code.djangoproject.com/ticket/11572 - जब Google साइट पर यात्रा का भुगतान करता है तो प्रभावी रूप से अपाचे प्रक्रिया को मारता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.