2009-09-17 5 views
13

Mam ASP.NET 3.5 Serwis działa pod IIS7 na Windows 2008.aplikacji ASP.NET na IIS7 - bardzo powolny rozruch po IISReset

Kiedy ponownie uruchomić usługi IIS (iisreset), a następnie uderzył w stronę, z rozruchem jest naprawdę powolny.

widzę następujące czynności w procesie Explorer:

  • W3wp.exe tarła, ale pokazuje 0% CPU aktywność przez około 60 sekund
  • Wreszcie w3wp.exe przechodzi do 50% CPU dla około 5 sekund, a następnie ładuje się strona.

W tym czasie nie widzę żadnych innych procesów wykorzystujących procesor. Po prostu wisi.

Co się dzieje przez cały czas? Jak mogę wyśledzić, co zajmuje cały ten czas?

Odpowiedz

4

Zauważyłem, że wystąpiło opóźnienie sieci, które początkowo łączyło się z serwerem WWW z przodu z serwerem bazy danych.

Ten problem był charakterystyczny dla systemu Windows 2008 i naszego określonego sprzętu sieciowego.

Uchwała było wyłączyć następujące na serwerach internetowych:

4

IL jest konwertowany na natywny kod maszynowy (Assembly) przez kompilator Just-In-Time i można poczekać, aż nastąpi cała magia.

Podczas kompilacji kodu źródłowego kodu zarządzanego, kompilator tłumaczy źródło w Microsoft pośredniego języka (MSIL). Jest to niezależny od CPU zestaw instrukcji, który można efektywnie przekonwertować na kod natywny . Microsoft intermediate language (MSIL) to tłumaczenie używane jako jako wynik dla wielu kompilatorów . Jest to dane wejściowe do kompilatora just-in-time (JIT) . Środowisko wykonawcze wspólnego języka zawiera kompilator JIT do konwersji macierzystego kodu MSIL na .

Przed Microsoft Intermediate Language (MSIL) mogą być wykonywane go, musi być przekształcone przez Framework just-in-time (JIT) kompilator do kodu natywnego . Jest to kod specyficzny dla procesora, który działa na tej samej architekturze komputera jako kompilator JIT. Zamiast używać czasu i pamięci do konwertowania całego pliku MSIL w przenośnym pliku wykonywalnym (PE) na kod natywny. Konwertuje on MSIL w razie potrzeby podczas wykonywania, a następnie buforuje wynikowy kod natywny tak, aby był dostępny dla każdego kolejnego połączenia .

source

+0

Jeśli to kompilacja JIT, nie widzę csc.exe w Eksploratorze procesów? Nie widzę uruchomionego csc.exe podczas 60 sekund oczekiwania. – frankadelic

+0

@frankadelic csc.exe jest kompilatorem C#. JIT jest częścią .NET i dlatego .NET musi być zainstalowany na komputerach z C#. –

+0

Niezależnie od tego, czy był to csc, czy JIT, zobaczyłoby to użycie procesora. –

4

Ów kompilacji stron ASP.NET na język pośredni + JIT kompilacji - to zdarza się tylko za pierwszym razem, gdy strona jest załadowany. (Zobacz http://msdn.microsoft.com/en-us/library/ms366723.aspx)

Jeśli naprawdę Cię to niepokoi, możesz to powstrzymać, wstępnie kompilując swoją witrynę.

EDYTOWANIE: Wystarczy ponownie przeczytać pytanie - 60 sekund jest bardzo długie i można oczekiwać, że w tym czasie pojawi się aktywność procesora.Sprawdź dziennik zdarzeń pod kątem błędów/komunikatów w lokalizacji systemowej i aplikacji. Spróbuj także utworzyć zrzut awaryjny procesu w3wp podczas tych 60 sekund - jest szansa, że ​​możesz rozpoznać, co robi, patrząc na niektóre stosy połączeń.

Jeśli za każdym razem zajmuje to 60 sekund, to prawdopodobnie 60 sekund to niezły numer okrągły. Upewnij się, że ma poprawne połączenie z kontrolerami domeny, itp. ...

(Jeśli istnieją narzędzia diagnostyczne IIS, które wykonają lepszą pracę, obawiam się, że ich nie znam, to pytanie może być bardziej pasujący do ServerFault, powyższe jest o wiele bardziej programistyczne podejście do rozwiązywania problemów: -p)

+0

jak wspomniano w innych komentarzach - Nie widzę żadnego csc.exe podczas tego opóźnienia. – frankadelic

1

Ta kwestia nie ma nic wspólnego ze zbieraniem JIT. Normalny kompilator C# kompiluje twój kod za plikami (.aspx.cs) w języku pośrednim do zestawu podczas uruchamiania, jeśli ten zestaw nie istnieje lub zmieniły się pliki kodu. Twoja strona internetowa znajduje się w folderze "bin" twojej strony internetowej.

W rzeczywistości kompilacja JIT następuje później, ale jest to bardzo szybkie i nie potrwa kilka minut. Kompilowanie JIT odbywa się przy każdym uruchomieniu aplikacji .net i nie zajmie więcej niż sekunda wyświetlenia.

Możesz uniknąć copmpiling swojej strony internetowej, jeśli wdrożyłeś już skompilowany zespół witryny (YourWebsite.dll) w folderze bin. Możliwe jest również wdrażanie tylko plików aspx i pozostawienie kodu poza plikami plików (aspx.cs).

+0

W rzeczywistości, nawet w przypadku wstępnie skompilowanej strony, .aspx, .ascx itp. Są przetwarzane na kod C#, kompilowany, a następnie JIT. Jest więc sporo aktywności podczas rozgrzewania aplikacji ASP.NET po raz pierwszy. – Kev

2

Ponad 60 sekund brzmi podejrzanie. Spróbuj uruchomić stronę test.html, aby sprawdzić, ile czasu to zajmie. To będzie izolować rolę IIS7.

Następnie tymczasowo zmień nazwę pliku web.config, global.asax i folderów aplikacji i wypróbuj stronę test.aspx (bardzo prosta strona). To izoluje ASP.NET.

Jeśli oba elementy są szybkie (tj. Około 10 sekund), to jest to aplikacja. Ale jeśli albo jest wolny, to nie aplikacja i coś z samym serwerem.

+0

Strona testowa HTML zajęła około 2 sekundy po iisreset. Jeśli IIS był uruchomiony i zmieniłem plik web.config, ładowanie testowej strony ASPX zajmuje około 3 sekund. – frankadelic

+3

Wygląda na to, że IIS i ASP.NET mają się dobrze. To musi być coś w aplikacji, które to powoduje. Jeśli jest wolny tylko przy pierwszym obciążeniu, jest to konwersacja do kodu natywnego. Czy masz ogromny projekt? Sprawdziłbym twój typ i rozmiar projektu i zobacz, jak go rozbić na części lub skompilować przed przesłaniem na serwer. –

6

Mieliśmy podobny problem i okazało się, że czekaliśmy na przekroczenie limitu czasu systemu Windows w celu cofnięcia certyfikatów podpisywania. Sprawdź, czy twój serwer próbuje gdzieś zadzwonić (np. Crl.microsoft.com). Być może ustawienie serwera proxy jest nieprawidłowe? A może po drodze zapora ogniowa? Ostatecznie ustaliliśmy, że mamy wystarczającą kontrolę nad serwerem i nie chcemy "zadzwonić do domu", więc po prostu wyłączyliśmy czek. Możesz to zrobić z .NET 2.0 SP1 i nowszymi, dodając poniższe do pliku machine.config.

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

Nie jestem pewien, czy można to po prostu umieścić w pliku app.config/web.config.