范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

线上内存泄漏!如何破案

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

楼市为何救不动,还要救?从今年开始,各个地方就楼市的消息不断!从上调公积金贷款额度,到降首付,降利率,再到最近的松绑限购限售。相信大家都看腻了。作为政策导向型行业,这一次楼市反而不管怎么救,都没啥起色!这与华为合作卖保温杯,哈尔斯上半年净赚1亿,吕强自曝订单将放缓出品子弹财观9月19日消息,最近浙江哈尔斯真空器皿股份有限公司举办了投资者关系活动,公司董事长吕强携总裁吴子富首席财务官吴汝来以及董秘邵巧蓉一起接待了14家调研机构的人员。在有关业康熙没能上榜?盘点历史上堪称千古一帝的四位皇帝,个个雄才大略自两千多年以前,秦始皇登基自称始皇帝,至公元1912年溥仪退位,中国古代历史曾出现过四百多位帝王。在这些帝王之中,有的昏庸暴虐,导致国家民不聊生满目疮痍,最终不可避免地走向破败有的美联储持续加息,中国资产正在被抛售?上百亿资金流出本文原创,禁止抄袭,违者必究近日,人民币的离岸汇率持续下跌,目前已经跌破7的关口,甚至一度跌破7。04。人民币汇率的不断下跌也引起了许多人的恐慌,进而造成了美股市场上中概股的股价下明年起,做好资产贬值的准备?这4件事尽量不要去做根据官方数据显示,2022年年初的信贷社融增长实现了开门红的状态,在1月份人民币贷款就已经增加了3。98万亿元的数量。社会融资量达到了6。17万亿元,直接比上年同期增长了9842亿欧盟被耍了,断了俄气后,美开始减产赚钱,告知欧盟无法拯救欧洲自俄乌冲突爆发后,美国一直忽悠欧盟跟俄罗斯能源脱钩,欧盟也非常配合,几乎每一轮对俄罗斯的制裁措施,都涉及能源,从木材到煤炭再到石油天然气,几乎能够取暖发电的能源,都挨个制裁了一遍。最新发布!福州核酸检测采样点有调整,进入这些场所需核酸证明!近日福州多个景区发布通知国庆假期临近进入景区需持72小时核酸证明鼓岭旅游度假区重要通知2022年国庆假期临近,根据当前疫情防控工作要求,为保障广大市民游客生命安全和身体健康,现将度赵露思代言的敷尔佳面膜,售价148成本仅10元,你被割韭菜了吗?相信爱美人士对于敷尔佳这个牌子一定不会陌生,其生产的白膜黑膜等产品均为大热的网红产品,还有明星赵露思为其品牌代言。在敷尔佳天猫旗舰店的货品栏中,白膜售价是一盒5片148元,黑膜售价首届大国工匠论坛征文丨浅析强化工匠培育与城市发展的叠加路径2022年4月,习近平总书记在致首届大国工匠创新交流大会的贺信中强调,技术工人队伍是支撑中国制造中国创造的重要力量。以各级工匠为代表的高技能型技术工人在数量质量和结构上与城市产业发云南普洱倡导环保理念共创和谐城市一普洱月牙湾湿地公园湿地公园献爱心共创和谐文明城本网云南讯(通讯员张杰李勤红编辑谢波)2022年9月13日,中国红色先锋队云南省普洱市景东彝族自治县志愿者,来到月牙湾湿地公园外段河65岁的李东生难救TCL文丨周俊出品丨牛刀财经(niudaocaijing)现年65岁的李东生,不得不面临一个新的挑战。今年上半年,TCL科技创始人李东生在2021年度业绩沟通会上表示,显示面板下行周期已
秋天的问候,喜乐安康人生没有十全十美,只要健康快乐就好!每天都要给自己一个开心的理由,笑一笑,好运旺旺来,美丽好心情。珍惜身边的每一个人,且行且珍惜,感恩所有爱我的人,谢谢你们带来的温暖和快乐!感恩遇39句,乐观文案,击退负能量1。无论你走到哪里,无论天气多么坏,记得带上你自己的阳光。2。每个人身上都有太阳,主要是如何让它发光。3。人活一世,有健康,活的开心快乐就是最好的。4。我将伸手摘月,若是失败,仍与你的样子还记得就是声音很久没听了其实你也不用那么大的压力,我一直都知道你在等我放弃,我也在等我自己耗尽力气,再给我一点点时间,毕竟喜欢你了那么久,对吧。曾经我很喜欢一首诗,白茶清欢无别事,我在等风也等你。后来我才早安美图心语,学习处事明理,不断成就自己,生活美满甜蜜世界日新月异,需要不断学习,处事才能明理,方可成就自己,生活自然甜蜜,努力努力!头号解忧馆守护银龄世界怎样调整好自己的情绪和心态阳光普照大地,人生实属不易,需要不断学习。在学习中生情人关系的轨迹犹如四季轮回,周而复始一对情人偶然邂逅,在春日阳光的滋润下,萌发,生根,发芽,最终开出幸福的花朵,面对春意盎然的季节,一切都是那么的甜蜜,那么的美好和幸福,就连两个人呼出的气息都是诱人的,互相依偎在彼此那一首老歌好长时间没有听歌了,似乎生活的繁琐悄悄地抹去了音乐的旋律。闲来无事,慵懒地在手机上刷着小视频,一不小心刷到了老歌,突然间岁月的沧桑涌上心头,突然间心潮澎湃热血沸腾,犹如泛滥的洪水一关于贫穷富贵和励志的句子令穷人感悟奋起的句子(精选七)在贫困中,要有忠心志气在危难中,要有信心勇气在富贵中,要有舍财义气在做人中,要有浩然正气。我从来不曾有过自我怀疑。我从来不曾灰心过。巴菲特贫穷的人往往富于仁慈。海明威知足是天然的财传承发展提升农耕文明,走乡村文化兴盛之路(乡村振兴一线探访)习近平总书记强调,传承发展提升农耕文明,走乡村文化兴盛之路。走访一座又一座村庄,广袤田畴间,龙舟划起来,秦腔吼起来,锅庄跳起来,农民文化生活更加丰富多彩,乡亲们精气神持续提升,不断四川方言生僻字表示说话顶撞之杵起的杵,应为啎四川方言中,言语上的顶撞,过去通常就叫说话杵起杵起的。过去未做考证,今天在内江市志一书中方言篇看到了啎这个字,如下图内江市志第760页。在百度中查看啎字,有如下注释啎,wu,1。古追思,家乡的那颗老树图片源自网络又是一年花好日,细雨缠绵,清明至。忽的一瞬间,我越发想念他了。他就如一棵藤蔓缠绵的老树,在空旷的天地间显得那样古朴,那样凝重。然而这棵沧桑的老树说倒就倒,倒下时我不在他掘金新季三核回归有望争冠?小波特我们现在专注建立冠军文化北京时间2022年10月6日,掘金队的悍将小波特接受采访的时候表示,西部有很多天赋好的球队,我们的天赋和其他队一样好,现在我们专注建立冠军文化,到目前为止一切都进展不错。从ope新