成为优秀技术人员的两点建议
沦诘乘捉我们有个海外的项目一共70个服务前前后后花了超过一年时间完成了云服务迁移和架构调整。主要是架构调整了原来的docker swarm托管服务几台云服务器将n个服务堆在一起只会对服务器资源做整体监控服务器没事没人管单个服务的内存情况。新架构对单个服务改动不大但外部相关架构则改头换面了最大的改动是容器改为Kubernetes托管放在AWS的EKS上。新架构在新的云服务上线后暴露了很多内存问题。在此拿某个服务根据解决过程给个排查思路希望能给到大家一点启示。问题服务为一个普通的ASP.NET Core gRPC工程平常没什么流量。HPA设置的最大副本数为5生产环境服务启动后Pod内存达到或超过K8s内存请求值(512Mi)自动触发扩展到5个实例即副本数达到最大。这与QA环境表现并不一样也就没有在测试阶段发现。需要想办法复现、排查解决高副本和高内存占用问题。部署里面对容器的资源容器资源只做了对CPU和内存的预留设置(request)没有做上限设置(llimit)。从内存曲线上看很多副本的内存甚至超过了请求的512Mi。不过有一点很奇怪服务的接口并没有出现性能下降的迹象。问题复现尝试在QA环境对相关接口进行压测问题能复现表现为HPA副本扩展后各个POD的内存居高不下维持在500~600Mi长时间不释放有时候压测甚至能冲到800Mi。即使没有什么接口请求也需要超过20个小时才缓慢下降到350Mi左右。但尝试本地VS诊断工具则并没有发现什么内存不释放问题除了一些个大对象驻留问题。代码与dotnet-dump因为其他类似的服务并不会这样所以第一时间怀疑是代码问题但这么想是错的下面交代。怀疑代码问题后想着是不是有什么内存泄漏找了个服务的接口在QA压测后问题能复现即内存长时间不释放。看了好几遍代码除了一些个ToList用的太过频繁并没什么问题(也与内存问题不相关)用VS诊断工具检查内存有运行又没内存泄露问题。于是在QA环境用dotnet-dump把内存快照下载回来分析找到了个大对象堆LOH驻留类型的类而且VS诊断工具找到的类是同一个接着定位到了接口调用这个类的地方。业务调用很单纯这个类就从数据库用Dapper查出来得到列表然后分组计算下数据不会有什么内存泄露的机会但注释掉此部分查询则内存不再上升到500~600Mi只在300Mi左右而且内存使用率下降也变快了。继续二分法注释大法调试最后只保留数据库查询语句而不做后续业务处理连引用都不做内存还是会达到500~600Mi。这就让人摸不着头脑了代码肯定是相关的数据库查询几下一列表数据都能让内存达到预留临界值(request)列表也才约11000条数据虽然确实是LOH对象但不至于造成这么严重的内存不释放现象。GC调参代码摸不着头脑就想办法调试下GC。方案一 定时调用GC.Collect来回收垃圾加入定时执行GC.Collect()后内存占用能立即回落这方案似乎也可以方案二GC配置调整配置内存限制感知-DOTNET_GCHeapHardLimit添加环境变量DOTNET_GCHeapHardLimit0x20000000 # 512Mi的十六进制值能限制内存的使用但并不能让GC能敏感地进行回收方案失败方案三切换为GC场景类型到工作站原默认为Server GC指定为Workstation GC后内存占用不到180Mi扩容缩容正常这方案看起来也可以调试结束方案一和方案三似乎可行查了相关资料后两个方案其实都有问题。方案一是代码主动强制执行了垃圾回收但大多数情况下并不被建议在代码里面去执行因为执行GC.Collect多多少少会影响服务性能GC自己能感知内存使用率然后自动进行执行回收。至于方案三不同的模式本来就对应着不同的服务场景服务本身就是后端接口切换为工作站模式也许可行但ASP.NET Core默认就是Server GCServer GC模式本身为了支持高性能并不会频繁执行垃圾回收(从.NET 9开始不一样.NET 9的ASP.NET Core默认是第三种模式.NET 8也支持这种模式只不过不是默认的)。为容器限定内存上限查资料过程中才了解K8s的资源设置是有预留设置(request又称请求设置)和上限设置(limit)服务只设置了请求request部分没有limit部分那有没有可能是服务容器因为没有被设置内存limit导致GC如脱缰野马般豪气地使用内存呢那为啥内存不释放就是Server GC感觉内存还是够用的具体文章参考工作站和服务器垃圾回收和动态适应应用程序大小 (DATAS)。先查询下可用内存吧于是加个下面接口查询app.MapGet(/runtime/memory, () {return GC.GetGCMemoryInfo().TotalAvailableMemoryBytes.ToString(N0);});结果返回可用内存居然高达4Gi真相很接近了。接着为服务设置内存limit为512Mi再次查询得到可用内存为512Mi。没错就是少设置了内存上限没有这个此时可用内存为节点内存4GB加了limit重新压测曲线事件如下程序内存释放正常副本数释放也正常另外接口响应时间没有受到影响问题得到解决总结服务内存曲线高居不下是因为容器没有被限制内存K8s没有指定内存limit可用内存就是节点/宿主机的物理内存高达4GB。没有设置内存limit但是设置了HPA于是服务一启动经过一些时间内存超过HPA阈值造成副本数增加GC默认是Server GC其感知的内存足够所以不释放包括小对象和大对象。虽然主动调用GC.Collect则可以释放但一般不会这样做因为GC有自己的一套逻辑。限定内存为0.5Gi后内存释放曲线正常HPA扩缩正常响应时间正常问题得到解决也能解释服务的接口并没有出现性能下降的的现象。启示如果遇到类似内存居高不下问题先确定.NET版本极其GC是Server GC还是Workstation GC。然后再确定其分配的可用内存是多少K8s下要检查其资源limit有没有被设置。如果被设置之后依然有内存不释放/泄露问题再怀疑代码问题。

