2012-11-14 17 views
7

मैंने this, this, this और this और एक दर्जन अन्य पोस्ट/ब्लॉग पढ़े हैं।एप्लिकेशन को स्वचालित ऐप पूल रीसायकल पर आग लगाना चाहिए?

मेरे पास साझा होस्टिंग में एक एएसपी.Net ऐप है जो अक्सर रीसाइक्लिंग होता है। हम NLog का उपयोग करें और Global.asax

void Application_Start(object sender, EventArgs e) 
{ 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Debug("\r\n\r\nAPPLICATION STARTING\r\n\r\n"); 
} 
protected void Application_OnEnd(Object sender, EventArgs e) 
{ 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Debug("\r\n\r\nAPPLICATION_OnEnd\r\n\r\n"); 
} 

void Application_End(object sender, EventArgs e) 
{ 
     HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null); 

if (runtime == null) 
    return; 

string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); 

string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); 

ApplicationShutdownReason shutdownReason = System.Web.Hosting.HostingEnvironment.ShutdownReason; 

NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
logger.Debug(String.Format("\r\n\r\nAPPLICATION END\r\n\r\n_shutDownReason = {2}\r\n\r\n _shutDownMessage = {0}\r\n\r\n_shutDownStack = {1}\r\n\r\n", 
       shutDownMessage, shutDownStack, shutdownReason)); 
} 

void Application_Error(object sender, EventArgs e) 
{ 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Debug("\r\n\r\nApplication_Error\r\n\r\n"); 

} 

हमारे लॉग फ़ाइल "आवेदन शुरूआती" प्रविष्टियों से अटे पड़े है में निम्नलिखित कोड है, लेकिन न तो Application_OnEnd, Application_End, और न ही Application_Error कभी इन सहज पुनरारंभ के दौरान निकाल दिया जाता है। मुझे पता है कि वे काम कर रहे हैं क्योंकि web.config या/bin फ़ाइलों को छूने के लिए प्रविष्टियां हैं। हमने एक मेमोरी अधिभार परीक्षण भी चलाया और OutOfMemoryException को ट्रिगर कर सकता है जो Application_Error में पकड़ा गया है।

हम यह निर्धारित करने की कोशिश कर रहे हैं कि वर्चुअल मेमोरी सीमा रीसाइक्लिंग का कारण बन रही है या नहीं। हमने पूरे कोड में GC.GetTotalMemory(false) जोड़ा है, लेकिन यह सभी .Net है, न केवल हमारे ऐप के पूल, सही है? हमने

var oPerfCounter = new PerformanceCounter(); 
oPerfCounter.CategoryName = "Process"; 
oPerfCounter.CounterName = "Virtual Bytes"; 
oPerfCounter.InstanceName = "iisExpress"; 
logger.Debug("Virtual Bytes: " + oPerfCounter.RawValue + " bytes"); 

पर भी साझा होस्टिंग की अनुमति नहीं है।

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

  • मैं कैसे प्रभावी रूप से साझा बताने के लिए कितना अपने आवेदन के लिए एक आवेदन रीसायकल करने से पहले लेने वाली है की मेजबानी में स्मृति के उपयोग की निगरानी कर सकते:

    मेरे सवालों इन कर रहे हैं?

  • global.asax में एप्लिकेशन_ [एंड/ऑन एंड/त्रुटि] हैंडलर क्यों नहीं कहा जा रहा है?
  • मैं यह निर्धारित कैसे कर सकता हूं कि इन रीसायकल का कारण क्या है?

धन्यवाद।

संपादित करें: @Jani Hyytiäinen द्वारा जवाब के आधार पर

परिदृश्य: थ्रेड # 1 शुरू होता है और धागा # 2 द्वारा पीछा किया। थ्रेड # 1 मेमोरी सीमा हिट करता है लेकिन प्रसंस्करण जारी है। थ्रेड # 3 शुरू होता है। थ्रेड # 1 समाप्त होता है, लेकिन # 1 ने 60 सेकंड से अधिक प्रक्रियाओं को # 1 के बाद स्मृति सीमा को मारा है।

पूल तब अपमानजनक रूप से बंद हो जाता है? क्या http प्रतिक्रियाएं # 2 & # 3 प्राप्त होंगी (ये AJAX कॉल हैं, लेकिन मुझे फिडलर में 504 त्रुटियां मिल रही हैं)?
क्या # 3 के लिए अनुरोध स्वीकार किया गया है या क्या यह एक नया पूल शुरू होने तक बस कतार है?
क्या यह जानने का कोई तरीका है कि स्मृति सीमा को मारा गया है या होने वाला है?

