我正在使用SignalR进行实时数据自动收录器,每秒发送到客户端的单个对象中包含多达10k行。 IIS工作器处理器的内存不断增加,直到滴答声最终冻结。
答案 0 :(得分:2)
首先,正如您已经可以阅读的那样,SignalR建立在您不会发送大量消息的前提下。但是,用一个真实的词来说,它是一个非常有效的场景。
那么,处理内存问题是什么。 SignalR有一个循环缓冲区,默认大小为1000个元素,它将每个打开的连接中的每条消息存储到该缓冲区中。所以基本上,如果您有100个已打开的连接,并且您已经发送了1000条消息,那么将在您的内存中存储总共100 * 1000条消息。
您应该考虑的另一件事是.Net框架large objects heap和garbage collection。每个大小超过85kB的对象都将进入大对象堆,接下来我应该指出垃圾收集器将大对象堆内的对象视为第二个generation对象。考虑到这一点,你可以意识到你的对象一旦从SignalR的循环缓冲区中被取消引用,就不会因为它们的大小而立即被垃圾收集。
正如@davidfowl所说,你真的可以让你的数据更小,但有时你无法在客户端和服务器上引入一些相当复杂的机制而无法做到这一点。
幸运的是,有一种方法可以减少SignalR的循环缓冲区的默认大小,你可以通过设置来实现:
GlobalHost.Configuration.DefaultMessageBufferSize = 32