专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

线上内存泄漏!如何破案

  作者:rangobai,腾讯CSIG数据工程师
  导语要有性能意识,量变引起质变,简单如一行日志都会在高并发的情况引发血案,考验着研发的技术功底一案件背景
  9月的某个上午,业务侧突然反馈线上数据服务响应慢,造成任务积压,正常情况下耗时5ms的服务,单次响应达到了5s量级。收到反馈后我们马上开始排查服务状况,但发现各项指标很健康,接口平均耗时3ms,p99约为1s,和经验值比无太大差别。业务侧随后补充反馈是某些请求很慢,感觉是若干pod有问题,当流量打到这几台机器时就会变慢。
  开始怀疑是网络问题,但没有证据。随后小库网关的一台机器突然宕机,这个现象引起了我们注意。在上次迭代中,我们服务有一次重大升级,所有请求均会经过网关服务转发,以实现ServerDB单元化绑定,问题可能出在转发环节。
  为了验证猜想,我们重启了网关,随后业务侧积压现象迅速消失,排查范围锁定网关服务。二调查过程
  小库网关本身无太多业务逻辑,依赖项非常少,为了实现时间最小损耗,技术框架采用springcloudgateway,底层WebFlux则使用了高性能的Reactor模式。在上线前的多次压测中,网关服务表现非常优秀,时间损耗基本在毫秒级别。万万没想到上线没几天就挖了个大坑,必须要刨根问底调查清楚2。1第一次定位
  由于刚迁移到新私密机房,可用于问题还原的监控手段不多,刚开始只能从查看pod云监控以及日志着手。
  首先查看日志异常:可以看到确实有大量PT5S超时存在,但是根据traceId追踪大多数超时请求在服务侧均为毫秒级响应。
  其次查看业务侧请求量变化:虽然我们服务有过qps破万的表现,但是问题时间段请求量异常的平稳,甚至略有降低。
  最后查看问题时间段性能表现:cpu在40左右,无突增现象。Pod内存监控由于JVM提前分配,无太大参考价值。IO流量在问题时间段没有波动。磁盘满了
  此时没有清晰的调查方向,就在我们黔驴技穷的时候,又一台网关pod重启了,我们同学迅速登录机器,查看案发现场磁盘爆满,200G的云硬盘在上线的两天内就被打满,请求block。线上请求量其实大大超出我们的预估,生产日志量接近10G小时台,日志保留7天的策略顿时显得不合时宜。
  随后我们清理了所有pod的日志,并采取了两个策略:日志清理策略设为保留1天,因为有日志本身上报cls,保留太久日志没有必要清理无效日志,打印要有技巧性,不是越多越好,高并发下对服务伤害性越大。
  修改上线后,服务运行平稳,再也没出现上午的问题,调查小组愉快的度过了第一天。2。2第二次定位
  就在以为我们万事大吉的时候,现实光速打脸,第二天早上8点半,生命线里出现大量异常警告,随后网关服务陆续重启,登录机器,磁盘利用率10,尴了个尬。CPU问题三板斧
  因为自动重启没有保留案发现场,所以只能在昨天的基础上继续调查。
  第一个合理怀疑的方向是CPU,虽然CPU利用率40不能算很高,但网关和业务机器比达到了1:2,对于仅转发请求的网关来说仍然是不正常的高了。排查此类问题就要启动CPU问题三板斧了
  第一板斧:jps查看java进程ID46
  第二板斧:topHp46查看进程所有线程的活动
  可以看出仍然是log4j2的101线程占用了最多的CPU能力,
  最后一板斧:jstackpid查看线程活动,以定位线程堆栈
  这个时候,日志打印占用了最多cpu已经一目了然。最大利器Arthas
  但是作为成熟的研发,我们当然不满足于三板斧调查问题,这时候就要请出线上另一大杀器arthas:profilerarthas,以下介绍来自官网:Arthas是一款线上监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?怎么快速定位应用的热点,生成火焰图?怎样直接从JVM内查找某个类的实例?
  不得不说,阿里在java技术积淀远超我司。因为之前已在镜像里面集成了阿尔萨斯,我们立即启动cpuprofiler采样生成火焰图。
  果然除了日志打印以外,我们又发现了一处CPU热点
  这两个地方合计占掉了60以上的性能。CPU高的原因
  首先分析一下日志占用过高,这是一个使用log4j2的问题,涉及日志打印参数调优,我们之前已经优化过一轮的参数RingBuffer大小AsyncLogger。RingBufferSize524288日志等待策略sleepAsyncLogger。WaitStrategySLEEPRingbuffer满了后直接丢弃log4j2。AsyncQueueFullPolicyDiscard
  理论上这已经是性能最好的日志策略,为什么会出现占用CPU负载的问题?
  问题出在LockSupport。parkNanos上,简单来说当日志消费速度赶不上生产速度的时候,日志线程会调用这个方法自旋等待若干纳秒,在线程数少的时候性能影响不明显,但是在高并发的情况下会造成大量线程在短时间内频繁唤醒等待,从而影响业务性能。解决方案:是把自旋的时间间隔调大,如下AsyncLogger。RingBufferSize524288AsyncLogger。WaitStrategySLEEPlog4j2。AsyncQueueFullPolicyDiscardAsyncLogger。SleepTimeNs500
  分析下第二个CPU热点,这个问题没那么复杂
  是一个对象深拷贝的性能问题,每次请求来的时候都会将一个大对象先序列化在反序列化,这个在请求量低的时候影响较小,但是在我们每天几千万的请求量冲击下,性能瓶颈非常明显。
  讲一下对象拷贝的四种解决方案:
  JSON:非常规,吃CPU
  ApacheBeanUtils:性能最差,不建议使用
  SpringBeanUtils:性能稍好
  MapStructMapStructJavabeanmappings,theeasyway!,性能无损,推荐!!
  具体各自的拷贝原理不再深入分析,大家可以搜资料查看热点问题解决了
  给一下优化前后的CPU对比,以下优化结果是在请求量翻倍同时pod数减半的CPU表现:
  优化前:45
  优化后:11
  2。3最终定位
  随着一步步的分析,我们也越来越接近问题的真相:CPU虽然有点高,但仍不足以解释缓慢和重启的现象,另外问题是在线上请求量增大以及随时间推移逐渐暴漏的,几乎可以断定网关存在内存泄漏。于是我们把调查重点投向JVM内存,布下天罗地网,静等凶手再次犯案。
  功夫不负有心人,在部署约一天后,几台服务器又开始重启,我们迅速登录还未重启的机器,执行以下操作首先查看jvm内存已经逼近100GC非常活跃且无效,大量的内存无法回收通过火焰图查看的CPU绝大部分在执行GCjmapdump:formatb,fileheapdump。phrofpid生成内存dump并上传cos内存杀器Jprofile
  这个时候就要请出排查内存问题的另一大杀器Jprofile,具体资料可以在网上搜,这里主要介绍定位过程。
  首先查看内存分布,有1000W的ImmutableTag,不是我们的业务对象。。。非常意外
  其次查看大对象,SimpleMeterRegistry占用了80的内存空间!!!
  这两个类均属于io。micrometer的核心组件,用来暴漏服务参数供监控使用。Micrometer中包含的SimpleMeterRegistry,它在内存中维护每个meter的最新值。
  再一次分析内存中保留的对象内容
  可以看出1000W的对象中,全部记录的是我们每次请求的RouteUriMethod耗时等信息,通过关键字定位,这些对象生产的源头是GateWay的GatewayMetricsFilter组件,这里会记录所有路由请求的信息apply到micrometer中。而这个GatewayMetricsFilter的启用条件是存在SpringBootActuator组件。我们业务中刚好引用了该组件。
  至此凶手归案,我们下线Actuator,并手动将GatewayMetricsFilter启动设置为False后,问题彻底解决。三内存泄漏原因
  但是为什么呢?一个Spring官方提供的监控组件会导致内存泄漏?为什么对象持续无法回收?直觉告诉我们一定是哪个地方不太对劲。珍贵的食材往往需要最简单的烹饪方式,最复杂的场景往往用最朴素的手段抽丝剥茧3。1DEBUG过程
  幸好我们有一套完整可用的开发环境,足够做场景复现,打好断点触发请求。经过几轮分析,犯案原因也随之浮出水面。
  首先还是从SimpleMeterRegistry的引用链开始,(过程比较无聊,不再赘述)
  这里存在一条清晰的引用关系,查看MeterRegistry源码,有一个ConcurrentHashMap全局变量
  就是这个全局的Hashmap保存了到ImmutableTag的引用关系,导致GCRoots判定引用路径存在,对象存活无法回收。关键代码:
  这里判定如果meterMap中不存在mappedId就创建,mappedId是一个DefaultMeter对象,针对我们的业务场景,这个Meter根据Route对象生成。看一下我们的使用方法,为了做到动态路由效果,我们使用了一个全局的filter拦截请求,然后根据算法确定需要转发的目标IP,每次请求都会生成一个新的Route对象
  3。2水落石出
  坏就坏在这个newRoute上,因为每次请求的参数不一样,导致我们生成的Route对象也不一样。我们认为Route是请求级别的动态的,每次请求后自然消亡,实际上也是如此。但是万万没想到,站在SpringCloudGateWay或者说站在GatewayMetricsFilter的视角,这个Route是全局的静态,由此引发内存泄漏。四经验总结
  第一,要有性能意识,量变引起质变,简单如一行日志都会在高并发的情况引发一起血案,考验着研发的技术功底。
  第二,工欲善其事,必先利其器,一款好的工具能够极大提升研发生产力

