Sửa lỗi tải ban đầu chậm cho IIS


129

IIS có một tính năng gây khó chịu cho các trang web lưu lượng truy cập thấp, nơi nó tái chế các quy trình công nhân không sử dụng, khiến người dùng đầu tiên truy cập trang web sau một thời gian để có độ trễ cực kỳ dài (hơn 30 giây).

Tôi đã tìm kiếm một giải pháp cho vấn đề này và tôi đã tìm thấy những giải pháp tiềm năng này.

A. Sử dụng plugin Khởi tạo ứng dụng

B. Sử dụng Tự động khởi động với .NET 4

C. Vô hiệu hóa thời gian chờ không hoạt động (trong Cài đặt lại IIS)

D. Biên dịch trang web

Tôi đang tự hỏi cái nào trong số này được ưa thích, và quan trọng hơn, tại sao có quá nhiều giải pháp cho cùng một vấn đề? (Tôi đoán là họ không, và tôi chỉ không hiểu một cái gì đó chính xác).

Biên tập

Thực hiện C dường như là đủ để giữ cho trang web của tôi ấm lên, nhưng tôi đã phát hiện ra rằng gốc rễ thực sự của sự chậm chạp trong trang web của tôi phải làm với Entity Framework, mà tôi dường như không thể hiểu tại sao trời lạnh. Xem câu hỏi này , tiếc là chưa được trả lời nhưng đã được trả lời!

Cuối cùng tôi chỉ phải tạo ra một kịch bản khởi động để thỉnh thoảng truy cập trang web của mình để đảm bảo nó được duy trì tốc độ.


Chào bạn, biểu diễn C đã đủ chưa? Tại sao ? Có phải chúng ta chỉ cần sử dụng nó hoặc cần vô hiệu hóa tái chế quá? Tôi luôn cảm thấy yêu cầu ngày thứ hai rất chậm của IIS7.5
qakmak

Câu trả lời:


36

Các tùy chọn A, B và D dường như cùng loại vì chúng chỉ ảnh hưởng đến thời gian bắt đầu ban đầu, chúng làm khởi động trang web như biên dịch và tải thư viện trong bộ nhớ.

Sử dụng C, đặt thời gian chờ nhàn rỗi, nên đủ để các yêu cầu tiếp theo đến máy chủ được phục vụ nhanh chóng (khởi động lại nhóm ứng dụng mất khá nhiều thời gian - theo thứ tự giây).

Theo tôi biết, thời gian chờ tồn tại để tiết kiệm bộ nhớ mà các trang web khác chạy song song trên máy đó có thể cần. Giá là một lần thời gian tải chậm.

Bên cạnh thực tế là nhóm ứng dụng bị tắt trong trường hợp người dùng không hoạt động, nhóm ứng dụng cũng sẽ tái chế theo mặc định cứ sau 1740 phút (29 giờ).

Từ kỹ thuật:

Nhóm ứng dụng Dịch vụ thông tin Internet (IIS) có thể được tái chế định kỳ để tránh các trạng thái không ổn định có thể dẫn đến sự cố ứng dụng, treo hoặc rò rỉ bộ nhớ.

Miễn là tái chế nhóm ứng dụng còn lại, nó là đủ. Nhưng nếu bạn thực sự muốn hiệu năng cao nhất cho hầu hết các thành phần, bạn cũng nên sử dụng một cái gì đó như Mô-đun khởi tạo ứng dụng mà bạn đã đề cập.


Vì vậy, bạn có khuyên bạn chỉ nên vô hiệu hóa thời gian chờ không? Điều đó có gây ra vấn đề dọc đường không (tôi đoán nó có lý do)?
Cavyn VonDeylen

3
Điều này không thực sự khắc phục vấn đề của tôi (xem bản chỉnh sửa của tôi), nhưng tôi đã chấp nhận vì bạn đã trả lời câu hỏi ban đầu của tôi.
Cavyn VonDeylen

10

Thử thách lưu trữ web

Bạn phải nhớ rằng không có tùy chọn cấu hình máy nào khả dụng nếu bạn được lưu trữ trên một máy chủ dùng chung như nhiều người trong chúng ta (các công ty và cá nhân nhỏ hơn).

Chi tiết quản trị ASP.NET

Trang web của tôi mất ít nhất 30 giây khi nó không bị tấn công trong hơn 20 phút (và ứng dụng web đã bị dừng). Thật là khủng khiếp.

Một cách khác để kiểm tra hiệu suất

Có một cách khác để kiểm tra xem đó là ASP.NET MVC của bạn khởi động hay cái gì khác. Thả một trang HTML bình thường trên trang web của bạn, nơi bạn có thể nhấn nó trực tiếp.
Nếu sự cố liên quan đến ASP.NET MVC khởi động thì trang HTML sẽ hiển thị gần như ngay lập tức ngay cả khi ứng dụng web chưa được khởi động.
Đó là cách đầu tiên tôi nhận ra rằng vấn đề là ở phần khởi động ASP.NET MVC. Tôi đã tải một trang HTML bất cứ lúc nào và nó sẽ tải nhanh. Sau đó, sau khi nhấn trang HTML đó, tôi đã nhấn một trong các URL ASP.NET MVC của mình và tôi nhận được thông báo Chrome "Đang chờ raddev.us ..."

Một thử nghiệm khác với tập lệnh hữu ích

