1111 (1) 📅 发布时间:2026/7/7 4:55:02 👁️ 浏览次数: 1111 (1)我们有个海外的项目一共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有没有被设置。如果被设置之后依然有内存不释放/泄露问题再怀疑代码问题。
1111 (12) 1111 (12)最近遇到一个业务上的问题,在网上看到一个对应场景下的解决方案,我感觉这个场景还挺有通用性的,分享一下。 以后遇到类似问题,或者当它以面试场景题出现的时候,你可以拿去就用。 事情是这样的。 程序里面有一… 2026/5/17 9:24:45
SAP发布Cloud ERP Private 2025 FPS01:AI驱动、数据就绪与全球核心能力全面升级 SAP近期发布 SAP Cloud ERP Private 2025 FPS01(Feature Pack Stack 01),这是在2025年10月版本基础上的一次重要升级。此次更新围绕 人工智能(AI)、数据能力(Data)和应用功能(Applic… 2026/7/7 20:16:55
女程序员如何高效率、不被骗地找到优质男友?——一份融合认知科学、行为心理学与系统化择偶策略的实战指南 女程序员如何高效率、不被骗地找到优质男友?——一份融合认知科学、行为心理学与系统化择偶策略的实战指南 作者:培风图南以星河揽胜 首发平台:解忧杂谈 字数:约 9,300 字(不含附录与注释) 适用读者&#x… 2026/5/17 9:24:45
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
线激光扫描三维成像:5种光条中心线提取算法对比与Python实现 线激光扫描三维成像:5种光条中心线提取算法对比与Python实现在工业检测、逆向工程和三维重建领域,线激光扫描技术因其非接触、高精度和快速采集的特点,已成为获取物体三维形貌的主流方案之一。这项技术的核心环节是从采集的激光条纹图像中精确… 2026/7/7 23:58:47
SQL 数据分析性能对比:窗口函数 vs 子查询 vs 临时表,3方案效率实测 SQL 数据分析性能优化实战:窗口函数 vs 子查询 vs 临时表 在数据分析工作中,SQL查询性能往往是决定工作效率的关键因素。面对复杂的业务场景,如何选择最优的查询方案?本文将深入对比窗口函数、子查询和临时表三种技术方案… 2026/7/7 23:58:47
Web安全十大高危漏洞深度解析:从SQL注入到访问控制实战防御 1. 项目概述:为什么你需要了解这十大Web高危漏洞?在Web开发与运维的世界里,安全从来不是一道选择题,而是一道必答题。我见过太多项目,前端炫酷、后端健壮,却在安全这道防线上“一触即溃”。一个不起眼的输入… 2026/7/7 23:56:47
Haiwell Cloud SCADA V3.50.0.14 部署:Windows 10 环境 6 步完成首个 HMI 项目 Haiwell Cloud SCADA V3.50.0.14 部署指南:Windows 10 环境快速搭建工业级 HMI 项目 第一次接触工业自动化监控系统时,面对复杂的配置界面和陌生的专业术语,很多工程师都会感到无从下手。Haiwell Cloud SCADA 作为一款功能强大的工业自动化监… 2026/7/7 23:54:46
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58