钞能力失效?卡塔尔世界杯也有未解之谜摘要全村的希望!空调界六边形战士诞生全球关注的2022年卡塔尔世界杯球赛赛程已过半,随着球赛的火热推进,与世界杯相关的话题被不断的推上热搜。由于卡塔尔国是热带沙漠气候,常年高温炎热咪咕的世界杯时间左手沉浸,右手破圈作者不空12月5日2300,亚洲球队迎来卡塔尔世界杯的关键一役。接连爆冷的日本男足让亚洲球队在卡塔尔世界杯上大放异彩,连赢德国西班牙此前,从来没有一支亚洲球队可以连续击败两支前世界马斯克钦点特斯拉中国朱晓彤管理美国工厂?上汽大众大面积瘫痪?上调台积电目标价至98美元,评级买入集度回应更名幂航汽车苹果放弃生产L5级全自动驾驶汽车,推迟目标推出日期至2026年博格华纳将被拆分关键词台积电集度苹果特斯拉大众集度回应更名幂航吴京的伪装,是娱乐圈的悲哀文文亦范编辑小丁有人曾说艺术家不得不伪装真情,和普通人不得不伪装真情,两者的目的可以说是恰恰相反。艺术家为显示而伪装,普通人为隐蔽而伪装。随着近几年综艺节目的爆火,很多演员歌手也都上下班路上听什么?10款高质量播客节目推荐(放松学习成长向Hello,大家好,我是婉儿,很高兴又见面了!不知道大家平时通勤时间都是怎么打发时间的呢?以前我都是看WB热搜刷短视频或者听听音乐,从去年接触播客后,我的上下班路程变得好过多了,即大众安徽MEB工厂首台预量产车型在合肥下线大众汽车(安徽)有限公司首台预量产车型12月7日在位于合肥的大众安徽MEB(模块化电驱动平台)工厂整车下线,这标志着大众安徽首款新能源车型已进入批量生产的最后阶段,预计2023年底谷爱凌恋情实锤!与白人男友冰上接吻,中国网友为啥找外国人为中国在北京冬奥会上斩获雪上项目的金牌的18岁天才少女谷爱凌,自从在今年9月份回到美国进入到世界名校斯坦福大学学习后,就很少在公众面前露面了。不过谷爱凌在美国还是非常的活跃,不久前过来人告诉你,在这个世界上,最不靠谱的关系是情人这个世界上有心甘情愿给你当情人的人么?如果有人心甘情愿给你当情人,你会相信么?她不要你的钱,不要你的权,只看中你这个人,你认为可行么?她只和你有感情上的交集,从不谈钱谈物质,你认为想谈一次能满足食欲和性欲的恋爱有没有哪样食物会让你想起你爱的人?有个姑娘给我讲过,因为男友名字的第二个字是柠,她爱屋及乌喜欢上了所有柠檬味的食物。虽然他们已经分手四年,可对方给她带来了太多美好回忆,这么多年她的1187米!梅西又一数据第一,2天后决战荷兰,后打巴西法国夺冠?2022世界杯还有差不多2天的时间,阿根廷队和荷兰队的大战就将打响,届时梅西将率领球队,冲击4强席位,如果能够击败对手,阿根廷队半决赛的对手,极有可能是巴西队,要是进入决赛,可能与后悔了?小米11系列用户有福了,网友感谢雷总的定心丸近日,小米11系列产品的服务政策更新了,不少消费者都表示后悔了,早知道如此,双十一就不换新机了。但这一次,等等党有福了,还没有换新机的小米11系列用户,快来了解新的服务政策,别花冤
微信上从不发朋友圈的女人,不是低调,十有八九是这3种人我们发朋友圈,都是为了什么?有些人是为了记录生活的美好,有些人是当做回忆来珍藏,有些人是发泄自己的情绪,有些人纯粹是为了炫耀显摆,有些人是为了引起他人的注意。不同的人,有不同的想法为什么说女人之间,比起颜值更重要的是体态?看完这些对比就懂了别再让糟糕的体态毁了你的高颜值啦!在这个网络发达的年代,会穿衣打扮,会化妆健身的小姐姐多得是。小裙子一穿上,妆一化,谁都能是美少女一枚,但真正决胜的关键是体态内在修养是隐形的气场,江淮爱琴海巢湖红石嘴作者王士新原题红石嘴哟,爱情海巢湖岸边的红石嘴,一直默默无闻,仅几年,不仅成了网红旅游新景点,还凭借肥东县长临河古镇独特的文化资源,发展成合肥最大的婚纱摄影基地之一,成为年轻一代心重庆长江惊现石头阵,摆放整齐成网红景点,为何修建争论不休2022年的夏天真的不平凡,由于极端高温天气,出现多少令人费解的事情,水电大省四川缺电,山水之城重庆山火频发,更稀奇的是,由于水位降低,长江嘉陵江水底下多少秘密得以重见天日,比如嘉iPhone15标准版还是捡别人剩下的明年不升级A17,或将成为传统文咸谈科技馆今年的iPhone14系列真的是让人喜又让人忧,喜的是iPhone14Pro版迎来了近年来最大的升级抛弃了万年的刘海屏和1200万像素镜头,带来了灵动岛药丸挖孔和480重庆长安汽车股份有限公司总裁党委副书记王俊自主创新全面向智能低碳转型获奖感言长安汽车作为制造型企业代表,一直以来扎根重庆,依托重庆市区位优势生态优势产业优势体制优势,积极抢抓汽车产业新四化发展机遇,在推动制造转型升级高质量发展方面取得一定进展。未来社会对有纹身的人区别对待并不是一种歧视今天有人对我说我尊重别人纹身的自由,但我不会雇佣有纹身的人这句话涉及歧视有纹身的人。然后还给我还举了一个例子,如果一个老板,一边说着我尊重所有人来应聘的自由,但他们也应该尊重我不雇传统造型中的寓意赏艺前些年一段无所事事的日子,在小市场买了一把电动雕刻机,在一根粗拐杖上雕花。对于造型艺术,我有较好的鉴赏能力,却没有创造力,雕什么自然得在现有图案中找,于是翻书查资料上网找,这一重庆释放制造业发展新动能本报重庆9月18日讯(记者吴陆牧冉瑞成)党的二十大即将召开,重庆市广大干部群众满怀期待,纷纷表示要砥砺前行拼搏奋斗,进一步把习近平总书记殷殷嘱托全面落实在重庆大地上,奋力书写重庆全重庆警方破获特大虚假投资理财诈骗老股民中招被骗1340万股市就是大庄家收割韭菜大鱼吃小鱼!这次机会难得,要跟上队伍啊,那可是最后的机会了!如果你是一位喜欢炒股的股民,在网上看直播时遇到侃侃而谈的金牌讲师,向你分享股票投资经验,还免费答疑iOS16。1Beta1发布,新增清洁能源充电今晨,苹果发布了iOS16。1Beta1,本次的版本号为20B5045d。距离上一个测试版版时隔了8天的时间,让我们一起都来看看吧。自定义锁屏优化在锁屏界面长按进行自定义,更方便的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网