2014-11-19 17 views
6

Windows 8.1. IIS 8.5. SignalR wersje:SignalR powoduje, że IIS zawiesza się po odbudowaniu

<package id="Microsoft.AspNet.SignalR" version="2.1.2" targetFramework="net451" /> 
<package id="Microsoft.AspNet.SignalR.Core" version="2.1.2" targetFramework="net451" /> 
<package id="Microsoft.AspNet.SignalR.JS" version="2.1.2" targetFramework="net451" /> 
<package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.1.2" targetFramework="net451" /> 

Ilekroć odbudować mój projekt/rozwiązanie, IIS kolce do maksymalnego wykorzystania procesora i nie udało się załadować moją stronę. Sprawdziłem procmon.exe i zgłasza ogromną ilość (> 20 000/s) "RegOpenKey/RegQueryKey" operacji, takich jak te z nich:

Date & Time: 19.11.2014 10:47:20 
Event Class: Registry 
Operation: RegQueryKey 
Result: SUCCESS 
Path: HKLM 
TID: 23272 
Duration: 0.0000059 
Query: HandleTags 
HandleTags: 0x0 

Date & Time: 19.11.2014 10:47:20 
Event Class: Registry 
Operation: RegOpenKey 
Result: REPARSE 
Path: HKLM\SYSTEM\CurrentControlSet\Services\SignalR\Performance 
TID: 23272 
Duration: 0.0000121 
Desired Access: Read 


Date & Time: 19.11.2014 10:47:20 
Event Class: Registry 
Operation: RegOpenKey 
Result: NAME NOT FOUND 
Path: HKLM\System\CurrentControlSet\Services\SignalR\Performance 
TID: 23272 
Duration: 0.0000062 
Desired Access: Read 

Są to kroki używam odtworzyć ten problem:

  1. Wszystko działa poprawnie.
  2. napisać trochę kodu i skompilować
  3. SignalR robi ponownie z transportem websocket i dostaje tę odpowiedź w nagłówku odpowiedzi: „HTTP/1.1 101 Przełączanie Protokoły”
  4. mam prośbę i IIS pracownicza zawiesza procesowych i nigdy wraca LUB czekam 2-3 minuty i znowu wszystko działa.

Występuję również w IIS Express. Normalnie rozwiązuję to przez zabicie procesu IIS Worker i ponowne załadowanie. Czy to jest problem uprawnień? Obecnie pula aplikacji działa pod moim lokalnym użytkownikiem, ale wypróbowałem Application Pool Identity z tymi samymi wynikami. Co powinno znajdować się w "HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance"? Obecnie na moim komputerze nie ma takiego klucza rejestru.

Odpowiedz

4

Nie widziałem tego zachowania wcześniej. Czy 20 000/s "RegOpenKey/RegQueryKey" trwa nieprzerwanie od 2-3 minut? Czy wszystkie te operacje uzyskują dostęp do ścieżki "HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance"?

SignalR ma na celu zatrzymanie dalszego ładowania liczników wydajności po nieudanym załadowaniu licznika wydajności.

Być może installing the SignalR performance counters rozwiąże problem. Spowoduje to utworzenie HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance.

Należy upewnić się, że pula aplikacji działa pod użytkownikiem w grupie "Monitorowanie wydajności użytkowników".

+0

Żądania są stałe przez czas, w którym się zawiesza, tak. Zarejestrowałem ~ 13 000 w 0.3 sekundy - wszystkie tego samego typu, co wspomniane powyżej. Zainstalowanie licznika wydajności pomogło, więc bardzo dziękuję za to! – perkrihe

2

Dobra wiadomość! Wydaje się, że kwestia ta została oficjalnie podniesiona i zastosowano poprawkę. Chciałem to udostępnić, jeśli ktoś ma ten sam problem.

https://github.com/SignalR/SignalR/issues/3414

Podobno problem został spowodowany przez CultureInfo który wyciekł z innej AppDomain. Zdarza się to w konstruktorze klasy PerformanceCounter w przestrzeni nazw.

Zobacz szczegółową analizę tutaj: http://www.zpqrtbnk.net/posts/appdomains-threads-cultureinfos-and-paracetamol

W chwili pisania nowy pakiet nie został jeszcze wydany, ale szybko naprawić powinny stać się dostępne za pośrednictwem oficjalnego kanału Nuget. Poprawka jest zawarta w pakiecie Microsoft.AspNet.SignalR.Core.

Powiązane problemy