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

33

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

MSDN说:

使用服务器优化的垃圾回收器(GC)而不是默认的工作站GC,从中获得了重要的好处。

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

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

但是我们没有看到性能突出!!! 有人有什么建议吗?


1
DanC。这是我第一次听说GC模式。你能发布任何相关MSDN页面的链接吗? - spender
1
你期望什么样的性能表现?你的程序是基于Windows GUI还是某种Web服务? - Cecil Has a Name
这里也有一些关于MSDN的内容:http://msdn.microsoft.com/en-us/library/bb680014.aspx - user198892
我的应用程序是一个大型的多线程C#应用程序,运行在一个多核4路服务器上。因此它既不是UI也不是Web服务...! - user198892
4个回答

20

这个解释不是很清晰,但据我所知,服务器模式是每个核心同步的,而工作站模式是异步的。

换句话说,工作站模式适用于一小部分需要持续表现的长时间运行的应用程序。垃圾回收试图“不干扰”,但结果是平均效率较低。

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

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

但那只是事后的辩解。测量您系统的性能(如ammoQ所说,不要测量您的GC性能,而是看您的应用程序行为表现如何),并使用您测量出的最佳结果。


3
或许值得补充的是,“服务器”对于不同的人有不同的含义。你可能认为“服务器”指的是“我新买的昂贵多核服务器”,而微软可能认为“服务器”指的是“用于同时执行多个不相关任务的计算机”。这两个定义都是有效的,但完全是不相关的。 - andrew cooke

9

.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中,工作站和服务器GC均提供了SustainedLowLatency模式。要开启它,请将GCSettings.LatencyMode属性设置为GCLatencyMode.SustainedLowLatency。


1
实际上,它引入了后台服务器垃圾回收,因为后台 GC 取代了服务器和客户端上的并发 GC。 - i3arnon
@I3arnon,请问哪种模式的背景更好?我将我的应用程序设置为服务器模式,它产生了巨大的提升。 - Furkan Gözükara
GC服务器默认在.NET 4.5后台启用,对吧? - Furkan Gözükara
@MonsterMMORPG ".NET Framework 4.5 开始,后台服务器垃圾回收是服务器垃圾回收的默认模式" http://msdn.microsoft.com/zh-cn/library/ee787088(v=vs.110).aspx - i3arnon

4

服务器: 您的程序是机器上唯一重要的应用程序,并且需要尽可能低的GC延迟。

工作站: 您有一个UI界面或与其他重要进程共享机器。


0

我在 .NET 6 上进行了我的数据库引擎测试,比较了不同的GC设置性能。总体而言,在使用6堆的情况下,并没有发生超过300%的改进。

https://vimeo.com/711964445

runtimeconfig.template.json

{
  "configProperties": {
    "System.GC.HeapHardLimit": 8000000000,
    "System.GC.Server": true,
    "System.GC.HeapCount": 6
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接