मैंने 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 के लिए अनुरोध स्वीकार किया गया है या क्या यह एक नया पूल शुरू होने तक बस कतार है?
क्या यह जानने का कोई तरीका है कि स्मृति सीमा को मारा गया है या होने वाला है?
कोई भी रणनीतियां आपका स्वागत है।
HTTP 504 गेटवे समय समाप्त वास्तव में आपकी साइट से वापस नहीं। आपके मामले में, शायद इसलिए कि ऐप पूल बंद कर दिया गया था और नया अभी तक शुरू नहीं हुआ था। जब एप्लिकेशन पूल बंद हो जाता है, तो इसमें सभी धागे इसके साथ निकल जाएंगे। जो सबसे निश्चित रूप से धागे # 2 और # 3 –