2012-11-01 10 views
10

यह एक लंबी पोस्ट होने जा रहा है, इसलिए कृपया मेरे साथ लटकाएं।मैक्स पूल आकार इकाई फ्रेमवर्क के साथ बढ़ रहा है 4.3

कुछ महीनों पहले हमने काम पर लागू होने वाली उत्पादन साइटों में से एक मैंने अपने ईएलएमएएच लॉग में डरावनी कनेक्शन रिसाव त्रुटि संदेश को हर बार देखा।

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached." 

यह मुझे परेशान करता है क्योंकि हम ईएफ का उपयोग कर रहे हैं और कनेक्शन हैंडलिंग स्वचालित होनी चाहिए।

तो मैंने खुदाई शुरू कर दी। मुझे लगता है कि पहला संभावित अपराधी मिनीप्रोफाइलर था (या मुझे कहना चाहिए, मिनीप्रोफाइलर का उपयोग करने के हमारे कार्यान्वयन)। हम इसका इस्तेमाल कर रहे हैं और यह अच्छी तरह से काम कर रहा है, लेकिन मैं संभावित कनेक्शन रिसाव के बारे में चिंतित था।

public OurContext() : base(GetProfilerConnection(), true) 
    {} 

    private static DbConnection GetProfilerConnection() 
    { 
     return new EFProfiledDbConnection(new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString), 
              MiniProfiler.Current); 
    }  

मैं यह धारणा थी कि बेस कॉल में "सच" पैरामीटर संदर्भ कनेक्शन के स्वामित्व लेने के लिए तो मैं विश्वास है कि यह ठीक से काम करना चाहिए और कनेक्शन का निपटारा हो जाएगा का कारण बना।

enter image description here

हमारे संवर्धन देव शाखा में मैं miniprofiler हटा दिया है के रूप में यह EF5 समर्थन करने के लिए अद्यतन नहीं किया गया है और हम नहीं भी दूर भविष्य में कुछ बिंदु पर पलायन करने जा रहे हैं, तो यह होना चाहिए एक चिंता के रूप में हटा दिया।

चिंता दो "क्या हम अपने डेटाकॉन्टेक्स को सही तरीके से निपटा रहे हैं"? इसलिए मैंने एक परीक्षण पर इकाई फ्रेमवर्क प्रोफाइलर डाउनलोड किया और हमारा सबसे भारी पृष्ठ लिया और एक परीक्षण चलाया।

enter image description here

परिणाम स्पष्ट है कि किसी भी संदर्भ हम खोला बंद हो गया पता चला है, मेरे लिए के विषय में हिस्सा तथापि संदर्भों हम खोलने की संख्या है। हमारे पास प्रति वेब http अनुरोध के एक संदर्भ को दोबारा स्थापित करने के लिए हमारे डी कंटेनर (निनजे 2) सेटअप हैं, जो मैं सही मानता हूं। समस्या हमारे वेतन में छवियों को कैसे संभालने के साथ भुगतान में आती है। विशेष रूप से इस पृष्ठ में डेटाबेस में सात छवियां हो सकती हैं। इन छवियों में से प्रत्येक को एक एमवीसी एक्शन के माध्यम से पृष्ठ में शामिल किया गया है। तो जैसा:

[<img src="/Controller/GetPhotoAction/[ImageId] />] 

छवि के बाद से एक separte अनुरोध है एक अलग संदर्भ खोला जा रहा है। इसलिए, इस विशेष पृष्ठ के लिए, हम कनेक्शन पूल से सात अलग-अलग कनेक्शन का उपयोग कर रहे हैं यदि मैं इसे सही ढंग से समझ रहा हूं। हालांकि कई उपयोगकर्ताओं द्वारा इसे गुणा करें और मैं देखता हूं कि उपरोक्त त्रुटि संदेश कैसे सत्य हो सकता है।

डेटाबेस में छवियों को संग्रहीत करने का कारण दो गुना है। एक, इस ऐप के डेटा को प्रबंधित करने के लिए हमारे प्रशासनिक एप्लिकेशन यूएस वेस्ट कोस्ट पर हैं, लेकिन एप्लिकेशन होस्ट करने वाले सर्वर यूएस ईस्ट कोस्ट पर हैं। वेस्ट कोस्ट पर काम और पूर्वी तट पर सर्वर पर हमारे नेटवर्क के बीच वीपीएन सुरंग है। ऐप भी संतुलित लोड है (2 वेब फ्रंट सिरों)। वीपीएन सुरंग के माध्यम से छवियों की प्रतिलिपि बनाने से बचने के लिए डीबी में छवियों को स्टोर करने के लिए निर्णय लिया गया था और उसके बाद छवियों को प्रत्येक सर्वर पर वेब ऐप के भीतर फ़ाइल स्थान पर लिखने के लिए अनुमतियों से निपटने के लिए अनुमति दी गई थी (दोनों स्थान भी पूरी तरह से अलग डोमेन हैं)।

अंतरिम में, जब हम परीक्षण करते हैं, हमने अपने कनेक्शन स्ट्रिंग में अधिकतम कनेक्शन पूल आकार बढ़ा दिया है और अगले सप्ताह के शुरू में प्रोड को इसे तैनात कर देगा।

तो, मेरे सवाल कर रहे हैं:

1) मैं यहाँ जाँच रिसाव में मेरी ठिकानों को कवर किया है? मेरा मानना ​​है कि मेरे पास है। क्या मैंने उपर्युक्त कुछ भी गलत किया है?

