2013-02-27 220 views
6

मेरे पास AsyncController है जो लंबे समय तक मतदान करने के लिए सेट अप करता है। यह सब ठीक काम करता है, हालांकि एक सहयोगी ने सर्वर पर एक स्मृति रिसाव देखा है जो हर नए कनेक्शन के साथ बढ़ता प्रतीत होता है।एमवीसी 4 आईआईएस मेमोरी रिसाव

मैंने इस पृष्ठ से हजारों बार अनुरोध करने के लिए एक छोटा सा एप्लीकेशन बनाया है और मैं आईआईएस प्रक्रिया के लिए स्मृति उपयोग की निगरानी कर रहा हूं। प्रत्येक कनेक्शन मेमोरी उपयोग को बढ़ाता है, लेकिन क्लाइंट डिस्कनेक्ट होने पर सभी तरह से नीचे नहीं आ जाता है।

आगे की जांच पड़ताल करने के बाद, मैंने पाया कि यह अभी भी होता है जब मैं एक मानक Controller कि कुछ भी नहीं इस लेकिन करता है के साथ अपने AsyncController बदल देते हैं:

public class WaitController : Controller 
{ 
    public JsonResult Member(string oauth_token, int service_id, bool busy = false) 
    { 
     return Json(new 
     { 
      ready = false, 
     }, JsonRequestBehavior.AllowGet); 
    } 
} 

हालांकि इस में, वहाँ के रूप में बहुत ज्यादा नहीं है स्मृति उपयोग , व्यवहार बिल्कुल वही प्रतीत होता है।

मैंने 10,000 कनेक्शन के बीच अंतर दिखाने के लिए एक मेमोरी प्रोफाइलर चलाया है और वहां कुछ भी नहीं है। सबसे अधिक स्मृति ExpiresEntry[] के System.Web.Caching या System.Runtime.Caching के उदाहरणों द्वारा उठाई जाती है, हालांकि आईआईएस कार्यकर्ता प्रक्रिया में मुझे स्मृति वृद्धि के मुकाबले यह कुछ भी नहीं है।

मेरा प्रश्न है, क्या आईआईएस डिज़ाइन द्वारा ऐसा कर रहा है? शायद यह कनेक्शन धागे के लिए आवंटित किया गया था, जो कि बाद में मामले में लटक रहे हैं, उन्हें बाद में आवश्यकता है? क्या यह आईआईएस, एएसपी.नेट या एमवीसी 4 के साथ एक बग है?

इसके लिए एमवीसी 4 की वेबएपीआई सुविधाओं का उपयोग करने का मेरा निर्णय था क्योंकि हम चाहते हैं कि यह लचीला, रखरखाव योग्य, भविष्य-सबूत हो और AJAX के माध्यम से पहुंचा जा सके। यह विकास के दृष्टिकोण से भी समझ में आया, क्योंकि हमने एमवीसी 4 में भी वेबसाइट बनाई है।

हालांकि, एक सहयोगी ने अब इसे सिस्टम आर्किटेक्चर के साथ एक महत्वपूर्ण समस्या के रूप में उठाया है क्योंकि हम (भविष्य में) हजारों ग्राहकों से जुड़े होंगे। वह सुझाव दे रहा है कि हम इसके बजाय डब्ल्यूसीएफ का उपयोग करें। तो, बोनस सवाल - डब्ल्यूसीएफ का उपयोग इन समस्याओं को हल करेगा?

+0

क्या आप वाकई लीक कर रहे हैं? क्या यह संभव है कि यह सिर्फ उस पर पकड़ रहा है क्योंकि इसे देने के लिए पर्याप्त दबाव नहीं है? क्या आपने सत्यापित किया है कि यदि आप अपना कनेक्शन परीक्षण जारी रखते हैं तो सर्वर अंततः स्मृति से बाहर हो जाएगा? – Pete

+0

@Pete यह धीमा शुरू हो जाता है। मैंने इसे वास्तव में स्मृति से बाहर नहीं देखा है, लेकिन पूरे एप्लिकेशन पूल धीरे-धीरे उस बिंदु पर धीमा हो जाता है जहां यह उपयोग करने योग्य नहीं है। यह एप्लिकेशन पूल को पुनरारंभ करके हल किया गया है। क्या आवंटित स्मृति को छोड़ने के लिए आईआईएस को 'दबाव' की आवश्यकता है? मुझे लगता है कि खराब प्रदर्शन संसाधित होने के लिए कतार में बस प्रत्येक कनेक्शन इंतजार कर सकता है। – Connell

उत्तर

2

इस विषय के बारे में एक एमएस फील्ड अभियंता से एक महान article है। मदद की हो सकती है।

+0

क्या यह कह रहा है कि यह व्यवहार की उम्मीद है? '' मेमोरी विखंडन और अन्य प्राकृतिक गिरावट से बचा नहीं जा सकता है और रीसाइक्लिंग सुनिश्चित करता है कि अनुप्रयोगों को समय-समय पर साफ किया जाता है "। क्या माइक्रोसॉफ्ट हमें स्वचालित रूप से एप्लिकेशन पूल रीसाइक्लिंग करके इस समस्या को हल करने के लिए प्रोत्साहित करता है? – Connell

+0

यही वह है जो मैं आमतौर पर करता हूं। :) – rusev

0

अधिक प्रयोग और परीक्षण के बाद, मैंने यह पाया है, दुर्भाग्यवश, इसे रोका नहीं जा सकता है। ऐसा लगता है कि आईआईएस के साथ डिजाइन या वास्तविक गहरे जड़ वाले मुद्दे से ऐसा लगता है।

मैंने निम्न-स्तरीय विकल्प का उपयोग करने के लिए अपनी विधि बदल दी: एक ही चीज़ करने के लिए IHttpAsyncHandler लागू करें। मैंने custom HttpHandler route for MVC का उपयोग किया ताकि मैं उसी यूआरएल का उपयोग कर सकूं जैसा कि मैं पहले इस्तेमाल कर रहा था। समस्या अभी भी अस्तित्व में है, लेकिन थोड़ा सा पैमाने पर।

मैंने फिर पूरी तरह से रिक्त IHttpHandler की कोशिश की जो कि { ready: false } लौटाता है (जैसा कि मेरा कोड टाइमआउट पर करेगा)। HttpHandler में कोई अन्य कोड शामिल नहीं है, लेकिन एक ही समस्या अभी भी होती है।

अगला, मैंने पूरी तरह से रिक्त डब्ल्यूसीएफ सेवा की कोशिश की जो { ready: false } लौटा। वही समस्या, लेकिन इस बार एक छोटे पैमाने पर भी।

लिंक @rusev के जवाब के रूप में पता चलता है:

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

यह समस्या का कारण हो सकता है। मैं कल्पना कर सकता हूं कि एक एमवीसी नियंत्रक का उपयोग करते समय अधिक ओवरहेड होते हैं, तो विखंडन बस तेज़ी से होता है। एचटीपीएचंडलर या डब्ल्यूसीएफ सेवा जैसे निचले स्तर के तरीकों का उपयोग प्रति कनेक्शन कम मेमोरी का उपयोग करेगा, इसलिए कम विखंडन का कारण बनता है।