Tôi đã đọc this, this, this và this cùng với hàng tá bài đăng/blog khác.Application_End có nên kích hoạt trên App Pool Recycle tự động không?
Tôi có một ứng dụng ASP.Net trong chia sẻ lưu trữ thường xuyên được tái chế. Chúng tôi sử dụng NLog và có mã sau trong 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");
}
log file của chúng tôi là rải rác với mục "ĐƠN KHỞI", nhưng không phải Application_OnEnd
, Application_End
, cũng không Application_Error
được bao giờ bị sa thải trong những khởi động lại tự phát. Tôi biết họ đang làm việc vì có các mục nhập để chạm vào tệp web.config hoặc/bin. Chúng tôi cũng đã chạy kiểm tra quá tải bộ nhớ và có thể kích hoạt một số OutOfMemoryException
bị bắt trong Application_Error
.
Chúng tôi đang cố gắng xác định xem giới hạn bộ nhớ ảo có gây ra việc tái chế hay không. Chúng tôi đã thêm GC.GetTotalMemory(false)
trong suốt mã, nhưng điều này là dành cho tất cả .Net, không chỉ là hồ bơi của ứng dụng của chúng tôi, đúng không? Chúng tôi cũng đã thử
var oPerfCounter = new PerformanceCounter();
oPerfCounter.CategoryName = "Process";
oPerfCounter.CounterName = "Virtual Bytes";
oPerfCounter.InstanceName = "iisExpress";
logger.Debug("Virtual Bytes: " + oPerfCounter.RawValue + " bytes");
nhưng không được phép chia sẻ lưu trữ.
Tôi đã theo dõi ứng dụng trên máy chủ dev có cùng yêu cầu khiến việc tái chế trong sản xuất với ANTS Memory Profiler được đính kèm và dường như không thể tìm thấy thủ phạm. Chúng tôi cũng đã chạy nó với một trình gỡ lỗi được đính kèm trong dev để kiểm tra các ngoại lệ chưa được bắt đầu trong các luồng được sinh ra có thể khiến ứng dụng bị hủy bỏ.
Câu hỏi của tôi là những:
- Làm thế nào tôi có thể có hiệu quả giám sát việc sử dụng bộ nhớ trong chia sẻ lưu trữ để nói bao nhiêu ứng dụng của tôi được tiêu thụ trước khi một thùng ứng dụng?
- Tại sao trình xử lý Application_ [End/OnEnd/Error] trong global.asax không được gọi?
- Làm cách nào khác để xác định nguyên nhân gây ra những lần tái chế này?
Cảm ơn.
EDIT: Dựa trên câu trả lời bằng @Jani Hyytiäinen
Kịch bản: Chủ đề # 1 bắt đầu và được theo sau bởi thread # 2. Chủ đề số 1 truy cập giới hạn bộ nhớ nhưng vẫn tiếp tục xử lý. Chủ đề # 3 bắt đầu. Thread # 1 kết thúc, nhưng # 2 xử lý hơn 60 giây sau khi # 1 đã đạt tới giới hạn bộ nhớ.
Các hồ bơi sau đó hủy bỏ không đúng lúc? Câu trả lời http sẽ # 2 & # 3 nhận (Đây là những cuộc gọi AJAX, nhưng tôi nhận được 504 lỗi trong Fiddler)?
Yêu cầu cho số 3 được chấp nhận hay nó chỉ xếp hàng cho đến khi một hồ bơi mới bắt đầu?
Có cách nào để biết rằng giới hạn bộ nhớ đã bị trúng hoặc sắp sửa không?
Mọi chiến lược đều được chào đón.
Thời gian chờ cổng HTTP 504 không thực sự được trang web của bạn trả về vì chính lỗi đó có nghĩa là tài nguyên được yêu cầu bởi url không phản hồi kịp thời. Trong trường hợp của bạn, có lẽ vì hồ bơi ứng dụng đã bị đóng cửa và mới chưa bắt đầu. Khi hồ bơi ứng dụng tắt, tất cả các chủ đề trong nó sẽ hủy bỏ với nó. Mà chắc chắn nhất dẫn đến HTTP 504 trên các chủ đề # 2 và # 3 –