कोई भी रणनीतियां आपका स्वागत है।

+0

HTTP 504 गेटवे समय समाप्त वास्तव में आपकी साइट से वापस नहीं। आपके मामले में, शायद इसलिए कि ऐप पूल बंद कर दिया गया था और नया अभी तक शुरू नहीं हुआ था। जब एप्लिकेशन पूल बंद हो जाता है, तो इसमें सभी धागे इसके साथ निकल जाएंगे। जो सबसे निश्चित रूप से धागे # 2 और # 3 –

उत्तर

12

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

0

मैंने अपने अनुप्रयोगों में से एक को देखा जो शटडाउन घटनाओं को सही तरीके से चलाता है, और यहां ग्लोबल.एक्सएक्स में हस्ताक्षर है।सीएस:

protected void Application_End(object sender, EventArgs e) 
{ 
    ApplicationShutdownReason shutdownReason = System.Web.Hosting.HostingEnvironment.ShutdownReason; 
    // Write to log 
} 

फर्क सिर्फ इतना है कि मैं लगता है कि आपकी "Application_End" और "Application_Error" तरीकों "संरक्षित" संशोधक नहीं है। मैंने कई स्थितियों को देखा है जहां प्रतिबिंब निजी सदस्यों के साथ काम नहीं करता है, ताकि यह खेल सके।

इसके अलावा, अपने स्थानीय/देव अनुप्रयोग पूल पर अपने idle timeout को कुछ कम (जैसे 1 मिनट) पर सेट करने का प्रयास करें, और फिर सुनिश्चित करें कि आपका एप्लिकेशन_इंड ईवेंट स्थानीय रूप से आग लग जाए।

ध्यान दें कि डिफ़ॉल्ट आईआईएस द्वारा अनुप्रयोग पूल कोई अनुरोध के 20 मिनट के बाद पुनरावृत्ति है, तो आपको लगता है कि मार रहा हो सकता है अगर आप एक कम यातायात आवेदन किया है। साथ ही, कुछ साझा होस्टिंग प्रदाता संसाधनों को बचाने के लिए इस "निष्क्रिय टाइमआउट" मान को कम करने के लिए बदलते हैं।

+1

धन्यवाद पर 504 HTTP की ओर जाता है, लेकिन जैसा कि मैंने कहा कि हम बंद के अन्य प्रकार के लिए Application_End घटना हो रही है, "मुझे पता है कि वे काम कर रहे हैं क्योंकि वहाँ web.config को छू या के लिए प्रविष्टियां होती हैं/बिन फाइलें। " प्यारा तस्वीर बीटीडब्ल्यू :) – Laramie

+1

@ लारामी, क्षमा करें, मुझे गलत समझा गया। क्या आपने अपने देव पर्यावरण [वर्चुअल मेमोरी सीमा] (http://technet.microsoft.com/en-us/library/cc753179 (v = ws.10) .aspx) को सेट करने का प्रयास किया है, यह देखने के लिए कि आप वास्तव में कम कर सकते हैं या नहीं साझा वातावरण में जो व्यवहार आप देख रहे हैं उसे पुन: उत्पन्न करें? –

+0

हम उस पर आगे बढ़ रहे हैं ताकि हम स्मृति उपयोग को ट्रैक कर सकें। इस बीच हम अनुकूल रहे हैं और समय के लिए इसे नियंत्रण में रखते हैं। मुझे नहीं लगता कि यहां एक आसान जवाब होगा, लेकिन मैं एक को अपवित्र करने के लिए रोमांचित होगा! – Laramie

0

सुनिश्चित नहीं हैं कि आईआईएस के किस संस्करण का उपयोग कर रहे हैं, लेकिन IIS7.5 पर वहाँ अनुप्रयोग पूल रीसायकल ईवेंट लॉग सेटिंग्स है कि आप ऐप पूल रीसाइक्लिंग के लिए कारणों के प्रवेश करने के लिए अनुमति देते हैं का एक समूह है।

आईआईएस में आवेदन ताल के पास जाकर विचाराधीन एप्लिकेशन पूल पर उन्नत सेटिंग पर जाएं। रीसाइक्लिंग पर जाएं और वहां और उप-मेन्यू "जेनरेट रीसायकल इवेंट लॉग एंट्री" कहा जाता है। के बाद से त्रुटि ही संसाधन यूआरएल द्वारा अनुरोध एक समय पर ढंग कोई जवाब नहीं दिया इसका मतलब

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