2009-11-03 8 views
9

ASP.NET विकास के वर्षों के बाद मैं वास्तव में काफी हैरान है कि मैं इस के लिए एक संतोषजनक समाधान खोजने के लिए प्रतीत नहीं कर सकते है एक ASP.NET IIS वेबसाइट उत्तरदायी रखें।जब दौरों के बीच समय लंबे

निष्क्रियता के एक निश्चित समय (कई घंटों के बाद) के बाद आईआईएस एएसपी.NET साइट हमेशा सोती है (2-6 सेकेंड के लिए), जिसके दौरान सर्वर से क्लाइंट तक कोई HTTP प्रतिक्रिया नहीं भेजी जाती है। सेटिंग्स के बावजूद यह किसी भी प्रकार की साइट, एक पेज या कई, डीबी या नहीं होता है। मैं इसे कैसे ठीक करूं?

प्रतीक्षा समय के दौरान, सर्वर व्यस्त नहीं है और कोई ऊंची चोटियों या (.NET) स्मृति की कमी कर रहे हैं। मेरा अनुमान है, विंडोज़ को आईआईएस प्रक्रिया को पृष्ठभूमि में और इसकी याददाश्त पेज फ़ाइल में ले जाने के साथ करना है, लेकिन मुझे यकीन नहीं है। किसी को कोई विचार है?

संपादित करें: एक ही समाधान लगभग एक घंटे के एक बार कुछ HTTP अनुरोध भेजना है, लेकिन मैं अधिक रचनात्मक कुछ के लिए उम्मीद है।
संपादित करें: मेरा मतलब क्या है: निष्क्रियता के घंटों के बाद, यह किसी भी नए HTTP अनुरोध पर कई सेकंड रोक देता है।

+0

+1, लेकिन सर्वरफॉल्ट पर संबंधित है। –

+0

क्या आप अपनी साइट संकलित कर रहे हैं? यदि नहीं, तो आप कुछ बहुत बड़े प्रदर्शन सुधारों पर अनुपलब्ध हैं। – codethrift

+0

@theminesgreg: साइट संकलित की जाती हैं, डीबग सेट नहीं है, ऑप्टिमाइज़ेशन (किसी भी) डीएलएस के लिए चालू हैं। @ जॉन: सुनिश्चित नहीं यह serverfault पर अंतर्गत आता है, के रूप में यह वास्तव में मुझे एक प्रोग्रामर के रूप परेशानी पैदा करती है, लेकिन मेरे को सही अगर मैं गलत – Abel

उत्तर

5

आईआईएस के लिए डिफ़ॉल्ट टाइमआउट 20 मिनट है। इसका क्या अर्थ है यदि आपका एएसपी.नेट आवेदन 20 मिनट के लिए कोई नया अनुरोध नहीं प्राप्त करता है, तो यह कार्यकर्ता प्रक्रिया को बंद कर देगा। मैं एक साथ रखा एक सरल सहायक वर्ग है कि मानक टाइमआउट समस्या का समाधान - मूल रूप से: स्मृति, precompilation में लोड विधानसभाओं, आदि

(संपादित - यह कुछ भी नहीं है से प्रक्रिया को गर्म करने के लिए समय की एक काफी मात्रा में ले जा सकते हैं नीचे)

पर कोड - वेब अनुप्रयोग "pokes" खुद हर बार प्रक्रिया को जीवित रखने के लिए आदर्श दृष्टिकोण IIS में सेटिंग बदलने के लिए है, लेकिन सर्वर जहां यह संभव नहीं है के लिए, मेरी कक्षा काफी अच्छी तरह से काम करता है।।

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

हमेशा की तरह, आपके आवेदन की रूपरेखा ठोस जानकारी उपज के लिए एक ही रास्ता है। ANTS जैसे उत्पाद का उपयोग करने से आपको यह निर्धारित करने में मदद मिलेगी कि आपका एप्लिकेशन कितना समय व्यतीत कर रहा है, ताकि आप "लटका" कहां से अलग हो सकें।

public class KeepAlive 
{ 
    private static KeepAlive instance; 
    private static object sync = new object(); 
    private string _applicationUrl; 
    private string _cacheKey; 

    private KeepAlive(string applicationUrl) 
    { 
     _applicationUrl = applicationUrl; 
     _cacheKey = Guid.NewGuid().ToString(); 
     instance = this; 
    } 

    public static bool IsKeepingAlive 
    { 
     get 
     { 
      lock (sync) 
      { 
       return instance != null; 
      } 
     } 
    } 

    public static void Start(string applicationUrl) 
    { 
     if(IsKeepingAlive) 
     { 
      return; 
     } 
     lock (sync) 
     { 
      instance = new KeepAlive(applicationUrl); 
      instance.Insert(); 
     } 
    } 

    public static void Stop() 
    { 
     lock (sync) 
     { 
      HttpRuntime.Cache.Remove(instance._cacheKey); 
      instance = null; 
     } 
    } 

    private void Callback(string key, object value, CacheItemRemovedReason reason) 
    { 
     if (reason == CacheItemRemovedReason.Expired) 
     { 
      FetchApplicationUr(); 
      Insert(); 
     } 
    } 

