कैसे करें "वार्म अप" एंटिटी फ्रेमवर्क? इसे "ठंडा" कब मिलता है?


118

नहीं, मेरे दूसरे सवाल का जवाब सर्दी नहीं है।

प्रस्तावना:

मैं हाल ही में एंटिटी फ्रेमवर्क पर बहुत सारे शोध कर रहा हूं और कुछ ऐसा जो मुझे परेशान करता है, वह है इसका प्रदर्शन जब प्रश्नों को गर्म नहीं किया जाता है, तो इसे शीत प्रश्न कहा जाता है।

मैं Entity फ्रेमवर्क 5.0 के लिए प्रदर्शन विचार लेख के माध्यम से चला गया । लेखकों ने वार्म एंड कोल्ड क्वैश्चंस की अवधारणा को पेश किया और वे कैसे अलग हैं, जो मैंने उनके अस्तित्व के बारे में जाने बिना भी देखा। यहाँ शायद यह उल्लेख करने लायक है कि मुझे अपनी पीठ के पीछे केवल छह महीने का अनुभव है।

अब मुझे पता है कि अगर मैं प्रदर्शन के मामले में रूपरेखा को बेहतर ढंग से समझना चाहता हूं तो मैं किन विषयों पर अतिरिक्त शोध कर सकता हूं। दुर्भाग्य से इंटरनेट पर अधिकांश जानकारी पुरानी हो गई है या विषय-वस्तु के साथ फूला हुआ है, इसलिए वार्म बनाम कोल्ड्रिंक विषय पर कोई अतिरिक्त जानकारी प्राप्त करने में मेरी अक्षमता है ।

मूल रूप से मैंने अब तक जो देखा है, वह यह है कि जब भी मुझे हिटिंग या रिसाइकिलिंग हिट करनी होती है, तो मेरे शुरुआती सवाल बहुत धीमे होते हैं। बाद में पढ़ा जाने वाला कोई भी डेटा उम्मीद के मुताबिक तेज ( व्यक्तिपरक ) होता है।

हम Windows Server 2012, IIS8 और SQL Server 2012 में माइग्रेट हो रहे हैं और एक जूनियर के रूप में मैंने वास्तव में खुद को बाकी लोगों से पहले परीक्षण करने का अवसर जीता है। मुझे बहुत खुशी है कि उन्होंने एक वार्मिंग-अप मॉड्यूल पेश किया, जो मेरे आवेदन को उस पहले अनुरोध के लिए तैयार कर देगा। हालाँकि, मुझे यकीन नहीं है कि मैं अपने एंटिटी फ्रेमवर्क को गर्म करने के लिए कैसे आगे बढ़ूं।

जो मुझे पहले से पता है वह करने योग्य है:

  • सुझाए अनुसार अग्रिम में मेरे दृश्य उत्पन्न करें।
  • आखिरकार मेरे मॉडलों को एक अलग विधानसभा में स्थानांतरित करें।

मैं सामान्य ज्ञान के साथ, शायद गलत दृष्टिकोण के साथ क्या करने पर विचार करता हूं :

  • डमी डेटा करना, एप्लिकेशन को प्रारंभ में चीजों को गर्म करने, उत्पन्न करने और मॉडल को मान्य करने के लिए पढ़ता है।

प्रशन:

  • किसी भी समय मेरे एंटिटी फ्रेमवर्क पर उच्च उपलब्धता के लिए सबसे अच्छा तरीका क्या होगा?
  • किन मामलों में एंटिटी फ्रेमवर्क फिर से "ठंडा" हो जाता है? (पुनर्चक्रण, पुनर्चक्रण, IIS पुनः आरंभ आदि)

पता लगाएँ कि क्या यह दृश्य पीढ़ी या क्वेरी संकलन है जो आपको सबसे अधिक हिट करता है। यदि यह दृश्य जीन है तो पूर्वगामी दृश्यों का उपयोग करें। यदि यह प्रश्न है - क्या आपके पास एक बड़ी जटिल पदानुक्रम है? ध्यान दें कि आम तौर पर महंगी चीजें एक बार ऐप डोमेन के अनुसार होती हैं और कैश की जाती हैं इसलिए आप इस तरह की समस्याओं को देखते हैं जब ऐप डोमेन अनलोड होता है और एक नया बनाया जाता है।
पावेल नोव

