2012-11-14 11 views
101

के लिए धीमी प्रारंभिक लोड को ठीक करना आईआईएस में कम यातायात वेबसाइटों के लिए एक कष्टप्रद विशेषता है जहां यह अप्रयुक्त कार्यकर्ता प्रक्रियाओं को पुन: उपयोग करता है, जिससे कुछ उपयोगकर्ता बाद में बहुत देर से देरी (30+ सेकेंड) प्राप्त करने के लिए साइट पर जाते हैं।आईआईएस

मैं समस्या का हल ढूंढ रहा हूं और मुझे इन संभावित समाधान मिल गए हैं।

Use the Application Initialization plugin

बी Use Auto-Start with .NET 4

सी Disable the idle-timeout (under IIS Reset)

डी Precompile the site

मैं सोच रहा हूँ जो इनमें से पसंद किया जाता है, और अधिक महत्वपूर्ण बात, क्यों वहाँ बहुत हैं एक ही समस्या के कई समाधान? (मेरा अनुमान है कि वे नहीं हैं, और मैं बस कुछ सही ढंग से समझ नहीं रहा हूं)।

संपादित

सी प्रदर्शन अपनी साइट गरम रखने के लिए पर्याप्त हो रहा है, लेकिन मुझे पता चला है अपनी साइट की सुस्ती की असली जड़ इकाई की रूपरेखा के साथ क्या करना है, जो मैं कर सकते हैं है कि ' ऐसा लगता है कि यह क्यों ठंडा हो रहा है। this प्रश्न देखें, जो दुर्भाग्य से उत्तर नहीं दिया गया है अभी तक का उत्तर दिया गया है!

अंत में मुझे यह सुनिश्चित करने के लिए कभी-कभी warm up script बनाना था ताकि यह सुनिश्चित किया जा सके कि यह तेज़ी से रहे।

+0

हाय दोस्त, क्या सी पर्याप्त प्रदर्शन कर रहा है? क्यूं कर ? क्या हमें केवल इसका उपयोग करने की आवश्यकता है या फिर भी पुनर्नवीनीकरण अक्षम करने की आवश्यकता है? मैं हमेशा दूसरे दिन महसूस करता हूं कि आईआईएस 7.5 – qakmak

उत्तर

26

विकल्प ए, बी और डी एक ही श्रेणी में प्रतीत होते हैं क्योंकि वे केवल प्रारंभिक प्रारंभ समय को प्रभावित करते हैं, वे स्मृति में पुस्तकालयों के संकलन और लोडिंग जैसी वेबसाइट का गर्मजोशी करते हैं।

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

जहां तक ​​मुझे पता है, समय-समय पर स्मृति को सहेजने के लिए मौजूद है कि उस मशीन पर समानांतर में चल रही अन्य वेबसाइटों की आवश्यकता हो सकती है। कीमत एक बार धीमी लोड समय है।

इस तथ्य के अलावा कि उपयोगकर्ता निष्क्रियता के मामले में ऐप पूल बंद हो जाता है, ऐप पूल प्रत्येक 1740 मिनट (2 9 घंटे) डिफ़ॉल्ट रूप से रीसायकल भी करेगा।

TechNet से

:

इंटरनेट सूचना सेवा (आईआईएस) अनुप्रयोग पूल समय-समय पर अस्थिर कहा गया है कि अनुप्रयोग क्रैश, रुक जाता है, या मेमोरी लीक करने के लिए नेतृत्व कर सकते हैं से बचने के लिए पुनर्नवीनीकरण किया जा सकता है।

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

+0

की बहुत धीमी गति से अनुरोध है, तो क्या आप केवल निष्क्रिय समय-समय पर अक्षम करने की अनुशंसा करेंगे? क्या यह लाइन के साथ मुद्दों का कारण बनता है (मुझे लगता है कि यह एक कारण के लिए है)? –

+0

यह वास्तव में मेरी समस्या को ठीक नहीं करता है (मेरा संपादन देखें), लेकिन मैंने स्वीकार किया क्योंकि आपने मेरे मूल प्रश्न का उत्तर दिया था। –

2

मैं बी का उपयोग करता हूं क्योंकि कार्यकर्ता प्रक्रिया रीसाइक्लिंग के संयोजन के साथ इसका मतलब है कि यह रीसाइक्लिंग के दौरान केवल देरी होगी। यह निष्क्रिय होने के बाद पहले अनुरोध के जवाब में सामान्य रूप से प्रारंभिकता से जुड़ी देरी से बचाता है।आपको रीसाइक्लिंग के लाभ भी मिलते हैं।

