SignalR在重建后导致IIS挂起

6

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的CPU使用率会飙升到最高点,导致我无法重新加载页面。我检查了procmon.exe,并报告了大量(> 20,000 / s)的“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:   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

这是我使用的步骤来重现此问题:
  1. 一切都正常。
  2. 我编写了一些代码并进行了编译
  3. SignalR使用WebSocket传输进行重新连接,并在响应头中获得此响应:“HTTP/1.1 101 Switching Protocols”
  4. 我发出请求,IIS工作进程挂起,并且永远不会回来,或者我等待2-3分钟,然后事情又开始正常。
我也在IIS Express中遇到过这个问题。通常我通过终止IIS工作进程并重新加载来解决这个问题。这是权限问题吗?当前应用程序池在我的本地用户下运行,但我已尝试使用应用程序池身份验证并获得相同的结果。在“HKLM\System\CurrentControlSet\Services\SignalR\Performance”中应该放什么?目前,在我的计算机上没有这样的注册表键。
2个回答

4
我以前没有看到过这种行为。这20,000/s的“RegOpenKey/RegQueryKey”操作是否持续了2-3分钟?所有这些操作都访问“HKLM\System\CurrentControlSet\Services\SignalR\Performance”路径吗?
SignalR旨在在任何性能计数器加载失败后停止进一步加载性能计数器。
也许安装SignalR性能计数器可以解决您的问题。这将创建HKLM\System\CurrentControlSet\Services\SignalR\Performance。
您必须确保应用程序池在“性能监视器用户”组中运行的用户下运行。

请求在挂起的时间内是持续不断的,是的。我记录了大约 13,000 个请求,用时仅为 0.3 秒 - 所有这些请求都与上面提到的类型相同。安装性能计数器确实有所帮助,非常感谢! - perkrihe

2

好消息!看起来这个问题已经得到了官方认可,并且已经有了解决方法。如果有人遇到同样的问题,我想分享一下。

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

显然,问题是由从不同的AppDomain泄漏出来的CultureInfo引起的。这发生在System.Diagnostics命名空间中的PerformanceCounter类构造函数中。

详细分析请参见:http://www.zpqrtbnk.net/posts/appdomains-threads-cultureinfos-and-paracetamol

在撰写本文时,新的软件包尚未发布,但很快就会通过官方NuGet feed提供修复程序。修复程序包含在Microsoft.AspNet.SignalR.Core软件包中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接