1

我正在将 SignalR 用于实时数据代码,其中包含在单个对象中的多达 10k 行每秒发送到客户端。IIS 工作处理器的内存继续增加,直到滴答声最终冻结。

4

1 回答 1

4

首先,正如您已经阅读的那样,SignalR 是建立在您不会发送大量消息的前提下的。但是,实际上,这是一个完全有效的场景。

那么,如何处理内存问题。SignalR 有一个默认大小为 1000 个元素的循环缓冲区,它将每个打开的连接的每条消息都存储到该缓冲区中。所以基本上,如果你有 100 个打开的连接,并且你已经发送了 1000 条消息,那么你的内存中总共将存储 100*1000 条消息。

您应该考虑的另一件事是 .Net 框架的大对象堆垃圾收集。每个大小大于 85kB 的对象都会进入大对象堆,接下来我应该指出垃圾收集器将大对象堆内的对象视为第二对象。考虑到这一点,您可能会意识到,一旦从 SignalR 的循环缓冲区中取消引用您的对象,由于它们的大小,它们不会立即被垃圾收集。

正如@davidfowl 所说,您确实可以使您的数据更小,但有时您将无法做到这一点,而无需在客户端和服务器上引入一些非常复杂的机制。

幸运的是,有一种方法可以减少 SignalR 的循环缓冲区的默认大小,您可以通过设置:

GlobalHost.Configuration.DefaultMessageBufferSize = 32
于 2015-09-30T20:35:53.867 回答