मैंने पहले ही @ जनरेशन की व्यू जनरेशन का उल्लेख किया है, पदानुक्रम जटिल नहीं है, थोड़ा सा भी नहीं। लेकिन समस्या प्रधान भी है। आपके द्वारा कही गई बातों के बाद, मैं इस बात पर शोध करूंगा कि ऐप डोमेन कब अनलोड किया जा रहा है। हालाँकि, यह अभी भी अन्य समस्या की मदद नहीं करता है जो कि मामले में इकाई फ्रेमवर्क को गर्म कर रहा है, जैसा कि आपने कहा, ऐप डोमेन अनलोड हो जाता है। इस बिंदु पर, ऐसा लगता है कि ऐप डोमेन को अधिक से अधिक उतार दिया जाना चाहिए और मुझे यकीन नहीं है कि क्यों, रीसाइक्लिंग केवल रात में होता है, निष्क्रिय करना 0. पर सेट होता है
पीटर

4
आपको क्या लगता है कि डमी डेटा रीड करना गलत तरीका है?
जोश हेत्ज़मैन

5
यह सिर्फ सही नहीं लगता है, मैंने सोचा कि कुछ और अधिक सुंदर हो सकता है, जिसके बारे में मुझे जानकारी नहीं है। लेकिन अगर यह एकमात्र समाधान है और कोई अच्छा ज्ञान वाला व्यक्ति पुष्टि कर सकता है कि कोई दूसरा रास्ता नहीं है, तो मैं इसके साथ चलूँगा।
पीटर

1
गैर-गतिविधि (कम ट्रैफ़िक के कारण) की अवधि के बाद ऐप पूल बंद होने के साथ मुझे एक समस्या का सामना करना पड़ा, जो एक सेवा बनाने के लिए है जो आपके पृष्ठों में से एक के समय के अंतराल पर एक अनुरोध करता है। पहले अनुरोध पर ऐप पूल को पुनरारंभ करने से पहले यह लंबे समय तक देरी को रोकता है। या आप अपने डोमेन / आईपी को पिंग करने के लिए www.pingalive.com जैसी मुफ्त सेवा का उपयोग कर सकते हैं। यह आपके कैश्ड ऑब्जेक्ट्स को समाप्त होने से पहले ही साफ़ करने में मदद करता है।
Hatsrumandcode

जवाबों:


55
  • किसी भी समय मेरे एंटिटी फ्रेमवर्क पर उच्च उपलब्धता के लिए सबसे अच्छा तरीका क्या होगा?

आप पहले से देखे गए विचारों और स्थिर संकलित प्रश्नों के मिश्रण के लिए जा सकते हैं।

स्टेटिक CompiledQuerys अच्छे हैं क्योंकि वे लिखने में तेज हैं और प्रदर्शन को बढ़ाने में मदद करते हैं। हालांकि EF5 के साथ यह आवश्यक नहीं है कि आपके सभी प्रश्नों को संकलित किया जाए क्योंकि EF स्वतः ही प्रश्नों को संकलित करेगा। एकमात्र समस्या यह है कि कैश के बह जाने पर ये प्रश्न खो सकते हैं। तो आप अभी भी उन लोगों के लिए अपने स्वयं के संकलित प्रश्नों के संदर्भ रखना चाहते हैं जो केवल बहुत ही कम हो रहे हैं, लेकिन वे महंगे हैं। यदि आप उन प्रश्नों को स्थैतिक कक्षाओं में डालते हैं, तो उन्हें पहले आवश्यक होने पर संकलित किया जाएगा। कुछ प्रश्नों के लिए बहुत देर हो सकती है, इसलिए आप एप्लिकेशन स्टार्टअप के दौरान इन प्रश्नों के संकलन के लिए बाध्य कर सकते हैं।

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

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

लंबे समय तक एक ही संदर्भ पर पकड़ न रखें। प्रत्येक संदर्भ उदाहरण का अपना पहला स्तर कैश होता है जो प्रदर्शन को धीमा करता है क्योंकि यह बड़ा होता है। संदर्भ निर्माण सस्ता है, लेकिन संदर्भ के कैश्ड संस्थाओं के अंदर राज्य प्रबंधन महंगा हो सकता है। अन्य कैश (क्वेरी प्लान और मेटाडेटा) संदर्भों के बीच साझा किए जाते हैं और AppDomain के साथ एक साथ मर जाएंगे।

आप सभी को अक्सर संदर्भों को आवंटित करने और थोड़े समय के लिए उनका उपयोग करने के लिए सुनिश्चित करना चाहिए, ताकि आप अपना आवेदन जल्दी से शुरू कर सकें, कि आप उन प्रश्नों को संकलित करें जो शायद ही कभी उपयोग किए जाते हैं और उन प्रश्नों के लिए पूर्व-निर्धारित विचार प्रदान करते हैं जो प्रदर्शन महत्वपूर्ण हैं और अक्सर उपयोग किए जाते हैं।

  • किन मामलों में एंटिटी फ्रेमवर्क फिर से "ठंडा" हो जाता है? (पुनर्चक्रण, पुनर्चक्रण, IIS पुनः आरंभ आदि)

