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

Вот шаги, которые я использую для воспроизведения этой проблемы:

  1. все работает нормально.
  2. я пишу некоторый код и компилирую
  3. SignalR выполняет повторное соединение с WebSocket transport и получает этот ответ в заголовке ответа: "HTTP / 1.1 101 Switching Protocols"
  4. я делаю запрос, и рабочий процесс IIS зависает и никогда не возвращается, или я жду 2-3 минуты, и все снова работает.

Я испытываю это и в IIS Express. Обычно я решаю эту проблему, убивая рабочий процесс IIS и перезагружая его. Это проблема с разрешениями? В настоящее время пул приложений работает под моим локальным пользователем, но я попытался идентифицировать пул приложений с тем же именем результаты. Что должно быть в "HKLMSystemCurrentControlSetServicesSignalRPerformance"? В настоящее время на моей машине нет такого раздела реестра.

2 6

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.