【问题标题】:SignalR makes IIS hang after rebuildSignalR 在重建后使 IIS 挂起
【发布时间】:2014-11-19 14:12:47
【问题描述】:

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 Worker 进程并重新加载来解决这个问题。这是权限问题吗?目前应用程序池在我的本地用户下运行,但我尝试了应用程序池标识,结果相同。 “HKLM\System\CurrentControlSet\Services\SignalR\Performance”应该是什么?目前我的机器上没有这样的注册表项。

【问题讨论】:

    标签: asp.net iis signalr


    【解决方案1】:

    我以前从未见过这种行为。 20,000/s“RegOpenKey/RegQueryKey”操作是否连续持续2-3分钟?所有这些操作都访问“HKLM\System\CurrentControlSet\Services\SignalR\Performance”路径吗?

    SignalR 旨在在任何性能计数器加载失败后停止进一步加载性能计数器。

    也许installing the SignalR performance counters 会解决您的问题。这将创建 HKLM\System\CurrentControlSet\Services\SignalR\Performance。

    您必须确保您的应用程序池在“性能监视器用户”组中的用户下运行。

    【讨论】:

    • 请求在挂起期间是连续的,是的。我在 0.3 秒内记录了约 13 000 个 - 所有类型都与上述相同。安装性能计数器确实有帮助,非常感谢!
    【解决方案2】:

    好消息!似乎此问题已正式提出并已应用修复程序。如果有人遇到同样的问题,只是想分享一下。

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

    显然,问题是由从另一个 AppDomain 泄漏的 CultureInfo 引起的。它发生在System.Diagnostics 命名空间中的PerformanceCounter 类构造函数中。

    详细分析请看这里:http://www.zpqrtbnk.net/posts/appdomains-threads-cultureinfos-and-paracetamol

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多