2013-08-16 6 views
8

मेरे पास अपेक्षाकृत बड़ी इकाई फ्रेमवर्क मॉडल (लगभग ~ 300 टेबल) है जिसके लिए मैं क्वेरी/एप्लिकेशन प्रदर्शन को बेहतर बनाने के लिए दृश्य उत्पन्न करता हूं।.NET MVC/Entity Framework अनुप्रयोग में अत्यधिक उच्च स्मृति उपयोग

जब एप्लिकेशन न्यूनतम लोड के तहत होता है तो मुझे 6-7 घंटे के दौरान आवेदन के भीतर धीरे-धीरे स्मृति खपत में वृद्धि का अनुभव होता है। लगभग पहुंचने पर। 4 जीबी, एप्लिकेशन पूल रीसेट है और प्रक्रिया दोहराती है।

enter image description here

चित्रा 1: 8-9 घंटे

इस आवेदन के पाठ्यक्रम पर आवेदन स्मृति खपत दिखा भंडार पैटर्न का एक परिवर्तन का उपयोग करता है और यह सुनिश्चित करता है कि मेरे ObjectContext के उदाहरण instantiated और नष्ट कर रहे हैं प्रत्येक लेनदेन के लिए सबसे कम समय में व्यवहार्य। मैं किसी भी संसाधन को साफ करने के लिए सभी भंडारों/इंटरफेस पर आईडीस्पोजेबल को भी कार्यान्वित करता हूं।

मैं ऐसे लाल गेट के चींटियों प्रोफाइल, WinDbg और दूसरों के रूप में स्मृति प्रोफाइलर साथ आवेदन पर व्यापक परीक्षण किया है और अब तक स्मृति मुद्दे का सही कारण निर्धारित करने में असमर्थ किया गया है, लेकिन नीचे उल्लेख किया है:

एक लाल गेट चींटियों प्रोफाइलर परीक्षण से पता चलता भी कई इकाई फ्रेमवर्क MetadataWorkspaces बनाया जा रहा है, अतिरिक्त वस्तु मैपिंग और संबद्ध एसक्यूएल कमांड पाठ के बहुत सारे के कारण आयोजित होने वाले देखते हैं कि। एक विशेष भंडार में myEntities का भी एक उदाहरण है जो में मेटाडाटा वर्कस्पेस और InitializerMetadata कैश में तनाव परीक्षण के अंत में 351 प्रविष्टियां हैं। ये 351 प्रविष्टियां प्रत्येक में myEntities की एक और प्रति है, उनमें से प्रत्येक के पास मेटाडाटा वर्कस्पेस है, और उनमें से प्रत्येक में सैकड़ों ऑब्जेक्ट मैपिंग हैं।

मेरे कोर समाधान के रूप में संरचित है इस प्रकार है:

  • प्रस्तुति - ASP.NET MVC 3
  • व्यापार - वस्तुओं, ViewModels, इंटरफेस
  • इन्फ्रास्ट्रक्चर - इकाई की रूपरेखा मॉडल
  • डेटा एक्सेस - ADO.NET प्रत्यक्ष डेटा एक्सेस

यदि कोई भी y किसी भी पॉइंटर्स प्रदान करने में सक्षम है, मैं बहुत आभारी होंगे।

+4

मुझे कोड पर अच्छा नज़र डालने के बिना भी यकीन नहीं है, लेकिन आम तौर पर जब आप मेमोरी लीक और ईएफ से निपट रहे हैं तो इसका स्नैपशॉट ट्रैकिंग का लक्षण लक्षण सही ढंग से साफ़ नहीं किया जा रहा है। आपने कहा था कि आप नियमित रूप से अपना संदर्भ निपटा रहे हैं लेकिन मैं इसे दोबारा जांच कर शुरू करूंगा। यहाँ एफई पर्फ़ समस्याओं के लिए मेरी निदान चादर: http://blog.staticvoid.co.nz/2012/8/1/entity_framework_performance_cheat_sheet –

+0

हाय ल्यूक। यह एक महान संसाधन है - इसके लिए धन्यवाद। मैं पहले से ही ऐसा करता हूं (आलसी लोडिंग को अक्षम करने से कम) और आश्चर्य हुआ कि क्या कोई अन्य विशिष्ट जानकारी है जो मैं अपने प्रश्न के उत्तर पाने में मदद के लिए प्रदान कर सकता हूं? – Nick

+0

बिल्कुल यकीन नहीं है कि मैं एएनटीएस प्रोफाइलर परीक्षण के बारे में आपकी टिप्पणी समझता हूं। वैसे भी, मैं उस भंडार को दोबारा करने की कोशिश करता हूं। जब myEntities स्वयं को संदर्भित करता है, तो आप निश्चित रूप से स्मृति समस्याओं के साथ समाप्त हो जाएंगे, जब तक आप बाल प्रविष्टियों में वर्चुअल कीवर्ड के साथ श्रृंखला को तोड़ नहीं देते। – B2K

उत्तर

3

हम स्वचालित रूप से मानते हैं कि समस्या ईएफ है। हो सकता है, नहीं हो सकता है। ऐसे कई बिंदु हैं जिन पर हमें ध्यान रखना चाहिए, न केवल डेटा पहुंच बुनियादी ढांचे।

डेटा एक्सेस जारी होने के साथ, आप केवल ईएफ का उपयोग कर रहे हैं, तो आप सरल .AsNoTracking() विधि का उपयोग करके तेज़ सुधार प्राप्त कर सकते हैं। अपने संदर्भ पूल को प्रबंधित करने में सहायता के लिए ServiceLocator को अपनाने के लिए।

आप केवल पढ़ने के लिए ईएफ के बजाय Dapper उपयोगकर्ता भी देख सकते हैं।

और अंतिम रूप से, लेकिन कम से कम, अधिक जटिल प्रश्नों और सबसे तेज़ निष्पादन के लिए शुद्ध ADO.NET का उपयोग करें।

Refactor अपने ActionFilters कुछ "BaseController" सभी नियंत्रकों विरासत है कि एक अच्छा अभ्यास या तो है का उपयोग कर से बचने के लिए।

चेक अपने IDisposable वर्गों को सही मायने में तटरक्षक द्वारा दबा जा रहा है कर रहे हैं, .Dispose(bool) पैटर्न अपनाने।

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

सिर्फ सुझाव दिए गए हैं यही कारण है, लेकिन कड़ी मेहनत के लिए आप के साथ हो जाएगा, कि कोड पहुंच है। :)

शुभकामनाएं!

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