.NET Core 3.0 即将发布RC,.NET Core 3.0默认更好的支持Docker资源限制,官方团队也在努力让.NET Core成为真正的容器运行时,使其在低内存环境中具有容器感知功能并高效运行。

GC堆限制

.NET Core减少了CoreCLR默认使用的内存,如G0代内存分配预算,以更好地与现代处理器缓存大小和缓存层次结构保持一致。

在新的创建的GC堆数量的策略里,GC保留了一个内存片段,每个堆最小是16M,在低内存限制的机器上也可以很好的运行。在多核CPU的机器上运行时,系统并没有设置CPU的核数限制。例如,如果在48核计算机上设置160 MB内存限制,则不需要创建48个GC堆。也就是说如果设置160 MB限制,则只会创建10个GC堆。如果未设置CPU限制,应用程序可以利用计算机上的所有核心。

有了这样的新策略,可以不需要启用Docker环境下的.NET Core应用的工作站GC的工作负载。

支持Docker内存限制

Docker资源限制建立在cgroup之上,而cgroup是Linux的内核功能。从运行时的角度来看,我们需要定位cgroup原语。

设置cgroup限制时的.NET Core 3.0内存使用规则:

  • 默认GC堆大小:容器上cgroup内存限制的最大值20MB或最大值的75%

  • 每个GC堆的最小保留段大小16MB,这将减少在具有大量内核和小内存限制的计算机上创建的堆数

为了支持容器方案,添加了2个HardLimit配置:

  • GCHeapHardLimit - 指定GC堆的硬限制

  • GCHeapHardLimitPercent - 指定允许此进程使用的物理内存的百分比

如果同时指定了两者,则首先检查GCHeapHardLimit,并且只有在未指定GCHeapHardLimit时才检查GCHeapHardLimitPercent。

如果两者都未指定,但进程正在有内存限制的容器中运行,则默认是使用如下设置:

max(20mb,容器内存限制的75%)

如果指定了hardlimit配置,并且程序在有内存限制的容器中使用,GC堆的使用不会超过hardlimit限制,但总内存仍然受容器的内存限制。所以当我们统计内存消耗时,基于容器内存限制得出的数据。

举例:

进程在设置了200MB限制的容器中运行,用户还将GCHeapHardLimit配置为100MB。

如果把GC限制中100MB限制中的50MB用于GC,而容器限制中剩余的100MB用于其他用途,那么内存消耗即为(50+100)/200=75%。

GC将更积极地执行资源回收与释放,因为GC堆越接近GCHeapHardLimit限制,就越能实现提供更多可用内存的目标,也越能使得应用程序可以继续而又安全地运行。如果算法计算出的结果认为此时的GC效率低下,那么将避免持续执行完全阻塞的GC。

即使GC堆完全压缩,GC依然会抛出一个OutOfMemoryException异常出来,这是因为所分配的堆大小超过了GCHeapHardLimit的限制。

由此可见,.NET Core 3.0的设计是要稳定运行于有资源限制的容器中。

支持DockerCPU限制

在CPU限制的情况下,Docker上设置的值将向上舍入为下一个整数值。此值是CoreCLR使用的最大有效CPU核数。

默认情况下,ASP.NET Core应用程序启用了服务器GC(它不适用于控制台应用程序),因为它可以实现高吞吐量并减少跨核心的争用。当进程仅限于单个处理器时,运行时会自动切换到工作站GC。即使您明确指定使用服务器GC,工作站GC也将始终用于单核环境。

通过计算CPU繁忙时间,设置CPU限制,我们避免了线程池的各种推导性竞争:

  • 尝试分配更多的线程以增加CPU繁忙时间

  • 尝试分配更少的线程,因为添加更多的线程不会提高吞吐量

你应该会看到很多关于Kubernetes和Docker的消息,以至于你可能想知道哪个更好。事实上,没有“更好”一说,因为它们所解决的问题是不一样的。Docker就像飞机,而Kubernetes就像飞机场。就像你不可能说“我应该基于哪个去旅行——飞机或者飞机场?”,Docker和Kubernetes也是一样的,你需要它们两个。今天做一个调查。

相关文章:

  • 张善友:基于Kubernetes 构建.NET Core 技术中台(附视频回顾)

  • 面向 Kubernetes 编程: Kubernetes 是下一代操作系统

  • Kubernetes应用部署模型解析(部署篇)

  • Docker+ Kubernetes已成为云计算的主流(二十六)

  • .NET Core Run On Docker By Kubernetes 系列文章汇总


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