相关新闻

基于自然语言的软件工程和程序设计(上)

基于自然语言的软件工程和程序设计(上)

焦未记逞什么是弃元模式?弃元是 C# 7.0 引入的语法特性,用下划线 _ 表示 “有意忽略的变量”。它不是一个实际的变量,没有分配值,甚至未分配内存,也无法被访问(尝试使用会触发编译错误 CS0103 The name _ d…

2026/7/7 20:19:17 阅读更多 →
为什么yarn的资源利用率低

为什么yarn的资源利用率低

YARN 资源利用率低,本质是 “资源分配的灵活性” 和 “实际需求的多样性” 不匹配 —— 要么是 Container 太 “死板”,要么是调度太 “保守”,要么是应用太 “浪费” 一、7 个核心原因拆解(按影响程度排序) 1、资源分…

2026/7/7 8:42:47 阅读更多 →
传统A星、改进A星对比路径规划算法(提升搜索效率)定量比较Matlab代码

传统A星、改进A星对比路径规划算法(提升搜索效率)定量比较Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/7/6 13:34:51 阅读更多 →

最新新闻

2026 指挥中心控制台选型排名:4 家主流源头厂商客观横向对比(政企控制室操作台采购指南)

2026 指挥中心控制台选型排名:4 家主流源头厂商客观横向对比(政企控制室操作台采购指南)

2026 政企指挥中心控制台选型客观测评,对比科思诺、铁力山、飞马拓新、照彰实业生产产能、交付周期、场景适配能力,提供控制室操作台采购标准、避坑要点与场景推荐,适配公安、能源、金融、水利调度项目。综合自有全流程产线、南北直营服务、全…

2026/7/8 5:50:46 阅读更多 →
海外AI短剧日产3万部、日耗3000万美金,前海像样李蓦:蓝海正在变红,中小厂商别硬闯

海外AI短剧日产3万部、日耗3000万美金,前海像样李蓦:蓝海正在变红,中小厂商别硬闯

短剧出海浪潮翻涌至今,AI短剧已然站上了行业增长的风暴眼。一个让人瞠目的数字摆在眼前——当前海外AI剧月产能已达到3到4万部。如果对标国内AI短剧的发展节奏,海外市场大致处在国内今年三、四月份的位置,正是爆发式增长的前夜。近日&#xf…

2026/7/8 5:50:46 阅读更多 →
JCMsuite应用:倾斜平面波传播透过光阑的传输

JCMsuite应用:倾斜平面波传播透过光阑的传输

这个例子计算入射平面波(在倾斜的入射角度)通过一个独立光阑的传播:光阑几何结构下图显示了计算得到的近场的矢量图。近场的矢量图几何图形在xy横截方向上具有透明的边界条件。因此,对于周期问题,散射场的傅里叶变换不再是离散的。所以&#…

2026/7/8 5:46:45 阅读更多 →
泉港专利申请指南:选择最适合您的专业服务

泉港专利申请指南:选择最适合您的专业服务

行业痛点分析 在当前激烈的市场竞争中,专利申请已成为企业保护创新成果、提升核心竞争力的重要手段。然而,泉港地区的许多企业在专利申请过程中面临着诸多挑战。根据国家知识产权局的数据,近年来全国专利申请驳回率逐年上升,2022…

2026/7/8 5:44:44 阅读更多 →
工业设备数据管理中台是什么?有什么功能?

工业设备数据管理中台是什么?有什么功能?

工厂里通常有PLC、SCADA、MES、ERP等来自不同厂商、不同年代的设备与系统,它们的数据格式和协议各不相同,就像说着各自的方言,无法沟通。设备数据中台会通过统一的接口和标准,把这些“方言”数据采集上来,清洗、转换并…

2026/7/8 5:42:44 阅读更多 →
GHelper完整指南:华硕笔记本轻量控制工具,告别臃肿的终极方案

GHelper完整指南:华硕笔记本轻量控制工具,告别臃肿的终极方案

GHelper完整指南:华硕笔记本轻量控制工具,告别臃肿的终极方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Viv…

2026/7/8 5:40:44 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