Signalr 由于大量实时数据,信号机内存不足异常

Signalr 由于大量实时数据,信号机内存不足异常,signalr,out-of-memory,iis-express,real-time-updates,Signalr,Out Of Memory,Iis Express,Real Time Updates,我使用SignalR作为实时数据记录器,每秒向客户端发送单个对象中包含多达10k行。IIS worker处理器的内存一直在增加,直到滴答声最终冻结。首先,因为您已经可以读取Signal,它建立在您不会发送大消息的前提下。然而,实际上,这是一个完全有效的方案 那么,如何处理内存问题呢。SignalR有一个默认大小为1000个元素的循环缓冲区,它将每个打开的连接的每条消息存储到该缓冲区中。所以基本上,如果你有100个打开的连接,并且你已经发送了1000条消息,那么在你的内存中总共会存储100*100

我使用SignalR作为实时数据记录器,每秒向客户端发送单个对象中包含多达10k行。IIS worker处理器的内存一直在增加,直到滴答声最终冻结。

首先,因为您已经可以读取Signal,它建立在您不会发送大消息的前提下。然而,实际上,这是一个完全有效的方案

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

您应该考虑的另一件事是.NETFramework的和。每一个大于85kB的对象都会进入大对象堆,接下来我要指出的是,垃圾收集器将大对象堆中的对象视为第二个对象。考虑到这一点,您可能会意识到,对象一旦从信号器的循环缓冲区中解除引用,就不会由于其大小而立即被垃圾收集

正如@davidfoll所说,您确实可以使数据变得更小,但有时如果不在客户端和服务器上引入一些相当复杂的机制,您将无法做到这一点

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

GlobalHost.Configuration.DefaultMessageBufferSize = 32

首先,正如您已经了解到的,Signaler是建立在您不会发送大消息的前提下的。然而,实际上,这是一个完全有效的方案

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

您应该考虑的另一件事是.NETFramework的和。每一个大于85kB的对象都会进入大对象堆,接下来我要指出的是,垃圾收集器将大对象堆中的对象视为第二个对象。考虑到这一点,您可能会意识到,对象一旦从信号器的循环缓冲区中解除引用,就不会由于其大小而立即被垃圾收集

正如@davidfoll所说,您确实可以使数据变得更小,但有时如果不在客户端和服务器上引入一些相当复杂的机制,您将无法做到这一点

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

GlobalHost.Configuration.DefaultMessageBufferSize = 32

是否尝试将数据实时缩小到每秒0.10k行?我无法想象一项服务会需要这样的服务。你不能减少发送的数据量吗?@dfowler:我每秒可以发送的最大消息量是多少。不会导致IIS工作进程的增加。?@enzi我想知道在不造成任何瓶颈的情况下,我每秒可以发送的最大数据量。我的1000行数据达到300KB,工作正常。那么阈值是多少?没有最大大小,只是发送大对象时性能不佳。我们通常期望数据在1K以下,因为它是在服务器上缓冲的。阅读本文,尝试将数据实时缩小到每秒0.10k行?我无法想象一项服务会需要这样的服务。你不能减少发送的数据量吗?@dfowler:我每秒可以发送的最大消息量是多少。不会导致IIS工作进程的增加。?@enzi我想知道在不造成任何瓶颈的情况下,我每秒可以发送的最大数据量。我的1000行数据达到300KB,工作正常。那么阈值是多少?没有最大大小,只是发送大对象时性能不佳。我们通常期望数据在1K以下,因为它是在服务器上缓冲的。读这个