1

प्रदर्शन आलेखों की सहायता करने के तरीकों के लिए इस आलेख को देखें। इसमें "ठंडे प्रारंभ" खंड के तहत शुरू होने से संबंधित प्रदर्शन मुद्दों दोनों शामिल हैं। इससे कोई फर्क नहीं पड़ता कि आप स्थानीय स्तर पर या उत्पादन में किस प्रकार का सर्वर उपयोग कर रहे हैं।

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

आवेदन एक्सएमएल से कुछ भी deserializes (और है कि वेब सेवाओं में शामिल हैं ...) यकीन है कि SGEN deseriaization में शामिल सभी बाइनरी से चलाया जाता है बनाने के लिए और वैश्विक असेंबली कैश में जिसके परिणामस्वरूप DLLs जगह (GAC) । यह precompiles विधानसभा द्वारा उपयोग की जाने वाली सभी serialization वस्तुओं एसजीईएन के खिलाफ चलाया गया था और परिणामस्वरूप डीएलएल में उन्हें कैश। यह डिस्क से कॉन्फ़िगरेशन फ़ाइलों के पहले deserialization (लोडिंग) और वेब सेवाओं के लिए प्रारंभिक कॉल पर भारी समय बचत दे सकता है। http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

किसी भी आईआईएस सर्वर इंटरनेट से बाहर जाने वाले का उपयोग, नहीं है, तो प्रमाणपत्र प्रतिसंहरण सूची (सीआरएल) को बंद करने generatePublisherEvidence = machine.config में "गलत" जोड़कर एथेंटिकोड binaries के लिए जाँच। अन्यथा प्रत्येक कार्यकर्ता प्रक्रियाएं स्टार्ट-अप के दौरान 20 सेकंड से अधिक समय तक लटका सकती हैं, जबकि यह एक सीआरएल सूची प्राप्त करने के लिए इंटरनेट से कनेक्ट करने का प्रयास करती है। http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

सभी विधानसभाओं पर NGEN उपयोग पर विचार करें। हालांकि सावधानीपूर्वक उपयोग किए बिना यह प्रदर्शन का अधिक लाभ नहीं देता है। ऐसा इसलिए है क्योंकि प्रत्येक प्रक्रिया द्वारा लोड की जाने वाली सभी बाइनरी के बेस लोड पते को ओवरलैप न करने के लिए बिल्ड समय पर ध्यान से सेट किया जाना चाहिए। यदि पता लगने के कारण बाइनरी को रिबैड किया जाना है, तो एनजीईएन का उपयोग करने के लगभग सभी प्रदर्शन लाभ खो जाएंगे। http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

2

एक पिंग सेवा/स्क्रिप्ट अपने निष्क्रिय वेबसाइट हिट करने के लिए लेखन बल्कि क्योंकि आप एक पूरा नियंत्रण होगा जाने के लिए एक सबसे अच्छा तरीका है। आपके द्वारा उल्लिखित अन्य विकल्प उपलब्ध होंगे यदि आपने समर्पित होस्टिंग बॉक्स किराए पर लिया है।

साझा होस्टिंग स्थान में, हॉटअप स्क्रिप्ट सबसे पहले प्रथम स्तर की रक्षा हैं (स्वयं सहायता सबसे अच्छी सहायता है)। यहां एक लेख है जो idea on how to do it from your own web application साझा करता है।

+0

ने इस पुराने धागे को अभी अपडेट किया है, अगर कोई इसे खोजता है –

6

वेब होस्टिंग चैलेंज

आप को याद है कि मशीन विन्यास से कोई भी विकल्प उपलब्ध हैं यदि आप हम में से कई के रूप में एक साझा सर्वर पर होस्ट कर रहे हैं (छोटी कंपनियों और व्यक्तियों) कर रहे हैं।

ASP.NET MVC ओवरहेड

मेरी साइट में कम से कम 30 सेकंड जब यह 20 मिनट से अधिक में मारा नहीं किया गया है (और वेब अनुप्रयोग रोक दिया गया है) लेता है। यह भयानक है।

एक और रास्ता टेस्ट प्रदर्शन

