2012-02-27 18 views
6

Tôi có một ứng dụng máy chủ phức tạp sử dụng Nhibernate và Linq2SQL. Khoảng 3 lần mỗi ngày mã Linq2sql tạo ra một "giá trị không thể là null" ngoại lệ. Khi điều này xảy ra, mã sẽ luôn tạo ra ngoại lệ. Chẩn đoán và giải quyết nguyên nhân gốc rễ sẽ kéo dài và sẽ dẫn đến sự mất ổn định.Làm cách nào tôi có thể tái chế một ứng dụng riêng của ứng dụng web .net?

"khắc phục" hiện tại là tái chế hồ bơi ứng dụng mỗi giờ. Tuy nhiên, dịch vụ này đã giảm từ điểm vấn đề xảy ra cho đến khi tái chế xảy ra. Tôi muốn các dịch vụ web để bắt ngoại lệ và tái chế hồ bơi ứng dụng riêng của nó. Tôi muốn tất cả các yêu cầu web khác được vinh danh cho đến khi chúng được hoàn thành.

Chỉnh sửa: Lỗi xảy ra trên cả hai máy chủ trên trang web cân bằng tải. Khách hàng không chuyển từ máy chủ này sang máy chủ khác chỉ vì mã này gặp sự cố.

+2

'Chẩn đoán và giải quyết nguyên nhân gốc sẽ kéo dài và sẽ giới thiệu sự bất ổn định trước khi downvotealanche. Bạn nên định cấu hình nhóm ứng dụng để tái chế trong thời gian ngắn và sửa lỗi đó trong thời gian dài. – Will

+0

Cảm ơn. Đó là kế hoạch –

+0

Cách tiếp cận tốt nhất là sửa lỗi –

Trả lời

18

Mã sau sẽ tái chế nhóm ứng dụng của trang web hiện tại. Bạn cần phải thêm một tham chiếu đến Microsoft.Web.Administration

using (ServerManager iisManager = new ServerManager()) 
{ 
    SiteCollection sites = iisManager.Sites; 
    foreach (Site site in sites) 
    { 
     if (site.Name == HostingEnvironment.ApplicationHost.GetSiteName()) 
     { 
     iisManager.ApplicationPools[site.Applications["/"].ApplicationPoolName].Recycle(); 
     break; 
     } 
    } 
} 
+6

Điều này phải được chấp nhận trả lời. – vittore

+0

@vittore Có một vấn đề tương tự như OP, và điều này sẽ không cắt nó. Các APPPOOL không có quyền để kéo này, vì vậy có lẽ nó không làm việc cho OP hoặc. Giải pháp của OP sẽ làm việc cho tôi, nhưng nó chỉ cảm thấy * đáng sợ *;) làm theo cách đó. – ClasG

+0

@ClasG Vâng, bạn cần giấy phép mở rộng để làm việc đó – vittore

0

Câu cuối cùng đó là kẻ giết người.

Để thực hiện điều đó, bạn phải triển khai thiết lập cân bằng tải sẽ phức tạp hơn nhiều so với giải quyết vấn đề ban đầu của bạn.

Tôi khuyên bạn nên nỗ lực giải quyết ngoại lệ đó thay thế. Vui lòng đăng một số mã từ truy vấn LINQ có liên quan, có thể chúng tôi có thể cung cấp một số đề xuất ở đó.

+1

Nếu bạn muốn giải quyết vấn đề cơ bản, vui lòng đăng câu hỏi mới: câu hỏi ban đầu và vấn đề là vấn đề rất riêng biệt. –

+0

Tôi muốn giải quyết vấn đề cơ bản và có bạn đúng, đó là một nhiệm vụ hoàn toàn khác. Nhưng đó không phải là một công việc cho tháng này. –

3

Cách đơn giản nhất để "chuyến đi" quy trình nhân viên ASP.NET vào việc tái chế hồ bơi ứng dụng là sửa đổi tệp web.config theo một cách nào đó. Sự thay đổi này được chọn bởi trình giám sát hệ thống tệp và khiến ASP.NET tái chế để tải cấu hình mới.

Nội dung của tệp không phải thay đổi theo bất kỳ cách thực tế nào; chỉ cần thêm hoặc xóa ký tự khoảng trắng là đủ.

Edit:

Nếu đây là không đủ mạnh để làm việc xung quanh vấn đề của bạn, bạn có thể đi toàn bộ con heo và sử dụng Directory Services để tái chế các hồ bơi ứng dụng bằng tay.

