2013-01-09 8 views
10

मेरे पास एक django वेबसर्वर है जो यूवीजीआई के तहत चल रहा है जो स्मृति को रिसाव करने के लिए प्रतीत होता है।गैर-ऑब्जेक्ट पायथन स्मृति रिसाव

विशेष रूप से, प्रक्रियाओं का आरएसएस धीरे-धीरे बढ़ता है जब तक कि मुझे इसे पुनरारंभ करना पड़े।

मुझे इस तरह के अन्य समान प्रश्नों के बारे में पता है, हालांकि अब तक पाए गए सभी समाधान/निष्कर्ष इस मामले में लागू नहीं होते हैं (जो मुझे मिल सकता है)।

अब तक, मैं meliae, Heapy, pympler और objgraph का इस्तेमाल किया है अजगर ढेर निरीक्षण करने के लिए और वे सभी एक ही बात की रिपोर्ट: समय के साथ स्मृति (उम्मीद) बहुत कम विचरण के साथ की 40MB के बारे में का उपयोग कर एक सामान्य की तलाश में ढेर (के रूप में चाहा हे)।

यह दुर्भाग्यवश प्रक्रिया आरएसएस के साथ पूरी तरह से असंगत है, जो पाइथन ढेर आकार में प्रतिबिंब के साथ खुशी से 400 एमबी + तक बढ़ेगा।

Memory snapshot: 
             types | # objects | total size 
============================================= | =========== | ============ 
             dict |  20868 |  19852512 
              str |  118598 |  11735239 
             unicode |  19038 |  10200248 
             tuple |  58718 |  5032528 
             type |  1903 |  1720312 
             code |  13225 |  1587000 
             list |  11393 |  1289704 
          datetime.datetime |  6953 |  333744 
              int |  12615 |  302760 
    <class 'django.utils.safestring.SafeUnicode |   18 |  258844 
             weakref |  2908 |  255904 
    <class 'django.db.models.base.ModelState |  3172 |  203008 
        builtin_function_or_method |  2612 |  188064 
         function (__wrapper__) |  1469 |  176280 
             cell |  2997 |  167832 
          getset_descriptor |  2106 |  151632 
          wrapper_descriptor |  1831 |  146480 
              set |   226 |  143056 
             StgDict |   217 |  138328 
--------------------------- 
Total object memory: 56189 kB 
Total process usage: 
- Peak virtual memory size: 549016 kB 
- Virtual memory size: 549012 kB 
- Locked memory size: 0 kB 
- Peak resident set size: 258876 kB 
- Resident set size: 258868 kB 
- Size of data segment: 243124 kB 
- Size of stack segment: 324 kB 
- Size of code segment: 396 kB 
- Shared library code size: 57576 kB 
- Page table entries size: 1028 kB 
--------------------------- 

Heapy एक ऐसी ही बात दिखा उत्पादन

Memory snapshot: 
Partition of a set of 289509 objects. Total size = 44189136 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 128384 44 12557528 28 12557528 28 str 
    1 61545 21 5238528 12 17796056 40 tuple 
    2 5947 2 3455896 8 21251952 48 unicode 
    3 3618 1 3033264 7 24285216 55 dict (no owner) 
    4 990 0 2570448 6 26855664 61 dict of module 
    5 2165 1 1951496 4 28807160 65 type 
    6 16067 6 1928040 4 30735200 70 function 
    7 2163 1 1764168 4 32499368 74 dict of type 
    8 14290 5 1714800 4 34214168 77 types.CodeType 
    9 10294 4 1542960 3 35757128 81 list 
<1046 more rows. Type e.g. '_.more' to view.> 
--------------------------- 
Total process usage: 
- Peak virtual memory size: 503132 kB 
- Virtual memory size: 503128 kB 
- Locked memory size: 0 kB 
- Peak resident set size: 208580 kB 
- Resident set size: 208576 kB 
- Size of data segment: 192668 kB 
- Size of stack segment: 324 kB 
- Size of code segment: 396 kB 
- Shared library code size: 57740 kB 
- Page table entries size: 940 kB 
--------------------------- 
:

Pympler उत्पादन की तुलना अजगर ढेर/वस्तु स्मृति बनाम प्रक्रिया आरएसएस -

कुछ नमूना उत्पादन मेरी बात को वर्णन करने

ध्यान दें कि दोनों मामलों में, रिपोर्ट किए गए ढेर का आकार 40-50 एमबी है, डब्ल्यू प्रक्रिया आरएसएस 200 एमबी + है।

मैं भी objgraph के get_leaking_objects() का इस्तेमाल किया है, अगर एक सी विस्तार बुरा रेफरी की गिनती कर रहा है देखने के लिए प्रयास हालांकि गैर gc'able वस्तुओं की संख्या समय के साथ विशेष रूप से नहीं उगता है।

क्या किसी को इस बारे में कोई अंतर्दृष्टि है कि इसे डिबग करने के बारे में कैसे जाना है? इस बिंदु पर, मैं यह मानते हुए हूँ दो चीजों में से एक मामला है:

  • मैं एक सी विस्तार लीक स्मृति आंतरिक
  • uwsgi ही स्मृति लीक कर रहा है (हालांकि मैं पर इस का कोई अन्य सबूत खोज पाए, नेट)

यह उल्लेखनीय हो सकता है कि मुझे किसी भी तरह के देव पर्यावरण में इसकी कोई प्रतिकृति नहीं मिली है (हालांकि यह संभव है कि मैं उन पर पर्याप्त ट्रैफिक नहीं फेंक रहा हूं)।

हम मॉड्यूल का एक समूह उपयोग करते हैं जिसमें सी-एक्सटेंशन (सरलजोन, किराए पर लेना आदि) है, इसलिए यह निश्चित रूप से विश्वसनीय है कि वे कारण हो सकते हैं।

इसे ट्रैक करने के लिए दृष्टिकोणों की तलाश में।

+0

आपके पास सेटिंग्स.py DEBUG = गलत है, है ना? – monkut

+0

हां, लेकिन अच्छा सवाल :) – fenn

+0

मैं सोच रहा था कि क्या आप अंत में इस समस्या का सामना कर रहे हैं? हमें ऐसी ही समस्याएं आ रही हैं जो यूवीएसजीआई पर स्विच करने के बाद ही सामने आईं। – Geekfish

उत्तर

2

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? पायथन 2.4 मेमोरी में पाइथन मेमोरी आवंटक द्वारा ओएस में वापस नहीं किया गया था।

फिर भी नए संस्करणों में आप एक समस्या देख सकते हैं जो या तो पाइथन के मेमोरी आवंटक से संबंधित है जो मुक्त सरल प्रकार की सूचियां रखती है, या यदि आप लिनक्स पर चल रहे हैं तो ग्लिबैक के मॉलोक कार्यान्वयन ओएस से स्मृति आवंटित करने के लिए एक समस्या है। http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm और http://pushingtheweb.com/2010/06/python-and-tcmalloc/ पर एक नज़र डालें।

+0

हमारे मामले में पायथन 2.6 (उबंटू 10.04 मूल)। मैं मॉलोक मुद्दे को देखूंगा, मैं अभी तक उस पर नहीं चला था। – fenn