【问题标题】:What is server garbage collection in ASP.NET Core?什么是 ASP.NET Core 中的服务器垃圾回收?
【发布时间】:2017-10-23 09:19:59
【问题描述】:

我已经将一个 ASP.NET Core 项目升级到 VS2017 和新的 csproj,并且有这个选项:

<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

什么是服务器垃圾回收?没有适当的文档,只有 migration guide 假设您已经知道它是什么。

(除非有正式的文档,否则请告诉我。)


总结:不幸的是,文档中没有关于许多底层技术的详细信息。但是@PanagiotisKanavos 的链接有关于“服务器 gc”here 的重要信息。

【问题讨论】:

  • 你试过谷歌搜索吗?有很多文档可以追溯到几年前。这对 .NET Core 来说并不新鲜,即使该属性有一个新名称
  • 可能和this一样?
  • 然后你看到第一个结果是Fundamentals of Garbage Collection,这解释了工作站和服务器垃圾收集之间的区别。 .NET Core 并没有改变这一点

标签: c# .net asp.net-core .net-core csproj


【解决方案1】:

这似乎是普通(工作站)和并发(服务器)垃圾收集策略之间的区别。基本上,工作站方法在许多极端情况下都会遇到问题。大规模多线程场景(如 ASP Web 服务器)就是这种极端情况的主要例子:

https://social.msdn.microsoft.com/Forums/en-US/286d8c7f-87ca-46b9-9608-2b559d7dc79f/garbage-collection-pros-and-limits?forum=csharpgeneral

请注意,并发 GC 存在弱引用和碎片整理的自然问题,但如果这适用于 .NET Core 实现,我不知道。 .NET Core 团队可以对代码进行各种改进,这涉及到设计 GC 内存管理器的领域。

也许它只定义了标记部分将使用多少并发线程(工作站默认为 1)。它还可能包括一些修改过的内存分配策略,以避免碎片整理等问题。 在任何一种情况下,实际的集合本质上都必须运行单线程,暂停所有托管线程,并且会受到内存速度的限制,而不是 CPU 速度。

【讨论】:

  • 虽然这个答案是正确的(符合典型推理),但我只想指出存在需要在工作站模式而不是服务器模式下运行应用程序的情况(非常罕见,并且仅当服务器模式给你带来悲惨的崩溃时)。当然,如果您愿意,您应该向 Microsoft 支持报告此类崩溃,以便他们改进 GC。
【解决方案2】:

msdn 文档...

https://msdn.microsoft.com/en-us/library/ms229357(v=vs.110).aspx

公共语言运行时 (CLR) 支持两种类型的垃圾 收集:工作站垃圾收集,所有可用 系统和服务器垃圾收集,可在 多处理器系统。您使用元素来控制 CLR 执行的垃圾收集类型。使用 GCSettings.IsServerGC 属性判断服务器是否垃圾 收集已启用。

对于单处理器计算机,默认工作站垃圾 收藏应该是最快的选择。工作站或服务器 可用于双处理器计算机。服务器垃圾回收 应该是两个以上处理器的最快选择。

该元素只能在应用程序配置文件中使用; 如果它在机器配置文件中,则忽略它。

【讨论】:

  • 这就是我在上面的 cmets 中的意思。这个描述实际上并没有解释什么是“服务器垃圾收集”。只是有这样的事情,它发生在服务器上,还有其他选项,以及您应该在哪个硬件上使用它。但它是什么???
  • @grokky “这是什么”是一个毫无意义的问题。您需要解释的服务器垃圾收集模型中缺少什么?您是否正在寻找特定系统配置上的 .NET Server GC 的源代码?您是否正在寻找一个神奇的词来代替您的困惑?你希望什么样的信息能让自己满意?扩展描述是沟通的开始;内涵描述对你有什么帮助?您是否对 GC 有广泛的了解,是否了解它如何映射到 .NET 中所谓的“服务器 GC”?
  • @Luaan 这是一个简单的混淆(我认为)。 OP 假设 .NET Core 中的 GC 不同,因此绕过了所有未在 .NET Core 中明确提及服务器 GC 的文档和参考资料。鉴于它没有不同,因此没有此类文档。第 22 条军规
  • @Luaan no 我正在寻找一个理性问题的理性答案,因为其他人非常友好地提供了帮助。
  • @PanagiotisKanavos 里面有一个部分解释了优点/缺点,好东西。您可以在开始时添加一个答案,并避免所有的肮脏。尽管如此,感谢您的链接。
【解决方案3】:

migrating over 时,ServerGarbageCollection 映射自System.GC.Server

<PropertyGroup>
  <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

什么是服务器垃圾回收?

简单地说,它是一个配置值,指示 .net 运行时执行server garbage collection。历史上this was managed by the project.json。它启用/禁用服务器垃圾收集。

这是您将要找到的最接近官方文档,它是关于在project.json 中添加此选项的公告。

https://github.com/aspnet/Announcements/issues/175

同样,这里有更多详细信息:

https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/clr-configuration-knobs.md#host-configuration-knobs

【讨论】:

  • 此设置使我的应用程序无响应并消耗 GB 内存。我必须在我的 asp.net core 3.1 应用程序中将其关闭,然后应用程序开始工作
【解决方案4】:

它在服务器(超过 1 个处理器)或工作站(1 个处理器)之间切换 GC。

【讨论】:

  • 并且要明确“处理器”实际上是“CPU核心”(实际上是CPU线程,我认为)。因此,这不像“NUMA 中的多 CPU 是一件事”,而是“像 2005 年之后制造的所有计算机”中的多 CPU。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2010-11-10
  • 2011-01-20
相关资源
最近更新 更多