讨论.NET Core 配置对GC 工作模式与内存的影响

引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析

Asp.net core应用在 Kubernetes上内存使用率过高问题分析

这篇文章中讨论了,在默认情况下,ASP.NET Core程序跑在K8s的Docker中内存使用率>=600MB,导致Docker容器频繁重启。并探讨并做了将ASP.NET Core项目配置System.GC.Server设置为False后,内存小于<=150MB的实验。

这文主要讲下什么是System.GC.Server,还有GC的二种模式。


对GC工作模式的分类:

.NET Core 两种GC模式:

Server GC / Workstation GC 

Server GC :

主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置。它会为每个处理器都创建一个GC Heap,并且会并行执行回收操作。该模式的GC可以最大化吞吐量和较好的收缩性。这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作。

Workstation GC :

主要应用于单处理器系统,Workstation GC尽可能地通过减少垃圾回收过程中程序的暂停次数来提高性能。低负载且不常在后台(如服务)执行任务的应用程序,可以在禁用并发垃圾回收的情况下使用工作站垃圾回收。特点是会频繁回收,来阻止一次较长时间的回收。

Concurrent GC 工作方式 :

是一种GC的工作方式,如果你是单处理器的机器,那么即便配置了Concurrent选项为True,也不会生效。Server GC 和Workstation GC都可以开启Concurrent GC,在GC回收的过程中大部分时间用户线程可以并发运行。但只能影响到2代对象GC的过程,因为0代1代的时间太短了。

5.ASP.NET Core Project GC配置:

ASP.NET CORE项目中,通过System.GC.Server配置进行GC模式设置,创建项目默认的GC模式是: System.GC.Server : true (Server GC Concurrent Mode) 每CPU分配GC ;System.GC.Server : false (Workstation GC Concurrent mode),且Concurrent=1。

GC 内存分配原则:

GC heap用于保存0、1、2代的对象时,需要向系统申请时的基本单位是Segment,系统会分配指定值大小的Segment用于存储对象,这些值会随着程序的实际执行情况,由GC动态调整。正是由于有Segment的概念所以回出现内存碎片的问题,所以GC在垃圾回收过程中会进行内存整理,以减少内存碎片提高内存使用率。

Segment的大小取决于系统是32位还是64位,以及它正在运行的垃圾收集器的类型,下表列出了分配时系统所使用的默认值:

GC Model 32-bit 64-bit
Workstation GC 16 MB 256 MB
Server GC 64 MB 4 GB
Server GC with > 4 logical CPUs 32 MB 2 GB
Server GC with > 8 logical CPUs 16 MB 1 GB

Segment包括第2代对象,第2代对象会在内存允许的情况尽可能多的申请到内存,并使用多个段进行内存存储。
从GC中释放的内存量仅限于Segment的大小,但由于Segment采用动态大小进行了分配,这就使得释放后的大量内存占位导致内存使用率低下,前面也说过了,为了解决这个问题GC要对内存碎片进行整理,并中断所有线程的处理。


.NET Core GC的几种配置模式:

Concurrent & Workstation GC

<ServerGarbageCollection>false</ServerGarbageCollection><ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特点:在吞吐量和相应速度上寻找平衡点, GC Heap数量为1,GC threads在分配空间的线程,GC线程优先权和工作线程具有相同的优先权,工作线程(非GC线程)会因为GC工作过程中短暂多次挂起。

Background & Workstation GC

<ServerGarbageCollection>false</ServerGarbageCollection><ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特点:最大化吞吐量并优化gen2 GC性能, GC Heap数量为1,background GC线程与工作线程有相同优先级,但都低于前台GC线程 ,工作线程(非GC线程)会因为GC工作过程中短暂多次挂起,较并发性能更加(针对Gen2的)。

Concurrent & Server GC

<ServerGarbageCollection>true</ServerGarbageCollection><ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特点:多处理器机器上使用多线程处理相同类型的请求以便最大化服务程序吞吐量, GC Heap数量为每处理器1个,每个处理器都有一个专职的GC线程,GC线程拥有最高线程的优先级,工作线程(非GC线程)会因为GC工作过程中会被挂起。

