创新是改良式的(Incremental Innovation),但是,有些创新是颠覆式的(Disruptive Innovation ...
揭约俚痛问题下午两点新版本上线其中一个消费者服务的内存增长速度异常迅速在短短五分钟内就用完了2G内存并自动重启了pod之后又在五分钟内OOM了在四十分钟内服务的pod已经重启了八十几次要知道我们之前这个消费者服务正常运行时候只用了不到500M。分析首先进行初步分析这是一个消费者服务并且新版本的需求中并没有新增消费topic并且业务量也没有大的波动不存在是业务访问量骤增导致OOM所以极大概率会是代码问题。当然每一个版本的新代码都非常多需求也比较庞杂直接去看代码肯定是不行的这时候就要麻烦部门的运维大佬了让他给我们dump一下给出一个内存溢出时的性能记录文件通过这个文件可以分析内存分配、线程创建、CPU使用、阻塞、程序详细跟踪信息等。我这里使用的Go语言开发一般用pprof文件进行分析运维给出的文件有以下6个main-1-trace-1227152939.pprof记录程序执行的详细跟踪信息包括函数调用、Goroutine 的创建和调度等main-1-threadcreate-1227152939.pprof记录线程创建的剖析数据帮助分析线程创建的频率和开销。main-1-mutex-1227152939.pprof记录互斥锁mutex的使用情况帮助分析锁竞争和锁等待的开销。main-1-mem-1227152939.pprof记录内存分配的剖析数据帮助分析内存使用的热点和分配情况。main-1-cpu-1227152939.pprof记录 CPU 使用的剖析数据帮助分析 CPU 时间的消耗情况。main-1-block-1227152939.pprof记录阻塞操作的剖析数据帮助分析阻塞操作的频率和开销。内存OOM那最重要的当然是mem文件也就是内存分配剖析数据不过很不幸服务重启速度太快了运维大佬dump的时候正好处于服务刚重启的时候所以mem文件中显示的内存才占用不到20M并且占比上也没看出有什么问题。想让运维再帮忙dump一下内存快要OOM的时候但是为了线上服务的稳定性版本已经回退了无法重新dump只能从其他几个文件中查找问题了。除了内存占用分析在性能问题分析中CPU占用分析也是极为重要的一环这一查看就有意思了CPU总的使用率虽然不高但是这个占比就比较奇怪了。第一占比的runtime.step是Go的运行时系统负责管理内存分配、垃圾回收、调度goroutine等底层操作这个暂且不管占比第二的居然是runtime.selectgo这个就非常诡异了select一般用于channel的非阻塞调用但是问题是新增代码中没有地方显示地调用了select那可以初步判断是底层源码中某处一直在调用select函数不过目前还不知道是谁触发的这个调用还需要继续查看其他文件。之后继续查看互斥锁的情况其实这个文件在目前这种情况下排查的价值已经不大了因为出现问题的是内存溢出而不是CPU占用率并且CPU占用率确实不是很高而且Go中是有检索死锁的机制大部分死锁是能够被Go发现并报一个deadlock错误打开文件之后发现果然没有死锁发生。接下来查看阻塞操作的分析情况从解析结果中可以看出select的阻塞时间遥遥领先select出现这种情况只会是存在case但是没有default的时候当所有case不符合的时候负责这个select的goroutine会阻塞住直到存在符合的case出现才会唤醒继续走下去当时我看到这我满脑子问号谁家好人select不加default啊再查看线程创建情况由于pod刚启动不久所以这个文件也看不出什么东西很正常的线程创建。看到这里还是没能定位到问题所在但是别急我们还有最重要的文件还没看那就是trace文件它可以记录程序执行的详细跟踪信息包括函数调用、Goroutine 的创建和调度使用go自带的pprof分析工具打开trace文件go tool trace main-1-trace-1227102939.pprof会出现以下本地页面在Goroutine分析中可以锁定真正的问题所在了在go-zero的core包下的collection文件在不到一秒内创建了两万多的Goroutine虽然两万多数量不多但是这个速度十分异常最重要的是这个定时轮就很奇怪这个项目中根本没有定时任务接下来就很容易查询了只要查找这次提交的代码中哪里使用到了collection包。经过一番全局搜索后最终确定了问题代码func NewXXXLogic(svcCtx *svc.ServiceContext, ctx context.Context) *XXXLogic {cache, _ : collection.NewCache(30 * time.Second)return XXXLogic{Logger: logx.WithContext(ctx),svcCtx: svcCtx,ctx: ctx,localCache: cache,}}在新上线的版本中只有这一处用到了collection包原本这里的意思是将建立一个缓存放到上下文中去传递但是乍一看我没有看出有什么问题过期时间也设置了按照我原有理解过期时间到了就会自动释放掉为什么还是会内存溢出了但是我忽然意识到应该不是缓存引发的内存溢出可能是协程过多引发的内存溢出因为一个初始协程是2KB左右如果数量过多也会造成内存不够。为了探究根本原因我点进了collection包的源码进行查看在其中NewCache()方法中找到了造成协程数异常增加的定时轮创建方法NewTimingWheel()。之后点进去这个方法进一步查看可以看到这个定时轮的结构体里面包含了四个channel以及一些其他数据结构粗略估计这一个TimingWheel结构体所占内存要达到一百字节以上这是一个比较庞大的对象如果无限制的创建下去很容易造成内存OOM发生。但是这个定时轮为什么会创建那么多呢为什么不会关闭按理说go-zero的源码不应该会有这么大的漏洞继续查看这个定时轮的run()方法终于发现了问题所在这个定时轮中开启了select方法并且没有default方法所以之前阻塞文件那里才会显示select阻塞时间占比达到了99%并且唯一关闭这个定时轮的方法是接收到tw.ticker.Stop()才会停止那么这个stop方法会在什么时候调用呢答案是会在程序停止运行的时候进行调用。所以如果程序仍在运行就会有无限制的协程创建定时轮这时候定时轮因为无法关闭所以协程也不会进行销毁有点类似于守护线程所以在协程无限制的创建下最终导致了线上内存OOM了。解决那是不是说明go-zero的这块源码存在问题其实不是的是我们使用方法错误正确的使用方法不应该将缓存创建在上下文中而应该创建一个全局缓存让所有的上下文都公用这一个缓存这样就不会发生定时轮无限创建的问题。后续将这块缓存放到了全局中之后再重新发布观察了一小时左右服务内存稳定在了500M

相关新闻

【面试专栏|Java核心基础】一文搞定final所有用法:基础场景+并发原理+面试官高频追问

【面试专栏|Java核心基础】一文搞定final所有用法:基础场景+并发原理+面试官高频追问

🍃 予枫:个人主页📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》《Java 面试刷题指南》💻 Debug 这个世界,Return 更好的自己! 引言 final是Java中最基础却又极易被忽略的关键字,看…

2026/7/6 18:53:33 阅读更多 →
我怀疑我的论文泄露了!自查AI率很低,编辑查AI率很高是怎么回事?

我怀疑我的论文泄露了!自查AI率很低,编辑查AI率很高是怎么回事?

现在发表SCI论文基本都要求查论文AI率了。但是大家都知道,投稿SCI论文是一个周期很长的过程,在这期间也会多次检测论文AI率。 有同学遇到了这样的问题:投稿之前自己检测论文AI率是低于20%的,但是投稿后编辑邮件说AI率太高&#x…

2026/7/6 21:37:24 阅读更多 →
nodejs+php+vue医疗企业固定资产管理系统的设计与实现

nodejs+php+vue医疗企业固定资产管理系统的设计与实现

目录 技术栈选择与分工系统架构设计功能模块划分开发环境搭建核心业务实现测试与部署方案安全防护措施性能优化策略 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术栈选择与分工 Node.js 负责后端 A…

2026/5/17 7:24:54 阅读更多 →

最新新闻

论领域驱动设计在复杂业务中台架构中的应用

论领域驱动设计在复杂业务中台架构中的应用

思维导图 精简版本 背景角色:零售全渠道订单中台(3万日单/8k TPS/8月/24人)。我任架构师,全程主导DDD落地,含事件风暴、上下文划分、四层架构、聚合建模、事件驱动与性能调优。 核心实践:①事件风暴绘时间轴,输出《术…

2026/7/7 4:31:44 阅读更多 →
10. Nginx 模块开发:Reload 时复用 Zone 数据

10. Nginx 模块开发:Reload 时复用 Zone 数据

1. 引言 在 Nginx 模块开发中,共享内存 Zone 是跨 Worker 进程共享数据的关键机制。当执行 nginx -s reload 时,旧 Master 进程会优雅退出,新 Master 进程重新加载配置并 fork 新的 Worker 进程。默认情况下,旧 Zone 的内存会随着…

2026/7/7 4:31:44 阅读更多 →
Python API自动化测试框架:从设计原理到工程实践全解析

Python API自动化测试框架:从设计原理到工程实践全解析

1. 项目概述:为什么我们需要一个自己的API自动化框架?在软件开发和测试领域,API接口自动化测试早已不是新鲜事。市面上有Postman、JMeter、RestAssured等成熟工具,开源社区也有pytest-requests、httpx等优秀的库。那么&#xff0c…

2026/7/7 4:29:44 阅读更多 →
论软件测试方法及应用

论软件测试方法及应用

论软件测试方法及应用请围绕“论软件测试方法及应用”论题,依次从以下三个方面进行论述。1.概要叙述你参与管理和开发的软件项目以及你在其中所承担的主要工作。2.说明三种静态测试方法的概念,代码审查,静态结构分析和代码质量度量。3.结合项…

2026/7/7 4:27:44 阅读更多 →
别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

最近跟几个做小红书图文带货的朋友聊天,大家普遍有一种很深的无力感。不是因为不够努力,相反,大家都很拼。天天在各种群里收藏最新的 AI 提示词,追着各种新工具跑,甚至连最近流行的“循环工程”都去研究了一遍。但回到…

2026/7/7 4:25:44 阅读更多 →
RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地 一、当内核对象的数据结构成为架构瓶颈 在 RTOS 的开发中,线程、信号量、互斥量、消息队列、定时器等内核对象是构建并发应用的基础。不同的 RTOS 对这些对象的管理方式差…

2026/7/7 4:21:43 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

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/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

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

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

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

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

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

2026/7/6 6:52:56 阅读更多 →

月新闻