वहाँ एक और तरीका है अगर यह आपके ASP.NET MVC है शुरू या कुछ और परीक्षण करने के लिए है। अपनी साइट पर एक सामान्य HTML पृष्ठ ड्रॉप करें जहां आप इसे सीधे हिट कर सकते हैं।
यदि समस्या एएसपी.नेट एमवीसी से शुरू होती है तो एचटीएमएल पेज लगभग तुरंत प्रस्तुत करेगा जब भी वेब ऐप शुरू नहीं हुआ है।
इस तरह मैंने पहली बार यह पहचाना कि समस्या एएसपी.नेट एमवीसी स्टार्टअप में थी। मैंने किसी भी समय एक HTML पृष्ठ लोड किया और यह तेज तेज लोड होगा। फिर, कि HTML पृष्ठ से टकराने के बाद मैं अपने ASP.NET MVC URL में से एक मारा और मैं क्रोम संदेश मिलता था "raddev.us की प्रतीक्षा में ..."

एक और टेस्ट सहायक स्क्रिप्ट

के साथ

इसके बाद मैंने एक LINQPad लिखा (अधिक के लिए http://linqpad.net देखें) स्क्रिप्ट जो हर 8 मिनट में मेरी वेबसाइट को हिट करेगी (ऐप को अनलोड करने के समय से कम - जो 20 मिनट होनी चाहिए) और मैंने इसे घंटों तक चलाने दिया ।

जबकि स्क्रिप्ट चल रही थी, मैंने अपनी वेबसाइट पर हिट किया और हर बार जब मेरी साइट तेज रफ्तार से आई। यह मुझे एक अच्छा विचार देता है कि सबसे अधिक संभावना है कि मैं अनुभव कर रहा था एएसपी.नेट एमवीसी स्टार्टअप समय के कारण था।

लिंककैड प्राप्त करें और आप निम्न स्क्रिप्ट चला सकते हैं - बस यूआरएल को अपने आप में बदलें और इसे चलाने दें और आप इसे आसानी से जांच सकते हैं। शुभकामनाएँ।

नोट: LINQPad में आप F4 दबाएँ और पुस्तकालय जो अपने पृष्ठ को पुनः प्राप्त करेगा जोड़ने के लिए System.Net के लिए एक संदर्भ जोड़ने की आवश्यकता होगी।

ALSO: सुनिश्चित करें कि आप एक यूआरएल पर इंगित करने के लिए स्ट्रिंग यूआरएल वैरिएबल बदलते हैं जो आपके एएसपी.नेट एमवीसी साइट से रूट लोड करेगा ताकि इंजन चल सके।

System.Timers.Timer webKeepAlive = new System.Timers.Timer(); 
Int64 counter = 0; 
void Main() 
{ 
    webKeepAlive.Interval = 5000; 
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed; 
    webKeepAlive.Start(); 
} 

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    webKeepAlive.Stop(); 
    try 
    { 
     // ONLY the first time it retrieves the content it will print the string 
     String finalHtml = GetWebContent(); 
     if (counter < 1) 
     { 
      Console.WriteLine(finalHtml); 
     } 
     counter++; 
    } 
    finally 
    { 
     webKeepAlive.Interval = 480000; // every 8 minutes 
     webKeepAlive.Start(); 
    } 
} 

public String GetWebContent() 
{ 
    try 
    { 
    String URL = "http://YOURURL.COM"; 
    WebRequest request = WebRequest.Create(URL); 
    WebResponse response = request.GetResponse(); 
    Stream data = response.GetResponseStream(); 
    string html = String.Empty; 
    using (StreamReader sr = new StreamReader(data)) 
    { 
     html = sr.ReadToEnd(); 
    } 
    Console.WriteLine (String.Format("{0} : success",DateTime.Now)); 
    return html; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message)); 
     return "fail"; 
    } 
} 
2

एक समय पर साइट को पिंग करने के लिए एक अच्छा विकल्प माइक्रोसॉफ्ट फ्लो, जो अप करने के लिए 750 प्रति माह "रन" के लिए नि: शुल्क है उपयोग करने के लिए है। फ़्लो बनाना बहुत आसान है जो इसे गर्म रखने के लिए हर घंटे आपकी साइट को हिट करता है। आप अपनी साइट के कई हिट को अलग करने में देरी के साथ एकल प्रवाह बनाकर 750 की अपनी सीमा के आसपास भी काम कर सकते हैं।

https://flow.microsoft.com