2009-09-17 35 views
13

Tôi có một trang web ASP.NET 3.5 chạy dưới IIS7 trên Windows 2008.ASP.NET ứng dụng trên IIS7 - khởi động rất chậm sau khi

Khi tôi khởi động lại IIS (iisreset), sau đó nhấn một trang, khởi động ban đầu iisreset thực sự chậm.

tôi thấy các hoạt động sau đây trong Process Explorer:

  • bầy w3wp.exe, nhưng cho thấy 0% CPU hoạt động trong khoảng 60 giây
  • Cuối cùng, w3wp.exe đi đến 50% CPU cho khoảng 5 giây rồi đến trang lượt tải.

Tôi không thấy bất kỳ quy trình nào khác sử dụng CPU trong thời gian này. Về cơ bản nó chỉ bị treo.

Điều gì đang diễn ra trong suốt thời gian đó? Làm thế nào tôi có thể theo dõi những gì đang dùng tất cả thời gian này?

Trả lời

4

Tôi thấy rằng có sự chậm trễ mạng khi thực hiện kết nối ban đầu từ máy chủ web giao diện người dùng đến máy chủ cơ sở dữ liệu.

Sự cố này đặc biệt đối với Windows 2008 và phần cứng mạng cụ thể của chúng tôi.

Độ phân giải là để vô hiệu hóa sau đây trên các máy chủ web:

4

IL đang được chuyển đổi thành mã gốc của máy (Assembly) bằng trình biên dịch Just-In-Time và bạn phải chờ trong khi tất cả các phép thuật xảy ra.

Khi biên dịch mã nguồn để mã số quản lý, trình biên dịch dịch nguồn vào Microsoft trung ngôn ngữ (MSIL). Đây là tập hợp các hướng dẫn độc lập CPU có thể được chuyển đổi thành mã gốc hiệu quả. Ngôn ngữ trung gian của Microsoft (MSIL) là bản dịch được sử dụng làm đầu ra của một số trình biên dịch . Nó là đầu vào cho trình biên dịch JIT ( ). Thời gian chạy ngôn ngữ chung bao gồm trình biên dịch JIT để chuyển đổi MSIL thành mã gốc.

Trước khi Microsoft Intermediate Language (MSIL) có thể được thực hiện nó, phải chuyển đổi bởi .NET Framework just-in-time (JIT) biên dịch để mẹ đẻ mã. Đây là mã CPU cụ thể mà chạy trên cùng một kiến ​​trúc máy tính làm trình biên dịch JIT. Thay vì sử dụng thời gian và bộ nhớ để chuyển đổi tất cả MSIL trong tệp thực thi di động (PE) thành mã gốc. Nó chuyển đổi MSIL khi cần thiết trong khi thực hiện, sau đó lưu trữ mã nguồn gốc kết quả để có thể truy cập được cho bất kỳ lệnh gọi nào sau đó.

source

+0

Nếu đó là JIT biên dịch, tôi sẽ không nhìn thấy csc.exe trong Process Explorer? Tôi không thấy csc.exe đang chạy trong 60 giây chờ đợi. – frankadelic

+0

@frankadelic csc.exe là trình biên dịch C#. JIT là một phần của .NET và tại sao .NET cần được cài đặt trên các máy chạy C#. –

+0

Cho dù đó là csc hay JIT, bạn sẽ thấy việc sử dụng CPU. –

4