2) यदि इस पृष्ठ पर एकाधिक डेटा संदर्भ अपराधी साबित होते हैं, तो देश भर में दो सर्वरों को छवि लिखने के सुझावों को ध्यान में रखते हुए दिमाग अनुमतियां डोमेन को पार कर जाएंगी? वास्तव में, मैं इसे फिर से करना चाहता हूं, लेकिन तकनीकी बाधाएं हम छुट्टियों से ठीक पहले इस समय करने के इच्छुक हैं उससे थोड़ा अधिक हैं।

3) यदि आपको लगता है कि उपरोक्त में से कोई भी समस्या नहीं है, तो मैं क्या खो सकता हूं? क्या यह वास्तव में हो सकता है कि अनुरोध इतने अधिक हैं कि हम इस त्रुटि का सामना कर रहे हैं और हमें स्केल करने की आवश्यकता है? मैं उपयोग आंकड़ों को देखने के लिए लॉग खोद सकता हूं, लेकिन असंभव लगता है। यह पृष्ठ एक घंटे के लिए कैश किया गया है (पैरामीटर द्वारा भिन्नता है)

उत्तर

2

यह पता लगाने के लिए और अधिक दृष्टिकोण हैं कि आपका वेब ऐप कनेक्शन लीक कर रहा है या नहीं। हाल ही में मैं का उपयोग कर इन से लाभ:

  • एसक्यूएल प्रोफाइलर का उपयोग कर आईआईएस पर (जैसा कि आप देख सकते हैं कि कितने कनेक्शन खोल रहे हैं/बंद) कनेक्शन पूल
  • मॉनिटर - अधिक के लिए यहाँ देखो - http://msdn.microsoft.com/en-us/library/aa175863%28SQL.80%29.aspx
  • अधिकतम कनेक्शन आकार में अधिकतम पूल आकार सेट करें जो कनेक्शन के अधिकतम मूल्य के लिए आप एक अनुरोध के लिए उम्मीद कर रहे हैं - मैंने अपना ऐप चलाने की कोशिश की है जो मैक्स पूल आकार = 1 के साथ छवियों को संग्रहीत करने और पुनर्प्राप्त करने के समान दृष्टिकोण का उपयोग करता है मोर के साथ पेज ई छवियों से अधिक और यह आपके पास एक ही अपवाद पर असफल रहा। जब मैंने प्रति अनुरोध नेस्टेड कनेक्शन के साथ बग को हटा दिया, तो यह छवियों पर उन उप-अनुरोधों के साथ भी ठीक था।

और आपके प्रश्न के लिए। प्रति अनुरोध एक डेटा संदर्भ के साथ आपको ठीक होना चाहिए। जब यह दायरे का अनुरोध करने के लिए बाध्य होता है तो अनुरोध के अंत में इसका निपटारा किया जाएगा (वास्तव में जब तक कचरा कलेक्टर अनुरोध ऑब्जेक्ट एकत्र नहीं करता तब तक देरी हो जाती है)। लेकिन सावधान रहें यदि आप सीधे अपने डेटाकॉन्टेक्स्ट का उपयोग नहीं कर रहे हैं (उदा। आपके पास इसके आसपास कुछ रिपोजिटरी पैटर्न रैपर है) क्योंकि कुछ छिपी हुई (कनेक्शन लीकिंग) कीड़े हो सकती हैं।

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