动态适应应用程序大小 (DATAS)

动态适应应用程序大小 (DATAS) GC 旨在适应应用程序内存要求。 这意味着应用程序堆大小应与长期数据大小大致成正比。 如果应用在不同规格的计算机上运行时执行相同的工作,则堆大小相同或类似。 如果工作负载变轻或变重,堆大小也会相应调整。

相比之下,服务器 GC 模式旨在提高吞吐量,并将进程视为计算机上的主导进程。 在触发下一个 GC 之前,它允许的分配量基于吞吐量,而不是应用程序大小。 如果需要并且有可用内存,可以积极地扩展堆。 在具有不同硬件规格的计算机上运行进程时,这种增长可能会导致堆大小非常不同。 当将进程移动到具有更多内核和更多内存的计算机上时,堆可能会变得更大。 如果工作负载变得更轻,服务器 GC 也不一定会积极调整堆。

DATAS 对“突发”工作负载最有帮助,在这种情况下,堆大小应该根据工作负载的要求进行调整,特别是在需求减少时。 这在内存受限的环境中尤为重要,当一些进程的工作负载减轻时,容纳更多的进程非常重要。 它还有助于容量规划。 DATAS 在 .NET 8 中作为选择加入功能引入,在 .NET 9 中默认启用。

功能描述

为了实现应用大小自适应并保持合理的性能,DATAS 执行以下操作:

  • 它根据长期数据大小设置在触发下一个 GC 之前允许的最大分配量。 这有助于限制堆大小。
  • 它根据吞吐量设置允许的实际分配量。
  • 它在需要时调整堆的数量。 它从一个堆开始,这意味着如果有许多线程正在分配,有些线程将需要等待。 这会对吞吐量产生负面影响。 DATAS 根据需要增加和减少堆的数量。 通过这种方式,它是现有 GC 模式的混合体,能够使用少至一个堆(如工作站 GC)和多至与计算机核心计数匹配的堆(如服务器 GC)。
  • 在需要时,它会对 GC 进行完全压缩,以防止碎片过高,这也有助于限制堆大小。

基准结果

下图显示了 TechEmpower JSON 和 Fortunes 的一些基准测试结果。 请注意,在使用 Linux 的 48 核计算机上运行基准测试时,工作集显著减少。 最大吞吐量(以 RPS 为单位)显示减少了 2-3%,但工作集提高了 80% 以上。

工作集改进。

启用 DATAS 后,Gen0 和 Gen1 GCS 的数量显著增加。

Gen0 和 Gen1 计数。

如何禁用 DATAS

如果注意到吞吐量降低,可以使用各种设置禁用 DATAS。 有关详细信息,请参阅动态适应应用程序大小 (DATAS)