    private void Insert() 
    { 
     HttpRuntime.Cache.Add(_cacheKey, 
      this, 
      null, 
      Cache.NoAbsoluteExpiration, 
      new TimeSpan(0, 10, 0), 
      CacheItemPriority.Normal, 
      this.Callback); 
    } 

    private void FetchApplicationUrl() 
    { 
     try 
     { 
      HttpWebRequest request = HttpWebRequest.Create(this._applicationUrl) as HttpWebRequest; 
      using(HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       HttpStatusCode status = response.StatusCode; 
       //log status 
      } 
     } 
     catch (Exception ex) 
     { 
      //log exception 
     } 
    } 
} 

उपयोग (App_Start में शायद):

KeepAlive.Start("http://www.yoursite.com/"); 
+0

आप कुछ दिलचस्प विचारों को इंगित करते हैं। मुझे हमेशा लगता है कि यह कभी भी 'Application_Start' नहीं मिला है, लेकिन मुझे क्या पता चलेगा, शायद यह वहां जाता है, libs लोड करता है, और फिर फिर से शुरू होता है। कृपया ध्यान दें कि समय 20min (सत्र समय समाप्ति समय) नहीं है, यह लगभग 3+ घंटों के बाद थोड़ी देर के लिए चुटकुले करता है, लेकिन मुझे यकीन नहीं है। समय परिवर्तनीय हो सकता है। यह सिर्फ "एक साइट" नहीं है, यह कई प्रणालियों और आईआईएस/विंडोज संस्करणों पर "सभी साइटें" है। हालांकि सभी .NET 3.5 हैं। – Abel

+0

* "लेकिन मुझे क्या पता है" * >>> कहने का मतलब था: मुझे लॉग इन करना चाहिए, या ट्रेस को या जो कुछ भी चालू करना चाहिए। मुझे एंट्स पता है लेकिन यह सुनिश्चित नहीं है कि यह यहां मदद कर सकता है: अवरोध कुछ भी लोड होने से पहले होता है, जिसमें एएनटीएस शामिल होगा। – Abel

+0

बस यहां एक ही टिप्पणी देखी गई http://www.eggheadcafe.com/software/aspnet/30548981/slow-site-startup.aspx, जो इस निष्क्रिय टाइमआउट का उल्लेख करती है। यह स्थानीय रूप से नहीं होता है, केवल विन्यास पर रिमोट मैं हमेशा प्रबंधित नहीं करता हूं। यह पता लगाने में लंबा समय नहीं लगाना चाहिए कि यह सब इस सेटिंग में है या नहीं। – Abel

1

आप आईआईएस 7 एक आईआईएस प्लगइन कॉल आवेदन IIS टीम से ऊपर गर्म है उपयोग कर रहे हैं में मदद मिलेगी कि सब कुछ toasty रखेंगे

मैंने इसका उपयोग करके अपने अनुभवों के बारे में blog post लिखा है।

+1

दिलचस्प प्लगइन। साथ ही, 20 मिनट का टाइमआउट एप्लिकेशन पूल पर सेट किया जा सकता है। मैंने इसे अधिकांश सर्वरों पर 24 घंटों तक सेट किया है, जो मदद करता है (पीएस: आपकी साइट उत्तरदायी नहीं है ...) – Abel

+0

हिंसक - मुझे लगता है कि ब्लॉग हाहा का पुनर्निर्माण कर रहा था - कितना विडंबनापूर्ण – Doug

0

यदि आप इस समय अपने कोड को केवल संकलित कर रहे हैं, तो आप पर भी अपनी एएसपीएक्स फ़ाइलों को संकलित समय (रनटाइम की बजाय, जो डिफ़ॉल्ट है) को पूर्व-संकलित करना चाहेंगे। मेरा मानना ​​है कि यह फ्लाई संकलन पर सबसे अधिक समय लेता है जब एक निष्क्रिय एएसपी.नेट साइट जागृत होती है। आप इसके बारे में here और अधिक पढ़ सकते हैं।

अद्यतन:

अनुप्रयोग पूल को मार डाला हो जाता है जब IdleTime-आउट मूल्य तक पहुँच जाता है - 20mins को यह चूक (आप यह मान बदल सकते हैं)। क्या आप सुनिश्चित हैं कि इस मामले में ऐप को पुनरारंभ करने के बाद UI को पुन: संकलित नहीं किया जा रहा है? (मुझे यकीन नहीं है कि यह एक यूआई recompile मजबूर करता है या नहीं)।

+0

आपका कथन सही है, संकलित पृष्ठ केवल एक बार होता है , भले ही आप प्रीकंपिलिंग का चयन नहीं करते हैं (जो कि अगर मैं किसी प्रोजेक्ट में कहता हूं तो मुझे पसंद है)। प्रश्न में उल्लिखित मुद्दा किसी भी 20 मिनट की निष्क्रियता के बाद होता है और इसे एप्लिकेशन पूल का "नींद मोड" माना जा सकता है। यदि आपके पास एक छोटी स्थानीय वेबसाइट है तो अपने लॉग जांचें: जब पहले ग्राहक 4AM पर पहुंचते हैं, तो आपको पहले अनुरोधों के लिए एक लंबा प्रतीक्षा समय दिखाई देगा। – Abel

+0

आईआईएस का कौन सा संस्करण आप उपयोग कर रहे हैं? और क्या आपके पास आईआईएस तक व्यवस्थापक पहुंच है? – UpTheCreek

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