Background & Server GC

<ServerGarbageCollection>true</ServerGarbageCollection><ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特点:在Concurrent & Server GC基础上优化gen2 GC性能, GC Heap数量为每处理器1个,每个处理器都有一个专职的GC background线程,background GC线程与工作线程有相同优先级,但都低于前台GC线程,工作线程(非GC线程)会因为GC工作过程中短暂多次挂起,较并发性能更加(针对Gen2的)
ephemeral generation的前台GC工作时会挂起其他所有线程。


GC几种模式的分析 (参考资料):

https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals

https://github.com/aspnet/Home/issues/2056


推广

GitHub:https://github.com/maxzhang1985/YOYOFx 如果觉还可以请Star下, 欢迎一起交流。

.NET Core 开源学习群:214741894

原文地址:http://www.cnblogs.com/maxzhang1985/p/7836088.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop生态hive(六)Hive QL表

一、创建表 语法&#xff1a; create [temporary] [external] table [if not exists] [db_name.] table_name [(col_name data_type [comment col_comment], ...)] [comment table_comment] [row format row_format] [stored as file_format] 例子&#xff1a; create tab…

v-for渲染img标签图片

错误的示例 <div v-for"item in list"><img src"{{item.image}}" /> </div>这样做会报错 正确的做法应该是 <div v-for"item in list"><img :src"item.image" /> </div>这样就可以把后端接口的…

Mono的新解释器

Mono即将通过它的JIT编译器和静态编译器以及一个.net解释器以带来一些新的方式来运行你的代码. 在2001年Mono项目诞生之时&#xff0c;我们为.net指令集实现了一个解释器用基于它实现了一个在Linux上的自托管的.net开发环境. 当时我们把解释器定义为一个用来构建JIT编译器的临时…

欢乐纪中某B组赛【2019.1.27】

前言 写完T1T1T1和T2T2T2颓了半天 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2222017myself2017myself2017myself2302302301001001001001001003030304442017xxy2017xxy2017xxy2002002001001001001001001000001111112017zyc2017zy…

Apache Druid(一)简介

翻译自 Apache Druid Apache Druid&#xff08;正在孵化&#xff09;是一个开源的分布式数据存储。德鲁伊的核心设计结合了OLAP /分析数据库&#xff0c;时间序列数据库和搜索系统的思想&#xff0c;为广泛的用例创建了一个统一的系统。Druid将这三个系统中的每个系统的关键特…

[ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了

发现问题 在将 FineUIMvc&#xff08;支持ASP.NET MVC 5.2.3&#xff09;升级到 ASP.NET Core 2.0 的过程中&#xff0c;我们发现一个奇怪的现象&#xff1a; 通过项目引用 FineUICore 工程一切正常&#xff0c;但是将 FineUICore 编译后&#xff0c;通过程序集的引用方式就会报…

设计事件驱动的微服务

事件驱动的微服务是一个未受到应有探讨的领域&#xff0c;在近日举行的Con伦敦2017微服务大会上&#xff0c;Greg Young表达了这样的观点。同时&#xff0c;他还特别强调&#xff0c;不应该对所有的微服务都使用事件驱动模式。相反&#xff0c;他建议逐个服务进行考察&#xff…

express中获取url参数

问号传参获取参数 获取 http://127.0.0.1:3001/user?id10&namezs 中的查询参数&#xff1a; 直接使用 req.query 获取参数即可&#xff1b; 注意&#xff1a;URL 地址栏中通过 查询字符串 传递的参数&#xff0c;express 框架会直接解析&#xff0c;大家只需使用 req.que…

处理ASP.NET Core中的HTML5客户端路由回退

在使用由Angular&#xff0c;React&#xff0c;Vue等应用程序框架构建的客户端应用程序时&#xff0c;您总是会处理HTML5客户端路由&#xff0c;它将完全在浏览器中处理到页面和组件的客户端路由。几乎完全在浏览器中... HTML5客户端路由在客户端上工作的很好&#xff0c;但是当…

TFS在项目中DevOps落地进程(下)

紧接上篇 TFS在项目中Devops落地进程&#xff08;上&#xff09; 再接着说TFS相关之前先插入一个番外篇&#xff0c;虽然跟TFS关系不大但跟DevOps关系很大&#xff0c;觉得有必要在此乱入一下。 番外篇--监控之Application Insights 我们之前并没有任何监控类产品&#xff08;我…

欢乐纪中某B组赛【2019.1.28】

前言 心态爆炸 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD3332017myself2017myself2017myself1901901901001001005050500004040401313132017zyc2017zyc2017zyc1701701707070706060600004040401313132017hzb2017hzb2017hzb1701…

这应该是目前最快速有效的ASP.NET Core学习方式(视频)

ASP.NET Core都2.0了&#xff0c;它的普及还是不太好。作为一个.NET的老司机&#xff0c;我觉得.NET Core给我带来了很多的乐趣。Linux&#xff0c; Docker&#xff0c; CloudNative&#xff0c;MicroService&#xff0c;DevOps这些都能跟它很完美的结合&#xff0c;再加ASP.NE…

大叔公开课~微服务与持久集成

闲话多说 免费报名&#xff1a;http://www.genshuixue.com/teacher/classCourseDetail/171117794648么可以通过阅读原文报名 .Net Core来了&#xff0c;带给我们的是什么&#xff1f;跨平台&#xff0c;无疑是最大的亮点&#xff01; Docker横空出世&#xff0c;让开发者和运维…

语音服务——腾讯云

腾讯语音服务文档 一、开通语音消息服务流程 &#xff08;1&#xff09;注册并认证 如果您还没有腾讯云账号&#xff0c;您需要 注册腾讯云 账号&#xff0c;并完成 企业实名认证。如果您已有企业认证的腾讯云账号&#xff0c;请直接进行下一步操作。 申请开通语音消息服务 …

Visual Studio交叉编译器提供对ARM的支持

只要ARM平台能够运行Windows&#xff0c;Visual Studio就有能力拓展ARM平台。在Visual Studio 2017 15.5预览版2中&#xff0c;该IDE通过使用GCC编译器&#xff0c;增加了对基于ARM的计算机和物联网&#xff08;IoT&#xff09;设备的支持力度&#xff0c;从而扩展了对ARM平台的…

我心中的ASP.NET Core 新核心对象WebHost(二)

这是ASP.NET Core新核心对象系列的第二篇&#xff0c;上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置。我们给WebHostBuilder进行以下配置 UseKestrel 设置Kestrel为HttpServer ConfigureAppConfiguration 设置了配置文件 ConfigureLogging 配置了日志处理器…

Hadoop生态Flume(三)拦截器(Interceptor)介绍与使用(1)

转载自 Flume中的拦截器&#xff08;Interceptor&#xff09;介绍与使用&#xff08;一&#xff09; Flume中的拦截器&#xff08;interceptor&#xff09; 用户Source读取events发送到Sink的时候&#xff0c;在events header中加入一些有用的信息&#xff0c;或者对events的…

SOA对微服务的残余影响

近日&#xff0c;Tareq Abedrabbo在伦敦2017 Con微服务大会上说&#xff0c;SOA对微服务架构设计的残余影响仍然存在&#xff0c;包括技术选型和组织方面的问题。最直接的一个例子就是大多数企业仍然区分对待架构师和开发人员&#xff0c;架构师负责出规范&#xff0c;开发人员…

Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)

转载自 Flume中的拦截器&#xff08;Interceptor&#xff09;介绍与使用&#xff08;二&#xff09; lume中的拦截器&#xff08;interceptor&#xff09;&#xff0c;用户Source读取events发送到Sink的时候&#xff0c;在events header中加入一些有用的信息&#xff0c;或者对…

协作更进一步:微软隆重介绍Visual Studio动态分享功能

微软刚刚在 Visual Studio Code 网站上宣布了“动态分享”&#xff08;Live Share&#xff09;功能&#xff0c;开发者们可以在 VS 2017 或 VS Code 中体验全新的实施协作。微软表示&#xff0c;Live Share 可让团队在相同的代码库上启用快速协作&#xff0c;而无需同步代码或配…