Sau đó, tôi đã viết một tập lệnh LINQPad (kiểm tra http://linqpad.net để biết thêm) sẽ truy cập trang web của tôi cứ sau 8 phút (ít hơn thời gian để ứng dụng giải nén - nên là 20 phút) và tôi để nó chạy hàng giờ

Trong khi tập lệnh đang chạy, tôi nhấn trang web của mình và mỗi khi trang web của tôi xuất hiện nhanh chóng. Điều này cho tôi một ý tưởng tốt mà rất có thể sự chậm chạp mà tôi gặp phải là do thời gian khởi động ASP.NET MVC.

Nhận LinqPad và bạn có thể chạy tập lệnh sau - chỉ cần thay đổi URL thành của riêng bạn và để nó chạy và bạn có thể kiểm tra điều này một cách dễ dàng. Chúc may mắn.

LƯU Ý : Trong LinqPad, bạn sẽ cần nhấn F4 và thêm một tham chiếu đến System.Net để thêm thư viện sẽ truy xuất trang của bạn.

CSONG : đảm bảo bạn thay đổi biến Chuỗi URL thành trỏ đến một URL sẽ tải tuyến từ trang web ASP.NET MVC của bạn để công cụ sẽ chạy.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}

3

Viết một dịch vụ ping / script để truy cập trang web nhàn rỗi của bạn là cách tốt nhất để đi vì bạn sẽ có toàn quyền kiểm soát. Các tùy chọn khác mà bạn đã đề cập sẽ có sẵn nếu bạn đã thuê một hộp lưu trữ dành riêng.

Trong một không gian lưu trữ được chia sẻ, các kịch bản khởi động là bảo vệ cấp đầu tiên tốt nhất (tự trợ giúp là trợ giúp tốt nhất). Đây là một bài viết chia sẻ một ý tưởng về cách thực hiện nó từ ứng dụng web của riêng bạn .


vừa cập nhật chủ đề cũ này, trong trường hợp ai đó tìm kiếm tương tự
David Chelliah

2

Tôi sẽ sử dụng B vì kết hợp với tái chế quy trình công nhân có nghĩa là chỉ có độ trễ trong khi nó tái chế. Điều này tránh sự chậm trễ thường liên quan đến khởi tạo để đáp ứng yêu cầu đầu tiên sau khi không sử dụng. Bạn cũng có thể giữ những lợi ích của việc tái chế.


2

Một tùy chọn tốt để ping trang web theo lịch là sử dụng Microsoft Flow, miễn phí tới 750 "lần chạy" mỗi tháng. Rất dễ dàng để tạo ra một luồng truy cập vào trang web của bạn mỗi giờ để giữ ấm. Bạn thậm chí có thể làm việc xung quanh giới hạn 750 của họ bằng cách tạo một luồng duy nhất với độ trễ phân tách nhiều lần truy cập trang web của bạn.

https://flow.microsoft.com


1

Xem bài viết này để biết các mẹo về cách giúp đỡ các vấn đề về hiệu suất. Điều này bao gồm cả các vấn đề về hiệu suất liên quan đến khởi động, trong phần "bắt đầu lạnh". Hầu hết điều này sẽ có vấn đề cho dù bạn đang sử dụng loại máy chủ nào, tại địa phương hoặc trong sản xuất.

http://bloss.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

Nếu ứng dụng khử lưu trữ mọi thứ từ XML (và bao gồm các dịch vụ web, thì), hãy đảm bảo SGEN được chạy với tất cả các nhị phân liên quan đến khử lưu huỳnh và đặt các DLL kết quả vào Bộ đệm ẩn hội đồng toàn cầu (GAC). Điều này biên dịch trước tất cả các đối tượng tuần tự hóa được sử dụng bởi các hội đồng SGEN đã được chạy chống lại và lưu trữ chúng trong DLL kết quả. Điều này có thể giúp tiết kiệm thời gian rất lớn cho lần khử đầu tiên (tải) tệp cấu hình từ đĩa và các cuộc gọi ban đầu đến các dịch vụ web. http://msdn.microsoft.com/en-us/l Library / bk3w6240 (VS.80) .aspx

Nếu bất kỳ máy chủ IIS nào không có quyền truy cập vào internet, hãy tắt Kiểm tra danh sách thu hồi chứng chỉ (CRL) để kiểm tra các nhị phân Authenticode bằng cách thêm GenerPublisherEvidence = Hồi sai sai vào machine.config. Mặt khác, mọi quy trình công nhân có thể treo trong hơn 20 giây trong khi khởi động trong khi hết thời gian cố gắng kết nối với internet để có được danh sách CRL. http://bloss.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/l Library / bb629393.aspx

Cân nhắc sử dụng NGEN trên tất cả các hội đồng. Tuy nhiên, không sử dụng cẩn thận, điều này không mang lại nhiều hiệu quả. Điều này là do các địa chỉ tải cơ sở của tất cả các nhị phân được tải bởi mỗi quy trình phải được đặt cẩn thận tại thời điểm xây dựng để không trùng lặp. Nếu các tệp nhị phân phải được khởi động lại khi chúng được tải do xung đột địa chỉ, gần như tất cả các hiệu suất tăng khi sử dụng NGEN sẽ bị mất. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx


0

Tôi đã nhận được độ trễ 15 giây phù hợp cho yêu cầu đầu tiên sau 4 phút không hoạt động. Vấn đề của tôi là ứng dụng của tôi đã sử dụng Xác thực tích hợp Windows cho SQL Server và hồ sơ dịch vụ ở một miền khác với máy chủ. Điều này gây ra xác thực tên miền chéo từ IIS sang SQL khi khởi tạo ứng dụng - và đây là nguồn thực sự của sự chậm trễ của tôi. Tôi đã thay đổi bằng cách sử dụng đăng nhập SQL thay vì xác thực windows. Sự chậm trễ đã ngay lập tức biến mất. Tôi vẫn có tất cả các cài đặt khởi tạo ứng dụng để giúp cải thiện hiệu suất nhưng chúng có thể không cần thiết trong trường hợp của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.