2009-09-14 11 views
6

हमारी वेबसाइट इसमें पृष्ठों के एक हिस्से के लिए एएसपी.नेट एमवीसी का उपयोग करती है। इन यूआरएल में आमतौर पर फॉर्म http://oursite/detail.mvc/12345/pictures/ है इस यूआरएल में, 12345 डेटाबेस में एक आईडी है। हमारे पास कई सौ हजार वस्तुएं हैं जिनके लिए हम विस्तार पृष्ठ दिखाते हैं। हाल ही में हमने साइट के लिए स्मृति उपयोग में वृद्धि देखी, इसलिए मैंने थोड़ा सा जांच की। हमने उत्पादन स्थल का मेमोरी डंप बनाया और पाया कि कुल मेमोरी उपयोग की एक महत्वपूर्ण मात्रा फॉर्म "कैमाचिन/वेबूट/1/साइट/detail.mvc/12345/चित्र /" और "एच" के कैश में तारों के कारण हुई थी। : \ साइट \ detail.mvc \ 12345 \ चित्रों \ "।एएसपी.NET कैश भरने से कई अलग-अलग एमवीसी यूआरएल को रोकें

आगे की जांच और परावर्तक के भारी उपयोग से पता चला है कि ये तार ASP.NET कैश में System.Web.CachedPathData ऑब्जेक्ट के रूप में संग्रहीत हैं। यह ConfigManager द्वारा बनाया गया है जब यह web.config फ़ाइल से जानकारी पढ़ता है। यह HttpContext.GetSection() -> HttpContext.GetConfigurationPathData() -> CachedPathData.GetVirtualPathData() को कॉल करता है। आखिरकार, कैशपैथडाटा.गेटकोनफिगपाथडाटा में, वर्चुअल पथ अनुरोधित पथ के लिए निर्धारित होता है और इसे बिना किसी समाप्ति के एएसपी.NET कैश में कैश किया जाता है।

अब समस्या यह है कि हमारे पास लाखों अलग-अलग यूआरएल हैं, और प्रत्येक पथ के लिए कॉन्फ़िगरेशन सिस्टम कैश में कई स्ट्रिंग्स (configPath, वर्चुअल पथ, भौतिक पथ) संग्रहीत करता है। समय के साथ, यह जानकारी कैश में लगभग सभी डेटा, कई सैकड़ों एमबी का उपभोग करती है।

मुझे लगता है कि जब स्मृति दुर्लभ हो जाती है, तो इन प्रविष्टियों को हटा दिया जाएगा, लेकिन संचालन में वे बढ़ने और बढ़ने वाली प्रक्रियाओं पर भरोसा नहीं करते हैं। यह भी बहुत अक्षम लगता है। क्या HttpContext को यह बताने का कोई तरीका है कि प्रत्येक अद्वितीय यूआरएल के लिए इस जानकारी को कैश न करें? या हो सकता है कि हम अनुरोध पथ को पहले एक सरल यूआरएल पर मैप कर सकें और क्या इसका उपयोग सही web.config का चयन करने के लिए किया जा सकता है?

उत्तर

1

खैर मैं यह सोचा से अधिक (टुन और मैं एक ही कंपनी में काम करते हैं), और हम जहाँ तक मैं बता सकता हूँ दो विकल्प हैं:

  1. कुछ न करें। इस आलेख में एक एएसपीनेट टीम लड़के से एक टिप्पणी है, और यह कैश को बढ़ने और बढ़ने से रोकने के कुछ तरीकों से पता चलता है: http://forums.asp.net/p/985551/3297967.aspx#3297967, फिर भी प्रत्येक संभावित मार्ग के लिए कैश प्रविष्टि लिखने की समस्या का समाधान नहीं करता है लेकिन गारंटी देता है कि कैश कुछ मेमोरी अपवाद से बाहर नहीं फेंक देगा।

  2. वर्कअराउंड के साथ समस्या हल करें, निश्चित मार्गों के बजाय क्वेरीस्ट्रिंग पैरामीटर का उपयोग करें (/controller.mvc?action=X & पैरामीटर = नियंत्रक.एमवीसी/एक्शन/पैराम्स के बजाय वाई)। इस तरह केवल नियंत्रक.एमवीसी कैश हो जाता है।

आखिरकार, मुझे नहीं लगता कि यह वास्तव में एक समस्या है।

+2

विकल्प 2 अपेक्षाकृत लंगड़ा लगता है, क्योंकि यह एएसपी.नेट एमवीसी ढांचे की सबसे अच्छी और सबसे दृश्यमान सुविधाओं में से एक को मारता है। हमारे मामले में, इससे कोई फर्क नहीं पड़ता क्योंकि हमारे पास आईएसएपीआई रीराइटिंग डीएल भी है। लेकिन यह अभी भी एक लंगड़ा समाधान की तरह लगता है। –

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