我们应该使用“工作站”垃圾收集还是“服务器”垃圾收集?

时间:2009-11-10 11:19:41

标签: c# .net garbage-collection

我有一个在多核4路服务器上运行的大型多线程C#应用程序。目前我们正在使用“服务器模式”垃圾收集。但是测试表明工作站模式GC更快。

MSDN says

  

使用服务器API的托管代码应用程序通过使用服务器优化的垃圾收集器(GC)而不是默认的工作站GC获得了显着的好处。

     

Workstation是默认的GC模式,也是单处理器计算机上唯一可用的模式。 Workstation GC托管在控制台和Windows窗体应用程序中。它与正在运行的程序同时执行完整(第2代)集合,从而最大限度地减少延迟。此模式对于客户端应用程序非常有用,其中感知性能通常比原始吞吐量更重要。

     

服务器GC仅在多处理器计算机上可用。它为每个处理器创建一个单独的托管堆和线程,并且并行执行集合。在收集期间,所有托管线程都会暂停(运行本机代码的线程仅在本机调用返回时暂停)。通过这种方式,服务器GC模式可以最大化吞吐量(每秒请求数),并随着处理器数量的增加而提高性能。性能尤其适用于具有四个或更多处理器的计算机。

但我们没有看到表现闪耀!!!!有没有人有任何建议?

3 个答案:

答案 0 :(得分:17)

它没有得到很好的解释,但据我所知,服务器模式是每个核心同步,而工作站模式是异步的。

换句话说,工作站模式适用于需要一致性能的少数长时间运行的应用程序。垃圾收集试图“避开”,但结果是平均效率较低。

服务器模式适用于每个“作业”相对较短且由单个核心处理的应用程序(编辑:思考多线程Web服务器)。这个想法是每个“工作”获得所有的CPU功能,并快速完成,但有时核心停止处理请求并清理内存。因此,在这种情况下,希望GC平均效率更高,但核心在运行时不可用,因此应用程序需要能够适应它。

在你的情况下听起来像,因为你有一个线程相对耦合的应用程序,你更适合第一个模式而不是第二个模式所期望的模型。

但这只是事后的理由。衡量系统的性能(正如ammoQ所说,不是你的GC性能,而是应用程序的表现)并使用你衡量的最佳方式。

答案 1 :(得分:6)

.NET 4.5引入了并发服务器垃圾回收。

http://msdn.microsoft.com/en-us/library/ee787088.aspx

specify <gcServer enabled="true"/> 
specify <gcConcurrent enabled="true"/> (this is the default so can be omitted)

还有新的SustainedLowLatencyMode;

在.NET Framework 4.5中,SustainedLowLatency模式可用于工作站和服务器GC。要将其打开,请将GCSettings.LatencyMode属性设置为GCLatencyMode.SustainedLowLatency。

答案 2 :(得分:3)

服务器:您的程序是计算机上唯一重要的应用程序,并且GC所需的等待时间尽可能短。

工作站:您拥有UI或与其他重要进程共享计算机