.NET 云原生技术使用调查相关推荐

  1. KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载

    2020 年 7 月 30 日至 8 月 1 日,由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 Cloud Native + Open S ...

  2. 一份关于.NET Core云原生采用情况调查

    调查背景 Kubernetes 越来越多地在生产环境中使用,围绕 Kubernetes 的整个生态系统在不断演进,新的工具和解决方案也在持续发布.云原生计算的发展驱动着各个企业转向遵循云原生原则(启动 ...

  3. 行云创新受邀加入信通院云原生成熟度专家组,开启业内首批云原生技术架构/应用成熟度评估测试

    中国信息通信研究院(以下简称"中国信通院")2021年发布的<中国云原生用户调查报告>数据显示,用户正在将IT建设的中心转向云原生,现阶段已有近10%的用户在云原生领域 ...

  4. 《第四期(2021-2022)传统行业云原生技术落地调研报告——金融篇》正式发布

    一.前言 随着数字化浪潮的来临,以容器.微服务为代表的云原生技术带来了一种全新的方式来开发.交付.迭代企业应用,重塑着传统行业的业务体系,加速着企业自身.以及产业生态的转型升级. 在此背景下,云原生技 ...

  5. 灵雀云第三期(2020-2021)传统行业云原生技术落地调研报告

    引言 如果说2019年是"云原生技术商业化元年",那么2020年就是"云原生技术成为新常态"的一年.在这一年里,云原生技术正在快速开拓新的技术边界,支持新的应用 ...

  6. 微博云原生技术的思考与实践

    来自:刘超的通俗云计算 本文由新浪微博架构师陈飞撰写,因见解深刻,故在此转载 现在越来越多的企业开始全面拥抱云计算,开始关注云原生技术.从管理物理数据中心到使用云主机,我们不用再关心基础运维.从云主机 ...

  7. 如何选择最优路径完成云原生上云?听这场阿里云特别分享【云原生技术与最佳实践】

    云原生是一个较为广义的概念.对于云原生,不同的企业有着不同的理解. 如何判断项目是否已经到了云原生上云的阶段:云原生上云的方式该怎样抉择:想要把云原生技术发挥到极致又需要考虑哪些因素? 面对诸如此类问 ...

  8. 2022 年第一场云原生技术实践营开启报名

    2021 年,我们在上海.深圳.广州.郑州.北京等地举办了不同主题的云原生技术实践营活动,和客户们共同交流.一起动手,体验容器.Serverless 等实实在在的云原生技术,实现降本增效. 2021年 ...

  9. 业内首款云原生技术中台产品云原生 Stack 来了!

    今天,企业数字化转型依然面临很大的挑战,虽然有很多新技术不断涌现,云厂商.ISV 在帮助企业做转型,但是在实际落地过程中,企业仍然需要解决一些痛点,比如:当前,业界技术产品和理念非常繁多,怎么用新技术 ...

最新文章

  1. Android之使用HTTP协议的Get/Post方式向服务器提交数据
  2. 64位 linux 32位连接器,意法半导体为 32 位微控制器发布了一款自由的 Linux 集成开发环境...
  3. ws配置 zuul_SpringCloud系列研究---服务网关zuul
  4. Java and Jakarta - Hybris
  5. mysql专门导入程序_从MySQL导入导出大量数据的程序实现方法
  6. 考验程序员的一个FLASH游戏(Light-Bot)
  7. UIPikerView的属性和使用方法
  8. 软件测试实用技术与常用模板:内容提要
  9. 关于JavaScript中return的使用情况
  10. “混合云产业推进联盟”成立,ZStack实力助推
  11. COMSOL6.0 版本新功能:求解大型瞬态声学问题
  12. Learning ImageMagick 1: Lomo效果
  13. ORA-01720: grant option does not exist for 'HWCUST.H_OKC_REGION_TERRITORY_T'
  14. lesson 4 introductions
  15. window引导配置bcdedit
  16. macos支持exfat吗_在移动硬盘中安装win10和macos双系统
  17. android apk 安装目录成功,记录一次解决安装 Apk 兼容性问题
  18. 自动秘钥密码(Autokey)
  19. 10-SpringBoot启动图标修改
  20. torch.cat()的类型转换

热门文章

  1. android bilibili搜索框,仿bilibili搜索框效果(三句代码实现)
  2. php token 验证,PHP如何实现Token验证
  3. scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法
  4. pdf文档遇到了共享冲突_如何将链接共享为PDF格式的Google文档链接
  5. android listpreference 自定义,Android – 我的ListPreference中的自定义行布局
  6. 杜鹃演绎奢华春装大片
  7. fir.im 持续集成技术实践
  8. POJ2184 Cow Exhibition(DP:变种01背包)
  9. SSH项目中遇到拦截器无法注入服务的问题
  10. c# 获取当前活动窗口句柄,获取窗口大小及位置