2010-06-11 10 views
6

क्षमा में आईआईएस 7 की 60% मेमोरी सीमा से अधिक कैसे हो सकता है अगर यह अधिक सर्वरफॉल्ट बनाम स्टैक ओवरफ्लो है। ऐसा लगता है कि सीमा पर है।एएसपी.NET कैशिंग अनुप्रयोग

हमारे पास एक ऐसा एप्लिकेशन है जो एएसपी.नेट कैशिंग का उपयोग कर ई-कॉमर्स एप्लिकेशन के लिए बड़ी मात्रा में उत्पाद डेटा कैश करता है। यह 65K तत्वों के साथ एक शब्दकोश वस्तु है, और हमारी गणना ऑब्जेक्ट का आकार ~ 10GB पर रखती है।
समस्या:

  1. स्मृति की मात्रा वस्तु की खपत हमारे 10GB गणना से अधिक दूर हो रहा है।

  2. बिग कॉन्स्टर्न: हम सर्वर में 32 जीबी से 60% से अधिक का उपयोग नहीं कर सकते हैं।

क्या हम अब तक की कोशिश की है:

machine.config/system.web में (एस एफ क्षमा, टैग की अनुमति नहीं है स्वरूपण):

processModel autoConfig="true" memoryLimit="80" 

Web.config/system.web/कैशिंग/कैश में (एसएफ टैग को अनुमति नहीं देता है, प्रारूपण को माफ़ कर देता है):

privateBytesLimit = "20000000000" (and 0, the default of course) 
percentagePhysicalMemoryUsedLimit = "90" 

पर्यावरण: विंडोज 2008R2 64 32GB राम IIS7

कुछ भी नहीं है हमें 60% मूल्य से अधिक के लिए अनुमति देने के लिए लगता है। कार्यकर्ता का स्क्रीनशॉट देखें।

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

+0

एक शिक्षित अनुमान: सर्वर उस मेमोरी को फिर से ट्यून कर रहा है, जिसे आप उस पर फेंक रहे वर्कलोड के लिए समायोजित करने के लिए समायोजित कर रहे हैं, स्वैप फ़ाइल को अधिक क्षतिपूर्ति करने के लिए, या मेमोरी को तेजी से एकत्रित करने के लिए कचरा का उपयोग कर। ऐसा कुछ। टास्कमैन में प्रदर्शन टैब कैसा दिखता है जैसे आप लोड को रैंप करते हैं? क्या स्वैप फ़ाइल का आकार बढ़ता है? –

+0

@Robert: स्वैप बहुत अधिक फ्लैट रहता है (जो समझ में आता है, क्योंकि यह एक मेमोरी कैश है)। यद्यपि जांच की कीमत है। @all: मुझे आश्चर्य है कि एक वस्तु का आकार बड़ा समस्या है। क्या जीसी को ऑब्जेक्ट्स को स्थानांतरित करने के लिए "स्लैक स्पेस" की एक निश्चित मात्रा की आवश्यकता होती है और यह _one_ ऑब्जेक्ट उस से अधिक है? – evilknot

+0

क्या आप शब्दकोश में और बाहर वस्तुओं को स्वैप कर रहे हैं? यदि आप हैं, तो यह जीसी पर दबाव डाल सकता है, क्योंकि प्रत्येक स्वैप किसी ऑब्जेक्ट को मुक्त कर देगा जिसे किसी बिंदु पर निपटाया जाना चाहिए। संग्रह करने से पहले जीसी आपके लिए स्मृति से बाहर निकलने का इंतजार नहीं कर सकता है। कुछ मेमोरी प्रोफाइलिंग क्रम में हो सकती है। –

उत्तर

1

आप एक अलग कैशिंग रणनीति का प्रयोग माना जाता है? निर्मित कैशिंग में वह सब कुछ समृद्ध नहीं है और आप इसे और अधिक करने के लिए संघर्ष करेंगे (जब तक कि कुछ आईआईएस गुरु के बारे में कुछ चालाक काम न हो)।

हमने इस पर काम करने में काफी समय बिताया और छोड़ दिया। हम वास्तव में कैश में स्टोर करने के लिए पतली वस्तुओं का उपयोग करते हैं और आवश्यक वस्तुओं को आवश्यकतानुसार प्राप्त करते हैं।

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

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

+0

हम निश्चित रूप से अन्य कैशों की खोज कर रहे हैं। हम केवल एक बार कैश पॉप्युलेट कर रहे हैं, जब एप्लिकेशन शुरू होता है, और यह नहीं बदलता है। हम nCache के अलावा उपरोक्त को देख रहे हैं। धन्यवाद! – evilknot

+1

+1, एएसपीनेट कैश वास्तव में यहां गलत है - आप शायद कुछ और प्रक्रिया से बाहर चाहते हैं। –

2

थोड़ा देर हो चुकी है लेकिन मुझे लगभग एक ही समस्या है। प्रक्रिया पर memoryLimit सेटिंग के साथ समस्या यह है कि ऐसा प्रतीत होता है कि ऐसा दस्तावेज होने के बावजूद इसका कोई प्रभाव नहीं पड़ता है।

percentagePhysicalMemoryUsedLimit इसी तरह दिखता है कि इसे कुछ करना चाहिए लेकिन इसका कोई प्रभाव नहीं है।

privateBytesLimit="20000000000" हालांकि काम करता है। मैं चला गया और प्रक्रिया को डीबग किया और कैशमेमरी साइजप्रेस ऑब्जेक्ट पाया और इसे सफलतापूर्वक मूल्य उठाया और इसे _memoryLimit पर सेट किया। मैं इसे दोबारा जांचूंगा।

एक और विकल्प आईआईएस ऐप पूल पर एक निजी मेमोरी उपयोग रीसायकल थ्रेसहोल्ड स्थापित कर रहा है। इसे भी उठाया जाना चाहिए और डिफ़ॉल्ट 60% सीमा को ओवरराइड करना चाहिए।

एक तीसरा विकल्प नए MemoryCache कक्षा का उपयोग कर रहा है और PhysicalMemoryLimit पर सेट कर रहा है।

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