मूल रूप से, हर बार जब आप अपना AppDomain खो देते हैं। IIS हर 29 घंटे में पुनरारंभ करता है , इसलिए आप कभी भी यह गारंटी नहीं दे सकते हैं कि आपके आस-पास आपके उदाहरण होंगे। गतिविधि के बिना कुछ समय बाद AppDomain भी बंद हो जाता है। आपको फिर से जल्दी आने का प्रयास करना चाहिए। हो सकता है कि आप कुछ आरंभीकरण को अतुल्यकालिक रूप से कर सकते हैं (लेकिन बहु-थ्रेडिंग मुद्दों से सावधान रहें)। जब आप AppDomain को मरने से रोकने के लिए कोई अनुरोध नहीं करते हैं, तो आप ऐसे समय में अपने एप्लिकेशन में डमी पेजों को कॉल करने वाले अनुसूचित कार्यों का उपयोग कर सकते हैं, लेकिन यह अंततः होगा।

मैं यह भी मानता हूं कि जब आप अपनी कॉन्फ़िग फ़ाइल बदलते हैं या असेंबलियों को बदलते हैं तो एक पुनरारंभ होने जा रहा है।


धन्यवाद आंद्रे, कि मुझे क्या चाहिए था।
पीटर

@ और वास्तव में स्थिर संकलित प्रश्नों के साथ, पहला रन बहुत लंबा है। क्या इसके अलावा उन लोगों को गर्म करने का कोई तरीका है: डमी डेटा करना, एप्लिकेशन प्रारंभ करना, चीजों को गर्म करने, उत्पन्न करने और मॉडल को मान्य करने के लिए पढ़ता है।
19ish में manishKungwani

@ और इसलिए इकाई ढांचा 5 की जरूरत है या नहीं? क्या अलग है अगर यह ef5 पर उपयोग करें (मेरा मतलब है कि अभी भी धीमी या कम बल्लेबाज या अलग नहीं है?)
qakmak

"स्टेटिक कंपाइलडाइक अच्छे हैं क्योंकि वे लिखने में तेज और आसान हैं और प्रदर्शन को कम करने में मदद करते हैं।" प्रदर्शन कम?
गणितज्ञों

9

यदि आप सभी कॉलों में अधिकतम प्रदर्शन की तलाश में हैं तो आपको अपनी वास्तुकला पर ध्यान से विचार करना चाहिए। उदाहरण के लिए, यह तब संभव हो सकता है जब सर्वर हर बार अनुरोध पर डेटाबेस कॉल का उपयोग करने के बजाय लोड होने पर सर्वर रैम में प्री-कैश का इस्तेमाल करता है। यह तकनीक आमतौर पर उपयोग किए जाने वाले डेटा के लिए न्यूनतम आवेदन प्रतिक्रिया समय सुनिश्चित करेगी। हालाँकि, आप सुनिश्चित करें कि एक अच्छी तरह से व्यवहार की समाप्ति की नीति होना चाहिए या जब भी परिवर्तन किए जाते हैं, तो अपने कैश को साफ़ करें, जो कि संगृहीत मुद्दों से बचने के लिए कैश्ड डेटा को प्रभावित करते हैं।

सामान्य तौर पर, आपको वितरित आर्किटेक्चर को डिज़ाइन करने का प्रयास करना चाहिए, जब स्थानीय रूप से कैश्ड जानकारी बासी हो जाए, या लेन-देन करने की आवश्यकता हो, केवल IO आधारित डेटा अनुरोधों की आवश्यकता होती है। कोई भी "ओवर द वायर" डेटा अनुरोध आम तौर पर एक स्थानीय की तुलना में मेमोरी कैश पुनर्प्राप्ति में 10-1000 गुना अधिक समय लगेगा। यह अकेला तथ्य "स्थानीय बनाम दूरस्थ" डेटा समस्या की तुलना में अक्सर "ठंड बनाम गर्म डेटा" के बारे में चर्चा करता है।


यह एक अच्छा बिंदु है जिसे मैं अक्सर अनदेखा कर रहा हूं, जबकि इकाई रूपरेखा कच्चे प्रदर्शन के बारे में सम्मोहित हो रहा है। मैं इसे आगे देखूंगा और कैशिंग के सिद्धांतों में अधिक शोध करूंगा। हालांकि, ईएफ के संदर्भ में "ठंड बनाम गर्म" अभी भी कुछ ऐसा है जिसे मैं बेहतर समझना चाहता हूं।
पीटर

