2013-07-16 65 views
1

我有一個組件X代理客戶端和服務器。客戶端和服務器連接都是WCF。問題是,在高負載下,WCF似乎不會發佈會話或某種類型的東西。我在這些跡象後得出了這樣的結論:WCF卸載將不會釋放內存,直到加載結束 - 可能會話

1)在負載情況下,內存不斷增長。

2)內存分析器AQTime顯示沒有泄漏。在加載期間主動調用垃圾收集器(使用GC.Collect和GC.WaitForPendingFinalizers)會釋放一些內存,但仍在增長。但是在負載關閉後,所有的內存都被釋放。

3)後,我改變了通信框架從WCF到ZeroMQ該組件和他連接到內存中的一個之間作用更好 - 它幾乎不會增長。

組件的描述:

它使用net.tcp綁定連接到分量Y,並用的net.tcp偵聽爲好。綁定定義是:

<binding 
     name="netTcpBinding_Server" 
     maxReceivedMessageSize="1073741824" 
     maxBufferSize="1073741824" 
     transferMode="Buffered"> 
     <security mode="None" /> 
     <readerQuotas maxArrayLength="1073741824" maxStringContentLength="1073741824" /> 
    </binding> 

    <binding name="netTcpBinding_Client" 
     maxReceivedMessageSize="1073741824" 
     openTimeout="00.00:00:30" 
     closeTimeout="00.00:00:30" 
     receiveTimeout="Infinite"> 
     <security mode="None" /> 
     <readerQuotas maxArrayLength="1073741824" maxStringContentLength="1073741824" /> 
    </binding> 

行爲:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServerServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <serviceThrottling maxConcurrentSessions="64" maxConcurrentCalls="128" maxConcurrentInstances="192" /> 
    </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
    <behavior name="ServerEndPointBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="6553600"/> 
     <protobuf/> 
    </behavior> 

    <behavior name="ClinetEndPointBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="6553600"/> 
     <protobuf/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

<extensions> 
    <behaviorExtensions> 
    <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.280, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/> 
    </behaviorExtensions> 
</extensions> 

如果有人想要更多的細節,我會很樂意給盡我所能。請問有人能告訴我這是否是一種熟悉的行爲,以及我能否做點什麼?

在此先感謝!

馬克西姆

回答

0

這樣的東西:MAXBUFFERSIZE =「1073741824」將導致WCF搶那麼多內存,絕不讓它去,直到應用被卸載。

您正在告訴框架,您打算在瞬間給它1,073,741,824字節的數據,因此「準備就緒」,因此無論如何保存這些ram空間量,無論如何保存性能命中GC。

你基本上告訴端點「總是消耗超過1GB的內存」。

你怎麼能有一個數組或字符串值的緩衝區的大小?

的MaxArrayLength = 「1073741824」 maxStringContentLength = 「1073741824」

這些設置就沒有任何意義。