Tại sao sau mỗi lần khởi động lại, các trang web .NET cục bộ của tôi lại mất thời gian tải lần đầu tiên? [đóng cửa]


27

Tôi đang phát triển các trang web dựa trên nền tảng .NET. Tôi thường triển khai các trang web này trên IIS cục bộ của mình để tôi có thể kiểm tra chúng và xem chức năng của chúng trước khi đi vào hoạt động. Tuy nhiên, mỗi lần tôi khởi động lại windows, có vẻ như các trang web mất nhiều thời gian để chạy lần đầu tiên.

Tôi biết về JIT và tôi cũng biết câu hỏi này , nhưng nó không trả lời câu hỏi của tôi.

JIT có xảy ra mỗi khi bạn khởi động lại windows không? Có liên quan đến việc tạo quá trình w3wp.exe không? Tại sao các trang web quá chậm cho yêu cầu đầu tiên sau mỗi lần khởi động lại?


3
Điều này được gọi là "khởi đầu lạnh" hoặc một cái gì đó. Hệ thống này có để tải w3wp vào bộ nhớ, mà cũng cần tất cả dlls có liên quan, có lẽ thứ JIT, bảng quá trình nhập khẩu, đọc dữ liệu từ đĩa, vì nó không có trong bộ nhớ cache RAM vv
Coder

@Coder, +1 cho bình luận của bạn. Nhưng bạn có thể vui lòng giải thích thêm trong một câu trả lời, để tôi và nhà phát triển khác sẽ sử dụng lợi ích. :)
Saeed Neamati

IIS không phải là chuyên môn của tôi, vì vậy tôi hy vọng ai đó sẽ đưa ra câu trả lời tốt hơn. Đây là một chủ đề tương tự tôi đã bắt đầu cách đây stackoverflow.com/questions/3807791/cold-startup-optimization Có lẽ nó sẽ giúp ích nhiều hơn.
Coder

4
Câu hỏi này dường như lạc đề vì nó liên quan đến vấn đề triển khai chứ không phải vấn đề lập trình khái niệm.

Câu trả lời:


32

Vấn đề này là biên dịch JIT. Nhóm ứng dụng cần thời gian để xây dựng các thư viện trước khi có thể bắt đầu xử lý chúng. Điều này có thể được tăng tốc bằng cách sử dụng một kịch bản khởi động, nhưng đó là điều cần phải xảy ra. Nó cũng phụ thuộc vào việc bạn đang sử dụng một trang web hoặc một dự án ứng dụng web. Một trang web là JIT cho mỗi trang, vì vậy lần truy cập đầu tiên rất chậm và mỗi lần truy cập trang mới cũng có thêm thời gian biên dịch. Các dự án ứng dụng web được biên dịch trước nên không bị ảnh hưởng nặng nề như vậy, nhưng các thư viện vẫn cần được tải lên. Càng nhiều thư viện / công cụ bạn có thì cú đánh này càng tệ. Dưới đây là một số liên kết thảo luận về sự khởi động:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://bloss.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx https://stackoverflow.com/questions/2063461/iis-web-appluggest-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /


6
Điều này chủ yếu là đúng nhưng có một sự khác biệt giữa biên dịch và jits không rõ ràng trong câu trả lời này. Jits đang biên dịch mã byte .NET thành mã máy. ASP.NET thực sự đang biên dịch các trang web đó, ngay cả trong Dự án ứng dụng web (trừ khi bạn sử dụng aspnet_compiler). Tất cả thời gian biên dịch / xây dựng, cộng với thời gian tải thư viện và thư viện, là lý do tại sao nó quá chậm.
Aaronaught

JIT chỉ là viết tắt của chỉ trong thời gian. Không có sự khác biệt giữa "jending" và "biên dịch", ngoài thời gian và số lượng mã được biên dịch. Ngoài ra, quá trình biên dịch JIT chỉ xảy ra đối với mỗi không mong muốn, không nhất thiết phải cho mỗi trang. Nếu họ sử dụng cùng một khuôn mẫu, ví dụ, việc biên dịch là không cần thiết. Tất nhiên, nhận xét rằng nhiều thư viện dẫn đến mất nhiều thời gian hơn để biên dịch là hoàn toàn đúng, tất nhiên.
Cornelius

9

Phản ứng chậm về yêu cầu đầu tiên của bạn là do IIS chỉ bắt đầu / tải một trang web hoặc nhóm ứng dụng theo yêu cầu đến đầu tiên của nó. Và sau một khoảng thời gian cố định, không có yêu cầu mới nào đến máy chủ IIS dừng trang web lại (tái chế nhóm ứng dụng).

ASP.NET 4.0 có một tính năng mới gọi là tự động khởi động. Với tính năng này, bạn có thể đặt nhóm ứng dụng hoặc trang web riêng để tự khởi động trước mọi yêu cầu. Điều này được kích hoạt khi khởi động (khi IIS khởi động) hoặc khi bạn cập nhật một trang ASP.NET (dừng trang này).

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Bạn cần IIS 7.5 để sử dụng cái này.

Ngoài ra còn có một tùy chọn để thực hiện các tác vụ bổ sung nhất định khi tự động khởi động, ví dụ. để tải trước dữ liệu vào bộ đệm.


Thông thường, bạn biên dịch trang web đầy đủ của mình trước khi đưa nó lên máy chủ web, vì vậy mã không cần phải được biên dịch nữa theo yêu cầu đầu tiên. JIT chỉ được sử dụng cho các trang web sử dụng thư mục App_code nơi bạn xuất bản mã nguồn của mình với trang web.
Trộm

2

Một phần của vấn đề cũng là GAC. Các thư viện đặt ở đó sẽ cần phải được kiểm tra bảo mật mỗi khi chúng được tải lên - điều đó có nghĩa là toàn bộ tải công việc loại mã hóa đang được thực hiện và điều này làm mọi thứ chậm lại rất nhiều. Có một cuộc thảo luận về hiệu suất WPF một thời gian trước từ MS đã mô tả vấn đề này - câu trả lời của họ là "đừng đưa công cụ vào GAC nếu bạn không thể giúp đỡ"


1
Đó phải là "có thể giúp nó" để tránh tiêu cực kép
Richard Szalay

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.