2
"यह अकेला तथ्य" स्थानीय बनाम दूरस्थ "डेटा समस्या की तुलना में अक्सर" ठंडा बनाम गर्म डेटा "के बारे में चर्चा करता है।" ज़रुरी नहीं। यदि आपके पास यह स्थानीय रूप से कैश नहीं है (जो आप शुरू में नहीं करेंगे), तब भी आपको अपने कैश को प्राइम करने के लिए ईएफ को हिट करना होगा और आरंभीकरण के दर्द को सहना होगा। उन्हीं स्थानों पर जहां आपका कैश अनइंस्टॉलिज्ड है, ईएफ अनइंस्टालिनेटेड होगा। इसलिए कैशिंग की एक परत को जोड़ने से मदद नहीं मिल सकती है यदि एकमात्र मुद्दा ईएफ इनिशियलाइज़ेशन टाइम है, लेकिन यह जटिलता की एक और परत जोड़ देगा ...
माइकजैनसेन

8

सामान्य टिप्स।

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

अब यह समझाने के लिए कि डमी अनुरोध गलत दृष्टिकोण क्यों नहीं है

  • कम जटिलता - आप एप्लिकेशन को इस तरीके से गर्म कर रहे हैं जो फ्रेमवर्क में परिवर्तन की परवाह किए बिना काम करेगा, और आपको इसे सही तरीके से करने के लिए संभवतः कायरतापूर्ण एपीआई / फ्रेमवर्क का पता लगाने की आवश्यकता नहीं है ।
  • ग्रेटर कवरेज - आप धीमे अनुरोध से संबंधित एक बार कैशिंग की सभी परतों को गर्म कर रहे हैं।

समझाने के लिए कि कैश कब "कोल्ड" हो जाता है।

यह आपके ढांचे में किसी भी परत पर होता है जो कैश लागू करता है, प्रदर्शन पृष्ठ के शीर्ष पर एक अच्छा वर्णन है ।

  • जब कभी किसी कैश को एक संभावित बदलाव के बाद मान्य किया जाना है जो कैश को बासी बनाता है, तो यह समयबाह्य या अधिक बुद्धिमान हो सकता है (यानी कैश्ड आइटम में परिवर्तन)।
  • जब कोई कैश आइटम निकाला जाता है, तो ऐसा करने के लिए एल्गोरिथ्म को आपके द्वारा लिंक किए गए प्रदर्शन लेख में अनुभाग "कैश बेदखली एल्गोरिथम" में वर्णित किया गया है , लेकिन संक्षेप में।
    • LFRU (कम से कम - हाल ही में उपयोग किया गया) हिट आइटम पर कैश और 800 वस्तुओं की सीमा के साथ आयु।

आपके द्वारा बताई गई अन्य चीजें, विशेष रूप से आईआईएस को पुनः आरंभ करने और पुनः आरंभ करने से या तो सभी या मेमोरी कैश में स्पष्ट हो जाते हैं।


यह एक और सहायक उत्तर है, बहुत सराहना की गई है।
पीटर

3

जैसा कि आपने कहा है, "पूर्व-निर्मित विचार" का उपयोग करें जो वास्तव में आपको करने की आवश्यकता है।

आपके लिंक से निकाला गया : "जब विचार उत्पन्न होते हैं, तो वे भी मान्य होते हैं। एक प्रदर्शन के दृष्टिकोण से, दृश्य पीढ़ी की लागत का विशाल बहुमत वास्तव में विचारों का सत्यापन है"

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

अप्रासंगिक प्रश्नों को निष्पादित करने के लिए सिस्टम संसाधनों का उपभोग करने के अलावा कोई अन्य उद्देश्य नहीं होगा।

शॉर्टकट ...

  1. पूर्व-निर्मित विचारों के अतिरिक्त कार्य को छोड़ दें
  2. अपना ऑब्जेक्ट संदर्भ बनाएं
  3. उस मीठी अप्रासंगिक क्वेरी को बंद कर दें
  4. फिर बस अपनी प्रक्रिया की अवधि (अनुशंसित नहीं) के लिए अपने ऑब्जेक्ट संदर्भ का संदर्भ रखें।


2

मुझे इस ढांचे का कोई अनुभव नहीं है। लेकिन अन्य संदर्भों में, उदाहरण के लिए, सोलर, पूरी तरह से डमी पढ़ता है जब तक कि आप पूरे डीबी (या सूचकांक) को कैश नहीं कर सकते हैं।

एक बेहतर तरीका यह होगा कि आप प्रश्नों को लॉग इन करें, लॉग से सबसे आम लोगों को निकालें और उन्हें वार्म अप करने के लिए उपयोग करें। बस सुनिश्चित करें कि वार्म अप प्रश्नों को लॉग न करें या आगे बढ़ने से पहले लॉग से हटा दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.