SignalR заставляет IIS зависать после перестройки
Windows 8.1. IIS 8.5. Версии SignalR:
<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" />
Всякий раз, когда я перестраиваю свой проект/решение, IIS скачивает до максимальной загрузки процессора, и я не могу перезагрузить свою страницу. Я проверил прокмона.exe и он сообщает об огромном количестве (>20 000/с) операций "RegOpenKey/RegQueryKey", таких как эти:
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: HKLMSYSTEMCurrentControlSetServicesSignalRPerformance
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: HKLMSystemCurrentControlSetServicesSignalRPerformance
TID: 23272
Duration: 0.0000062
Desired Access: Read
Вот шаги, которые я использую для воспроизведения этой проблемы:
- все работает нормально.
- я пишу некоторый код и компилирую
- SignalR выполняет повторное соединение с WebSocket transport и получает этот ответ в заголовке ответа: "HTTP / 1.1 101 Switching Protocols"
- я делаю запрос, и рабочий процесс IIS зависает и никогда не возвращается, или я жду 2-3 минуты, и все снова работает.
Я испытываю это и в IIS Express. Обычно я решаю эту проблему, убивая рабочий процесс IIS и перезагружая его. Это проблема с разрешениями? В настоящее время пул приложений работает под моим локальным пользователем, но я попытался идентифицировать пул приложений с тем же именем результаты. Что должно быть в "HKLMSystemCurrentControlSetServicesSignalRPerformance"? В настоящее время на моей машине нет такого раздела реестра.
2 ответа:
Я не видел такого поведения раньше. Являются ли операции 20 000/s "RegOpenKey / RegQueryKey" длительностью от 2-3 минут непрерывно? Имеют ли все эти операции доступ к пути" HKLM\System\CurrentControlSet\Services\SignalR\Performance"?
SignalR предназначен для остановки дальнейшей загрузки счетчиков производительности после того, как какой-либо счетчик производительности не загружается.Возможно, Установка счетчиков производительности SignalR решит вашу проблему. Это создаст Системы\реестра HKLM\CurrentControlSet на\услуги\помощью SignalR\производительность.
Необходимо убедиться, что пул приложений работает под управлением пользователя в группе "пользователи монитора производительности".
Хорошие новости! Похоже, что этот вопрос официально поднят и есть примененное исправление. Просто хотел поделиться этим, если у кого-то есть такая же проблема.
Https://github.com/SignalR/SignalR/issues/3414
По-видимому, проблема была вызванаCultureInfo
, который просочился из другогоAppDomain
. Это происходит в конструкторе классаPerformanceCounter
в пространстве именSystem.Diagnostics
.Смотрите подробный анализ здесь: http://www.zpqrtbnk.net/posts/appdomains-threads-cultureinfos-and-paracetamol
На момент написания статьи новый пакет еще не выпущен,но вскоре исправление должно стать доступным через официальный канал NuGet. Исправление содержится в пакете
Microsoft.AspNet.SignalR.Core
.