.Net核心级的性能优化(GC篇)

net,核心,性能,优化,gc · 浏览次数 : 0

小编点评

**GC垃圾回收配置** **一、GC动作** - **保存内存:**`System.GC.ConserveMemory(默认值为0)`:如果 `ConserveMemory` 设置为 `false`,则所有可用的内存都会分配给应用程序。 - **独立GC:**`DOTNET_GCName` 设置用于独立GC的名称。默认值为 `coreclr.dll`。 - **大型对象堆阈值:**`DOTNET_GCLOHThreshold` 设置大型对象堆的阈值。默认值为 85000 字节。 - **允许大型对象:**`DOTNET_gcAllowVeryLargeObjects` 设置允许使用大于 2 GB 的数组的垃圾回收。默认值为 `1`。 - **大型页面:**`DOTNET_GCLargePages` 设置使用大型页面堆的标志。默认值为 `0`,即不使用。 - **保留VM:**`DOTNET_GCRetainVM` 设置是否保留经过垃圾回收的段。默认值为 `false`,表示系统会回收这些段。 - **高内存百分比:**`DOTNET_GCHighMemPercent` 设置当物理内存负载超过其指定百分比时进行垃圾回收的标志。默认值为 90% 至 97%。 - **对象堆限制百分比:**`DOTNET_GCHeapHardLimitSOHPercent、`DOTNET_GCHeapHardLimitLOHPercent` 和 `DOTNET_GCHeapHardLimitPOHPercent` 设置对象堆限制的百分比。默认值为 20MB 或容器内存限制的 75%。 - **对象堆限制:**`DOTNET_GCHeapHardLimitPercent` 设置对象的堆限制百分比。默认值为 20MB 或容器内存限制的 75%。 **二、配置GC设置** - **运行时配置文件:**`runtimeconfig.json` 中保留 `System.GC.RetainVM` 设置。 - **MSbuild 配置:**设置 `RetainVMGarbageCollection` 属性为 `true`。 - **环境变量:**设置 `DOTNET_GCRetainVM` 到 `true`。

正文

1.前言

大部分人对于.Net性能优化,都停留在业务层面。或者简单的.Net框架配置层面。本篇来看下.Net核心部分GC垃圾回收配置:保留VM,大对象,独立GC,节省内存等.Net8里面有很多的各种GC配置,用以帮助你的程序进行最大程度性能提升和优化。

文章分为两部分,第一个是GC有哪些动作可以性能最大的优化,第二部分就是如何配置这些动作以便让你的程序达到这些性能效果。

2.GC动作

1.节省内存:System.GC.ConserveMemory(默认值为0)

2.独立GC:DOTNET_GCName(默认值,coreclr.dll的默认GC)

3.大型对象堆阈值DOTNET_GCLOHThreshold(默认值85000字节,指定值必须大于其)

4.允许大型对象DOTNET_gcAllowVeryLargeObjects(默认垃圾回收大于2GB的数组,也就是默认值为1)

5.大型页面DOTNET_GCLargePages,指示堆硬限制是否使用大型页面 DOTNET_GCLargePages(默认值为0,也即是不使用)

6.保留VM,DOTNET_GCRetainVM。意思是把一个经过垃圾回收,没有对象的段是被系统回收还是放在堆段列表,以便下次使用.(默认值false,被系统回收)

7.高内存百分比DOTNET_GCHighMemPercent,当物理内存负载大于其指定的值的时候,进行完整的垃圾回收,以便腾出跟多空间(默认负载阈值介于90%到 97%之间)

8.对象堆限制百分比

DOTNET_GCHeapHardLimitSOHPercent,DOTNET_GCHeapHardLimitLOHPercent,DOTNET_GCHeapHardLimitPOHPercent.分别为小对象堆,大对象堆,固定堆的限制百分比。

9.对象堆限制

DOTNET_GCHeapHardLimitSOH,DOTNET_GCHeapHardLimitLOH,DOTNET_GCHeapHardLimitPOH可以根据每个对象堆指定 GC 的允许堆使用量

10.堆限制百分比DOTNET_GCHeapHardLimitPercent默认值(仅在某些情况下适用)是20MB或容器内存限制的75%(以较大者为准)

11.堆限制DOTNET_GCHeapHardLimit默认值(仅在某些情况下适用)是20MB或容器内存限制的75%(以较大者为准)

12.关联DOTNET_GCNoAffinitize指定是否将垃圾回收线程与处理器关联。若要关联一个 GC 线程,则意味着它只能在其特定的 CPU 上运行。为每个 GC 线程创建一个堆。

13.CPU组DOTNET_GCCpuGroup,配置垃圾回收器是否使用CPU组。(默认值为0,表示不会跨CPU组)

14.关联范围DOTNET_GCHeapAffinitizeRanges,指定用于垃圾回收器线程的处理器列表。以逗号分隔的处理器编号列表或处理器编号范围。
Unix 示例:“1-10,12,50-52,70”
Windows 示例:“0:1-10,0:12,1:50-52,1:70”

15.关联掩码DOTNET_GCHeapAffinitizeMask,指定垃圾回收器线程应使用的确切处理器数。

16.堆计数DOTNET_GCHeapCount限制通过垃圾回收器创建的堆数。

3.配置

配置这些GC设置,主要是可以从三个方面来配置。
其一:运行时配置文件runtimeconfig.json
以保留VM为例:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.RetainVM": true
      }
   }
}

其二:MSbuild配置
以保留VM为例:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
  </PropertyGroup>
</Project>

其三:环境变量配置

Windows CMD:
set DOTNET_GCRetainVM=true

Windows Powershell:
$env:DOTNET_GCRetainVM=true

Unix/Linux
export DOTNET_GCRetainVM=true

以上16个GC动作均可以通过这个三个配置方式来进行配置。

参考微软官网:

https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector


欢迎关注公众号:jianghupt,文章首发,以及更多高阶内容分享。
image

与.Net核心级的性能优化(GC篇)相似的内容:

.Net核心级的性能优化(GC篇)

1.前言 大部分人对于.Net性能优化,都停留在业务层面。或者简单的.Net框架配置层面。本篇来看下.Net核心部分GC垃圾回收配置:保留VM,大对象,独立GC,节省内存等.Net8里面有很多的各种GC配置,用以帮助你的程序进行最大程度性能提升和优化。 文章分为两部分,第一个是GC有哪些动作可以性能

[转帖]腾讯服务注册中心演进及性能优化实践

https://my.oschina.net/u/4587289/blog/5577840 导语 注册中心作为微服务架构的核心,承担服务调用过程中的服务注册与寻址的职责。注册中心的演进是随着业务架构和需求的发展而进行演进的。腾讯当前内部服务数超百万级,日调用量超过万亿次,使用着统一的注册中心 ——

[转帖]数据库选型比对 Oracle vs sqlserver

http://blog.itpub.net/23825935/viewspace-2928407/ SQL Server 2014 优点 1. 内存 OLTP: 提供部署到核心 SQL Server 数据库中的内存 OLTP 功能,以显著提高数据库应用程序性能。 内存 OLTP 是随 SQL Ser

[转帖]CPU结构对Redis性能的影响

文章系转载,便于分类和归纳,源文地址:https://wangkai.blog.csdn.net/article/details/111571446 CPU的多核架构和多CPU架构都会影响到Redis的性能 CPU架构 多核架构 一个CPU处理器一般有多个运行核心,如何在Linux查看物理CPU个数

[转帖]CPU结构对Redis性能的影响

文章系转载,便于分类和归纳,源文地址:https://wangkai.blog.csdn.net/article/details/111571446 CPU的多核架构和多CPU架构都会影响到Redis的性能 CPU架构 多核架构 一个CPU处理器一般有多个运行核心,如何在Linux查看物理CPU个数

推荐一款.NET开源的轻量级分布式服务框架

前言 今天要给大家推荐一款由新生命开发团队开源的.NET轻量级分布式服务框架:星尘分布式平台(NewLife.Stardust)。 项目介绍 星尘是一个轻量级分布式服务框架。它的功能包含配置中心、集群管理、远程自动发布、服务治理、服务自动注册和发现、负载均衡、动态伸缩、故障转移、性能监控。 核心功能

创建.NET程序Dump的几种姿势

当一个应用程序运行的有问题时,生成一个Dump文件来调试它可能会很有用。在Windows、Linux或Azure上有许多方法可以生成转储文件。 Windows平台 dotnet-dump (Windows) dotnet-dump全局工具是一种收集和分析.NET核心应用程序Dump的方法。 安装 d

揭秘 .NET 中的 TimerQueue(上)

[TOC] # 前言 TimerQueue 是.NET中实现定时任务的核心组件,它是一个定时任务的管理器,负责存储和调度定时任务。它被用于实现很多 .NET 中的定时任务,比如 System.Threading.Timer、Task.Delay、CancellationTokenSource 等。

再谈http请求调用(Post与Get),项目研发的核心一环

支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) 【目录】 前言 Post请求 Get请求 与其它工具的比较 1【前言】 http请求调用是开发中经常会用到的功能。 在内,调用自有项目的Web Api等形式接口时会用到;在外,调用一些第三方功能接口时,也会用到,因

[转帖]sql server 2016不能全部用到CPU的逻辑核心数的问题

https://blog.csdn.net/u011966339/article/details/122969685 最近在工作中遇到了,sql server 2016 不能把CPU 的核心全部用到的问题.通过分析工具看到 总共CPU核心有72核,但sql 只能用到40核心,想信也有很多人遇到这问题