// Set up the path identifying your application pool. 
var path = "IIS://YOURSERVERNAME/W3SVC/AppPools/YourAppPoolName"; 

// Create the directory entry to control the app pool 
var appPool = new DirectoryEntry(path); 

// Invoke the recycle action. 
appPool.Invoke("Recycle", null); 

Dựa trên Code Project: Recycling IIS 6.0 application pools programmatically.

+0

Chạm vào web.config, ngay cả khi tôi cấp quyền ghi rõ ràng cho IUSR (đó là một trợ giúp ghi nhớ) sẽ chỉ tái chế APPLICATION chứ không phải APP POOL. Vấn đề về dữ liệu nằm trong nhóm ứng dụng và quá trình w3wp tiếp tục một cách vui vẻ –

+0

Được cập nhật với cách tiếp cận trực tiếp hơn. Nó chưa được xác minh để làm việc trên IIS7 +, vì vậy hãy cho chúng tôi biết cách bạn tiếp tục. –

+0

Ban đầu tôi đã đi xuống con đường này nhưng danh sách các quyền cần thiết là hợp lý cũng như phức tạp. Tôi giải quyết trên một giải pháp đơn giản hơn nhiều, đó là để cho phép các thiết lập của hồ bơi ứng dụng để tái chế trên vượt quá giá trị memoryLimit sau đó cố tình phân bổ bộ nhớ cho đến khi tái chế đã bị vấp. –

0

Tôi đã có cùng một vấn đề chính xác trước đây; Tôi nên viết blog về nó bởi vì bây giờ tôi không thể nhớ nguyên nhân gốc rễ.

ruột của tôi nói với tôi, nó là một trong các nội dung sau:

  1. Một bối cảnh không nhận được vứt bỏ ở đâu đó.
  2. Vấn đề luồng: đảm bảo nhiều luồng không thể truy cập cùng một ngữ cảnh.

Hoặc điều gì đó dọc theo các dòng đó. Chỉ cần chắc chắn rằng bạn đang sử dụng Linq2Sql chính xác.

0

Giải pháp mà tôi đã chọn cuối cùng là đặt giá trị tối đa cho số lượng bộ nhớ mà appPool được phép sử dụng. Các mã sau đó chỉ đơn giản là gobbled bộ nhớ cho đến khi asp.net quyết định tái chế appPool.

Trong cài đặt nâng cao của Nhóm ứng dụng, tôi đặt Giới hạn bộ nhớ riêng thành 800.000 Kb.

Trong phần Catch nơi mã LINQ thất bại, tôi cấp phát bộ nhớ nhiều hơn giới hạn:

List<string> listOfMemory = new List<string>(); 

// in the app pool, you need to set the virtual memory limit to 800,000kb 
log.Error("Allocating so much memory that the app pool will be forced to recycle... "); 
for (int intCount = 1; intCount < 10000000; intCount++) 
{ 
listOfMemory.Add("new string " + intCount.ToString()); 
} 

này bây giờ có nghĩa là chỉ có khoảng 4 đề thất bại trước một quá trình w3wp mới được sinh ra. Trước giải pháp này, các luồng sẽ liên tục thất bại cho đến khi một người tái chế nhóm ứng dụng theo cách thủ công. Thật không may, nếu bạn thiết lập các hồ bơi ứng dụng để tái chế trên một số thường xuyên của phút, số phút càng nhỏ thì tai nạn càng thường xuyên hơn. Và số phút càng lớn, các chủ đề càng thất bại.

Cách giải quyết sáng tạo này giới hạn thiệt hại.

+0

Mặc dù điều này có thể phù hợp với môi trường của bạn nhưng nó cũng có thể tạm thời kết nối máy chủ nếu: ứng dụng của bạn đang sử dụng 200 mb bộ nhớ, máy chủ có bộ nhớ 400 mb miễn phí, ứng dụng của bạn bắt đầu cấp phát bộ nhớ. Tại thời điểm này, bạn cần 600 mb để buộc một tái chế, và máy chủ sẽ bắt đầu trang nặng nề sau khi 400 mb được phân bổ. –

+0

Wow ... khá xấu xí. Nhưng ngay cả khi bạn muốn làm điều đó theo cách này, tại sao không chỉ mới [] bất kỳ số lượng RAM bạn muốn phân bổ? –

Các vấn đề liên quan