2013-08-30 167 views
1

我正在使用SignalR實時數據自動收報器,每秒發送給客戶端的單個對象中包含多達10k行。 IIS工作者處理器的內存不斷增加,直到滴答終於凍結。由於大量實時數據導致SignalR內存遺漏

+0

嘗試使數據更小。 – davidfowl

+0

10k行/秒的實時?我無法想象需要這種服務。你不能減少正在發送的數據量嗎? – enzi

+0

@dfowler:什麼是我可以每秒發送的最大郵件大小。而不會導致IIS工作進程的增加。 – zooney

回答

2

首先,你已經可以讀取SignalR是建立在你不會發送大消息的前提下的。但是,用真實的話來說,這是一個完全有效的方案。

那麼,什麼是處理內存問題。 SignalR具有一個默認大小爲1000個元素的循環緩衝區,它將每個打開的連接的每條消息存儲到該緩衝區中。所以基本上,如果你有100個打開的連接,並且你發送了1000條消息,那麼你的內存中將存儲總共100 * 1000條消息。

您應該考慮的另一件事是.Net框架的large objects heapgarbage collection。每個大小超過85kB的對象都會轉到大對象堆中,接下來我要指出垃圾收集器將大對象堆中的對象視爲第二個對象generation。考慮到這一點,您可能會意識到,一旦您的對象從SignalR的循環緩衝區中取消引用,由於它們的大小,它們將不會立即被垃圾收集。

@davidfowl說,你真的可以使你的數據更小,但有時你不能做到這一點,而無需在客戶端和服務器上引入一些非常複雜的機制。

Fortunatelly,有降低SignalR的循環緩衝區的默認大小的方式,你可以通過設置做到這一點:

GlobalHost.Configuration.DefaultMessageBufferSize = 32