Thats lập trang asp.Net sang ngôn ngữ trung gian + biên dịch JIT - nó chỉ xảy ra lần đầu tiên trang web được tải. (Xem http://msdn.microsoft.com/en-us/library/ms366723.aspx)

Nếu nó thực sự làm phiền bạn thì bạn có thể ngăn chặn nó xảy ra bằng cách biên dịch trước trang web của bạn.

CHỈNH SỬA: Chỉ cần đọc lại câu hỏi - 60 giây là rất dài và bạn sẽ thấy một số hoạt động của bộ xử lý trong thời gian đó.Kiểm tra EventLog để tìm lỗi/tin nhắn trong mục đích Hệ thống và Ứng dụng. Ngoài ra hãy thử tạo ra một bãi chứa sụp đổ của quá trình w3wp trong 60 giây này - có một cơ hội bạn có thể nhận ra những gì nó làm bằng cách nhìn vào một số ngăn xếp cuộc gọi.

Nếu phải mất chính xác 60 giây mỗi lần thì có khả năng nó chờ đợi điều gì đó hết thời gian chờ - 60 giây là số tròn đẹp. Hãy chắc chắn rằng nó có kết nối thích hợp với bộ điều khiển miền, vv ..

(Nếu có một số công cụ chẩn đoán IIS sẽ thực hiện công việc tốt hơn thì tôi e rằng mình không biết về chúng, câu hỏi này có thể là phù hợp hơn với ServerFault, ở trên là một cách tiếp cận nhà phát triển-ish nhiều hơn nữa để xử lý sự cố :-p)

+0

như đã đề cập trong các nhận xét khác - Tôi không thấy bất kỳ csc.exe nào đang chạy trong thời gian trễ này. – frankadelic

1

Mũ này không liên quan gì đến việc biên dịch JIT. Trình biên dịch C# bình thường biên dịch mã của bạn đằng sau các tệp (.aspx.cs) thành ngôn ngữ trung gian thành một assembly lúc khởi động nếu assembly này không tồn tại hoặc các tệp mã đã thay đổi. Việc lắp ráp trang web của bạn nằm trong thư mục "bin" của trang web của bạn.

Trong thực tế, các sự kiện biên dịch JIT sau đó, nhưng điều này rất nhanh và sẽ không mất vài phút. Biên dịch JIT xảy ra trên mỗi lần khởi động của ứng dụng .net và sẽ không mất nhiều hơn một giây xem.

Bạn có thể tránh copmpiling của trang web của bạn nếu bạn triển khai lắp ráp trang web đã biên dịch (YourWebsite.dll) vào thư mục bin. Nó cũng có thể triển khai chỉ các tập tin aspx và để lại mã đằng sau các tập tin (aspx.cs) tập tin đi.

+0

Trên thực tế, ngay cả với một trang được biên dịch trước, .aspx, .ascx, vv được phân tích cú pháp thành mã C#, được biên dịch và sau đó là JIT. Vì vậy, có khá nhiều hoạt động khi khởi động một ứng dụng ASP.NET lần đầu tiên. – Kev

2

Lớn hơn 60 giây nghe có vẻ cá. Hãy thử chạy một trang test.html để xem mất bao lâu. Điều đó sẽ cô lập vai trò của IIS7.

Sau đó đổi tên tạm thời thư mục web.config, global.asax và ứng dụng của bạn và thử trang test.aspx (trang rất đơn giản). Điều đó sẽ cô lập ASP.NET.

Nếu cả hai đều nhanh (tức là khoảng 10 giây), thì đó là ứng dụng của bạn. Tuy nhiên, nếu một trong hai là chậm thì không phải là ứng dụng và một cái gì đó với chính máy chủ.

+0

Trang HTML thử nghiệm mất khoảng 2 giây sau iisreset. Nếu IIS đang chạy và tôi thay đổi web.config, có thể mất 3 giây để tải trang ASPX thử nghiệm. – frankadelic

+3

Có vẻ như IIS và ASP.NET đang hoạt động tốt. Nó phải là một cái gì đó trong ứng dụng gây ra điều này. Nếu nó chỉ chậm trên tải đầu tiên thì đó là cuộc hội thoại thành mã gốc. Bạn có một dự án lớn không? Tôi sẽ xem xét loại dự án và kích thước của bạn và xem về việc chia nhỏ nó thành các phần hoặc biên dịch trước khi bạn tải lên máy chủ. –

6

Chúng tôi gặp sự cố tương tự và hóa ra là Windows hết thời gian chờ kiểm tra việc thu hồi chứng chỉ ký. Kiểm tra xem máy chủ của bạn có đang cố gọi ra một nơi nào đó không (ví dụ: crl.microsoft.com). Có lẽ bạn có cài đặt proxy không chính xác? Hoặc một bức tường lửa trong cách? Chúng tôi cuối cùng đã xác định rằng chúng tôi có đủ quyền kiểm soát máy chủ và không muốn 'gọi điện về nhà', vì vậy chúng tôi chỉ vô hiệu hóa séc. Bạn có thể làm điều này với .NET 2.0 SP1 và sau đó bằng cách thêm phần sau vào machine.config.

<runtime> <generatePublisherEvidence enabled="false"/> </runtime> 

Tôi không chắc chắn nếu bạn chỉ có thể đặt điều này trong app.config/web.config của bạn.

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