五十知天命是什么意思| 9月份是什么星座的| 眷顾是什么意思| 红红的枫叶像什么| 什么时候可以查高考成绩| 驳是什么意思| 南京有什么特产可以带回家| 人为什么会做梦| 上呼吸道感染吃什么| 沙拉是什么意思| 中医是什么| 肾在什么位置| 蛇鼠一窝指什么生肖| 湿疹是因为什么原因引起的| 智商是什么| 曦是什么意思| 胆碱酯酶高是什么原因| 六尘不染的生肖是什么| 93年属什么今年多大| 康宽杀虫剂能杀什么虫| 月经后期是什么意思| 抽动症是什么原因引起的| 决定的近义词是什么| 什么是大姨妈| 绘本是什么意思| 多西他赛是什么药| cbd是什么| 男才女貌是什么意思| 喉咙发痒咳嗽吃什么药| 发烧挂什么科| 心绪不宁的意思是什么| 什么牌子的耳机音质效果最好| 6合是什么生肖| 腰椎痛用什么药| 夏天有什么花| 春天的雨像什么| 泽什么意思| 胎动是什么感觉| 画风是什么意思| 妃嫔是什么意思| 北京友谊医院擅长什么| 年终奖一般什么时候发| 荆芥不能和什么一起吃| 吃什么能立马催月经| 尿路感染为什么会尿血| ii是什么意思| 痛经是什么原因引起的| 血清检查能测出什么| 执子之手与子偕老是什么意思| 什么样的伤口算开放性| 1234是什么意思| 失眠吃什么中成药| 封神榜讲的是什么故事| 陈小春什么星座| 是什么就是什么| 一天当中什么时候最热| 骨髓水肿吃什么消炎药| 淄博有什么大学| 钢琴是什么乐器种类| 抽水是什么意思| 积福是什么意思| 逼格是什么意思| 蛇怕什么| 国家副主席是什么级别| 革兰氏阳性菌是什么病| 脱发吃什么| 遗尿是什么症状| 出水痘不能吃什么食物| 三高指什么| 五行中什么生水| 过是什么结构的字| 脑震荡挂什么科| 起伏不定是什么意思| 2月24号是什么星座| 细胞角蛋白19片段是什么意思| 孕妇血糖高对胎儿有什么影响| 梦见香蕉是什么意思| 为什么一喝酒就拉肚子| 大姨妈吃什么好| 包皮炎用什么药最有效| 母亲节做什么| mL代表什么| 花开半夏是什么意思| jojo什么意思| 尿酮体是什么| 荔枝有什么营养| 梦见谈恋爱很甜蜜是什么意思| 1976年属什么生肖| 牛油果和什么榨汁好喝| 哺乳期吃什么食物好| baby是什么意思| 甲状腺是什么症状表现| 什么是硬下疳| 球蛋白有什么作用和功效| 宝宝咳嗽有痰吃什么药效果好| 脚底板发红是什么原因| 天空为什么是蓝色| 牙虫长什么样子| 自相矛盾的道理是什么| 为什么会长疣| aqi是什么| 金贵肾气丸治什么病| 支原体是什么| 吃什么补充维生素b1| 薄荷不能和什么一起吃| 碱性磷酸酶高是什么原因| 头皮痛什么原因引起的| 鸽子怕什么怎么赶走| 家是什么| 牛肉炖什么好吃| 九岁属什么生肖| 支原体阳性是什么意思| 心脏不舒服吃什么药| 剪刀是什么生肖| 剪刀手什么意思| 牙齿根部发黑是什么原因| 黑豆熟地水功效是什么| 嘿是什么意思| 空调的睡眠模式是什么意思| 活性炭和木炭有什么区别| 海鲜有什么| 无回声结节是什么意思| nsfw什么意思| 1989年出生是什么命| 前什么后什么| 为什么吃火龙果会拉肚子| 享受低保需要什么条件| 眼屎多什么原因| 情绪波动大是什么原因| 肝肾两虚吃什么中成药| 五蕴皆空是什么意思| 泰山在什么地方| 胆结石吃什么水果好| 什么是水马| 惊悸的意思是什么| 什么粉| 犇是什么意思| 胃胀吃什么药效果最好| 包虫病是什么症状| 裘是什么意思| 夏天吃什么水果好| 念珠菌阳性是什么病| 宫颈纳氏腺囊肿是什么意思| 雪纳瑞什么颜色最贵| 海蜇是什么| 剁椒鱼头是什么菜系| 梦到前任预示着什么| 结核抗体阴性代表什么| 为什么记忆力很差| 痔疮用什么药好| 卡密是什么| 24D是什么激素| freeze是什么意思| 眼拙是什么意思| 回盲瓣呈唇形什么意思| 什么样人穿棉麻好看| 炉甘石是什么东西| 痛经吃什么水果能缓解疼痛| 摩羯座哭了代表什么| rf医学上是什么意思| 什么满天下| 肚脐叫什么穴位| 猥琐什么意思| 吃什么增肥最快| 足跟痛挂什么科| 电解质什么意思| 山楂不能和什么一起吃| 肝癌晚期什么症状| 老是想咳嗽是什么原因| ppi是什么药| 双十一从什么时候开始| 咳嗽不停是什么原因| 营养不良吃什么药| 心里发慌是什么病| 什么叫淋巴结转移| r值是什么| 喉咙疼痛一咽口水就疼吃什么药| 蝴蝶是什么变的| messi是什么意思| 黄芪和北芪有什么区别| 舂米是什么意思| 什么是导管| 白天不懂夜的黑什么意思| 腔隙灶是什么意思| 检查淋巴挂什么科| 阿耨多罗三藐三菩提是什么意思| 代入感是什么意思| 牙周炎吃什么消炎药| 脸热发红是什么原因| 什么是对食| 1998属什么| 6月9日什么星座| 十二星座什么第一名| 睡眠不好总做梦是什么原因| 突然间头晕是什么原因| 肺有问题挂什么科| 吐司是什么| 不放屁是什么原因| 哪吒的妈妈叫什么| 腿为什么肿| yishion是什么牌子| 荨麻疹要用什么药| 儿童热感冒吃什么药| 墨菲定律什么意思| 戴隐形眼镜用什么眼药水| 阳离子是什么面料| 十月7号是什么星座| 曝光是什么意思| 藿香正气水什么味道| 经常咬手指甲是什么原因| 苯醚甲环唑防治什么病| 大学休学1年有什么影响| 方脸适合什么耳环| 莫须有什么意思| 何首乌泡酒有什么作用| 丘疹用什么药膏最有效| 千里走单骑是什么意思| 偏头疼吃什么药好| 94年是什么年| 为什么睡不着觉会胡思乱想| 恶心想吐吃什么药好| 宝贝疙瘩是什么意思| 趴在桌子上睡觉有什么坏处| 什么目寸光成语| 眼神迷离是什么意思| 雷声什么| 桂花什么时候开花| 哆啦a梦大结局是什么| 肝风内动是什么原因造成的| 无声无息是什么意思| dt是什么意思| 95年猪是什么命| 泊字五行属什么| 翼龙吃什么| 1973年属牛是什么命| 特效药是什么意思| 嘴唇起泡用什么药| 白天不懂夜的黑什么意思| 不明原因腹痛挂什么科| 手指关节疼是什么原因| 喝藿香正气水不能吃什么| 气血不足吃什么药最好| 碳酸氢钠是什么添加剂| 肉桂有什么作用| 绝经是什么意思| 直肠疾病都有什么症状| 纯水是什么水| 是故是什么意思| 什么叫做质量| 仲什么意思| 直肠腺瘤是什么| 支气管发炎用什么药| 为什么大医院不用宫腔镜人流| 什么是平板电脑| 什么是多囊卵巢综合症| 男人下面有异味什么原因| 为什么有些人显老| 1998年属虎的是什么命| zara是什么意思| 免疫球蛋白有什么作用| 生物酶是什么东西| 5.23是什么星座| 腾空是什么意思| 生物学父亲是什么意思| 百度

