集线器中的大消息导致的内存泄漏/消耗?

问题描述 投票:0回答:1

我目前正在尝试SignalR和RabbitMQ,以便轮流/负载均衡json Web服务查询,并且在处理大型(〜300-2500 kb)消息时,应用程序之一的内存消耗存在问题。

我有一个IIS服务器托管一个Web应用程序(名为“后端”),该服务器需要查询另一个由IIS服务器托管的Web应用程序(名为“ Pricing”)。为了使与RabbitMQ服务器的连接保持活动状态,我开发了控制台应用程序,该应用程序使用SignalR连接到后端和Princing。

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

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

而且我有2个Pricing,从RabbitMQ队列中从其控制台获取消息。

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

我添加了

  GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;

在两个IIS的Startup.cs中,为了接受大消息。

[当我查看Windows Task Manager中Pricing的内存消耗时,它很快从500Mb增长到1500Mb(在5分钟内,处理来自Backend的无休止查询以测试设置)。

我尝试了其他方法,将查询内容写入共享文件夹中的文件,然后仅在RabbitMQ的消息中发布文件名,而Pricing的内存消耗(当然需要修改代码以加载文件)并保持在500Mb左右。

因此,这似乎与我的控制台传递给IIS的消息长度有关。

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

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

如何在Web /微服务环境中使用SignalR和RabbitMQ?有任何意见吗?

非常感谢,

Jean-Francois

.NETFramework : 4.5
Microsoft.AspNet.SignalR : 2.4.1
iis rabbitmq signalr
1个回答
0
投票
因此,看来我使用的SignalR版本(.NetFramework)可以调整内存中每个连接的每个集线器的消息数。我在Startup.cs中将其固定为任意50。

GlobalHost.Configuration.DefaultMessageBufferSize = 50;

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

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

限制为50条消息,Windows Task Manager中的应用程序使用的内存将保持放置状态(大约500Mo)。

我的使用方式是否存在任何缺陷?

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.