【问题标题】:Memory leak/consumption in Hubs due to large messages?由于大消息,集线器中的内存泄漏/消耗?
【发布时间】:2020-03-03 23:38:58
【问题描述】:

我目前正在尝试 SignalR 和 RabbitMQ 以循环/负载平衡 json web 服务查询,并且在处理大型 (~ 300 - 2500 kb) 消息时,我遇到了其中一个应用程序的内存消耗问题.

我有一个 IIS 服务器托管一个 web 应用程序(名为“后端”),该应用程序需要查询另一个同样由 IIS 服务器托管的 web 应用程序(名称为“定价”)。 为了保持与我的 RabbitMQ 服务器的连接,我开发了使用 SignalR 连接到后端和定价的控制台应用程序。

因此,当后端需要查询 Pricing 时,它会要求其控制台在队列中发布消息,并且附加到 Pricing 的控制台获取消息并将其提供给 Pricing(使用 Invoke 方法)。当 Pricing 完成其工作时,它要求其控制台发布回复消息,并且附加到后端的控制台将其接收并提供给后端。

总结一下: [后端] -> [控制台] -> [RabbitMQ]

我有 2 个定价从他们的控制台从 RabbitMQ 队列中获取消息。

此设置是为了替换 2 个 IIS 之间的传统 Web 服务查询,并受益于 RabbitMQ(负载平衡器和微/Web 服务架构中的异步调用)的优势

我加了

  GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;

在两个 IIS 中的 Startup.cs 中以便接受大消息。

当我在 Windows 任务管理器中查看定价的内存消耗时,它迅速从 500Mb 增长到 1500Mb(在 5 分钟内,处理来自后端的无休止查询以测试设置)。

我通过将查询内容写入共享文件夹中的文件并仅在 RabbitMQ 的消息中发布文件的名称以及定价的内存消耗(当然需要修改代码以加载文件)来尝试其他方法移动并保持在 500Mb 左右。

所以它似乎与我的控制台传递给 IIS 的消息长度有关。

我试图断开控制台与 IIS 集线器的连接,因为我认为它可能会释放一些内存,但没有。

有没有人遇到过大型消息进入集线器的内存消耗问题?如何检查我的应用程序中是否确实存在内存泄漏?

在 Web/微服务环境中使用 SignalR 和 RabbitMQ 怎么样?有什么反馈吗?

非常感谢,

让-弗朗索瓦

.NETFramework : 4.5
Microsoft.AspNet.SignalR : 2.4.1

【问题讨论】:

  • 请使用内存分析器来实际检查内存使用情况。这可以很容易地说明可能出了什么问题。
  • 感谢您的回复。我发现我可以限制保存在集线器中的消息数量,这似乎可以减少内存。

标签: iis rabbitmq signalr


【解决方案1】:

因此,我使用的 SignalR 版本(.NetFramework)似乎允许调整每个集线器每个连接保存在内存中的消息数量。 我在 Startup.cs 中将其固定为任意 50

GlobalHost.Configuration.DefaultMessageBufferSize = 50;

它的默认值为 1000,意思是(如果我理解清楚的话)IIS 在内存中保留一个包含 1000 条消息的循环缓冲区。一些消息的权重为 2.5Mo,这意味着每个连接使用的内存可能高达 2500Mo。

由于我的 IIS 只有一个连接(它的控制台)并且不需要跟踪消息(因为它作为 web 服务工作),所以 1000 条消息似乎太多了。

由于 50 条消息的限制,Windows 任务管理器中的应用程序使用的内存保持不变(大约 500Mo)。

我使用它的方式有什么缺陷吗?

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2018-03-01
    • 2021-12-25
    • 2014-03-24
    • 2019-03-24
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多