记录一次线上服务OOM排查

百度 3月4日下午,中共中央总书记、国家主席、中央军委主席习近平看望参加全国政协十三届一次会议的民盟、致公党、无党派人士、侨联界委员,并参加联组会,听取意见和建议。

外面,阳光明媚,一切正好。
就在我欢天喜地准备迎来愉快的双休时,忽然之间,天塌了。
刚上线一小时的服务内存异常OOM了!

老实说,在我印象里OOM问题只存在于网上案例中,练习编码时常两年半,还是第一次遇到。不过既然遇到了,那就要尽快排查问题并解决掉,不然真要和群里大哥说的一样:要领盒饭了。

问题

下午两点新版本上线,其中一个消费者服务的内存增长速度异常迅速,在短短五分钟内就用完了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以下,与以往服务消耗内存几乎一致。

历时两小时战斗,终于免于“领盒饭”了。

下班!

posted @ 2025-08-04 19:51  LemonDus  阅读(2867)  评论(3)    收藏  举报
皮肤松弛是什么原因造成的 尿电导率低是什么意思 专科考研需要什么条件 今年24岁属什么生肖 肠胃胀气吃什么药
踏板摩托车什么牌子好 脚抽筋吃什么钙片好 大芒果是什么品种 52年属什么生肖 肠粘连是什么原因引起
骨折吃什么消炎药 老放屁是什么病的征兆 天王星代表什么 师五行属什么 降火吃什么
香醋是什么醋 吃什么能去湿气最好 规培是什么意思 什么星座最聪明 白色玉米是什么玉米
脾肾阳虚吃什么中成药hcv9jop2ns9r.cn 血小板异常是什么原因weuuu.com 孩子注意力不集中去医院看什么科hcv9jop2ns8r.cn 咆哮是什么意思hcv8jop0ns2r.cn 甲状腺做什么检查最准确aiwuzhiyu.com
地动山摇是什么生肖bjcbxg.com 汇总压缩是什么意思hcv8jop4ns8r.cn 适宜是什么意思imcecn.com 6月28日是什么日子hcv9jop8ns1r.cn 玄女是什么意思naasee.com
为什么要打肝素hcv9jop0ns3r.cn f4什么意思hcv8jop5ns8r.cn 什么是钓鱼执法hcv8jop7ns1r.cn 肽是什么cl108k.com 白细胞低是怎么回事有什么危害hcv7jop6ns9r.cn
潮喷是什么意思hcv7jop9ns9r.cn 腿肿吃什么药hcv7jop9ns8r.cn 尿潜血阴性什么意思hcv7jop9ns9r.cn 劲仔小鱼是什么鱼做的hcv8jop9ns2r.cn 不好意思是什么意思hcv8jop8ns9r.cn
百度