公司新闻

震惊48小时后,阿里工程师如何在紧急定位线上泄露记忆?

发布日期:2020-02-08 20:49
作者:极速快三官网

  14:04:28的警报显示,、一只Foll&#;ower意外退出了目前的昆仑,并通过选举重新加入了昆仑。16:06:35的警;报显示,&#;一名猎人在事故中重新启动了警卫,并在02:56:42再次加入了昆仑。警报器显示,一个Followe;r出人意料地重新启动了监护。程序,并在12:21:04再次加入黄金!。警方的警报显示,一,只Follower意外退出。了目前的昆仑,并通过选举重新加入了昆仑。下图显示了基于Paxos实现的一致性维护,功能模块。前端,代理客户端和一致单位的通信支持服务水平的扩展。由于后端分布式一致单元由五台主机组、成,可以容忍同时挂断两台机器。因此,!上述警报器没有发现对服务可用性&#;的影响。然而,在短时间内经常发生一个。主要的服务过程是一个巨大的隐患。特别是,操作调度强烈依赖于分布式协调服务的业务。因此,我们开始关注这一问题。

  首先,我;们排除了网络问题,通过TSAR命令检查机器上的网络指标是否正常。通过内部网络平台查看机器上的网络设备和网络链接也是健康的。当我们;回到日志时,我们从Leade&#;r日志&#;中找;到了线索。所有,的Leader都主动关闭了与Fol&#;lowe!r的通信通道。

  &#;当然,我们想知道为什么Leader经常关闭与Fol&#;lower通信通道的答案也在日志中。Follower很长一段时间没有向;Leader发送请求,包!括Leader&#;发送的心跳包。因此,莱德被认为是一个异常的折叠,然极速快三官网后关闭通信通道,并将它、踢&#;出目前的库鲁姆。

  好吧,现在你可以直观地解释为什么报警:福勒在很长一段时间内都失去了与伦敦的联系。引发了退出夸。朗的逻辑(如果退出!夸朗的过程&#;缓慢),它、将进一步触、发直接退出过程逻辑的快速恢复。

  所以一个新的问题是,为什!么这些Followers不回答光的心跳要求?这一次,没有直接的日志来回答我们的疑虑。幸运的是,有间接的信息。在出,现问题之前,Follower。的日志输出被打破了很长一段时间(超过了触发退出的阈值)。在一;个经常需要访问分布式协调服务的商业集群中,。这几乎是不可想象的。我们更喜欢相信后端的。过程,而不是没有,用户的要求。

  在没有其他调查的情况下,基于JA实现的后端分!布式一致单元。我们检查了GC日志,在Follower问题期间发现了原因。与Jag,c有关的P&#;ar。new需要很长时间才能完成。下图显示了机器上的类似日志。我们知道,Jagc的&#;过程是一个STW(Sto;p-the-World)机制,除了垃圾收集器的其他线程。这可以解释为什么后端的Fo;llower线程将在短时间内保持下去。

  虽然我们的JA程序的;初始内。存很大,但实!际分布是虚拟内存。Parnew需。要太长时间,很可能机器、上的实际物理内存不足。

  根据这个想法,我们进一步使用顶部命令查看存储占用的过程。结果表明,在机器上混合部署!的前端,Proxy过程中使用的内存已达到整机。的66%,。

  进一步检查系统日志。研究发现,一些机器。的前端Proxy过程是&#;由于缺乏记忆的O,OM错误而被系统,KILL所致。在这一点上,我们开始调查前端P,roxy内存泄漏。

  该业务严重依赖分布式协。调服务的发现&#;功能。以本次调查的业务集群为例,单组注册的服务地址数量达到240K分析地址450W。分配协。调服务的稳、定性直!接影响集群业务的健康运行。

  在明确、了分布式协调服务Proxy过程中存在内存泄漏的风险后,我们对其他在线集群进行了紧急检查,发现这一问题并不是独一无二的。在G、CORE的前端P。roxy网站之后,风险危险不能保持到11点,我们做出!了紧急的改变。一个接一个地,重启了上、述风险集群的前端Pr。oxy过程,并暂时!缓解了在线风险。

  继续调;查问题。在重新!启、动Proxy过程之前,GCORE保留了现场(在此强调。在线;G、CORE必须小心,特别是在内存占用这么大的过程中,这很容易导致处理亨格的请求。我们的基础是,分布协调服、务的客户端具有。加班机制,可以。承担一定的GCORE操作。

  因、为前端Proxy,的主要内存成本是基于订阅实现的有效地址缓存。首先,我们检查。了GDB,以保持缓存的无限大校因此,这个、尺寸符合;预期(正如监视指标所显示的),它不会占用1GB以上的空间,远远超过1G。B。在这一点。上,我们进一步证实,工作室的空间占用不超过一次。我们的调查陷入了困境。

  这时,我;们想到了兄弟团队中一位伟大的神的杰作。介绍了在线环境调查C/C应用程序内存泄漏问题(一些学,生可能会提到阀门工具为什么不需要。、首先,这件艺术品在测试环境中,是必要的,但毕竟,可能会有一,些丢失的场景在网上发布,!导致线上存储泄漏。此外,在大型项目中,阀门的运行速度太慢,甚至导致程序不能正常工作。这里还提供了调查内存&#;泄漏的另一个角度。假手表。每个类别都有一个错误的表格,同一类别的所有物体都指向相同的虚拟表格(通常、是每个物、体的前8个。字节)。因此,如果计算每个!虚拟手表指针的频率,你可以知道有多少不正常的物体被。分配,那么就有可能发生存储泄漏。

  伟大的上帝提。供了一种内存泄;漏调查工具(说明这种工具是基于规则的TCMALC内存管理方法)。通过符号表找到每个VTABLE、,您可以知道虚拟手表地址,即每个虚拟功能类别的前8个字节、的内。容。该工具的强大部分是摆脱G;DB的依赖,并根据应用程序申请的所有内&#;存块分析找到所有泄漏的内存块地址。进一步统计每个&#;虚拟手表类别的对象数量。最后,我们统计的虚拟手表信息超过10W,,找出了罪魁祸首。科蒙:克洛苏尔的目标泄露了多达16亿。

  G、repClos&#;ure-rproxy-GrepEnvproxy/io_handler最终定位的原因实际上与我们对Proxy日志的分析有关。我们在日志上发现了大量的非法访问请求。客户端试图分析角色注册服务地址,但使用错误、的集群参数。在单个Prox&#;y机器上刷出4000个错误的日志。那么,这是否、是由于持续的!错误路径造成的内存泄漏?

  我们仔细研究了这个代码。CheckCal&#;l对象正常进入执行逻辑(C&#;ommon:Clos。ure。在执行后自动释放内存)。但是在不正常的道路上,比如上面的非法集群名称,!功能将直接下降。相应的CheckCall对象不会随着业务的不断访问而分析,并!且会继续产生内存泄漏。

  计划2的运动在灰度窗口没有足够的升级之前有了很大的提高。最后;,我们根据日志中持续的非法访问路径选择了计划。我们联系商界人士,协助调查和&#;确定哪些客户端程,序使用错误的集体名称访问分布协调服务,以进一步找出原因。最后,业务方,通过紧急在线、Ho、tfix消除了对错误集群名称的访问。业务线分布协调服务前端Proxy过程中,存储泄漏的趋势得到,了控制。

  当然,根本的修复方法是;从Prox。y前端处理CheckCall的异常路径。我们的修复方&#;法是遵循函数实现单一出口原则的功能,并在异常路径下进行。在执&#;行逻辑&#;中判断错误代码的直接&#;记录不是实际的检查逻辑,而是触发自我析分的行为。维修将在国庆假期后发布。

  稳定性!工作需要从细节;开始。我们需要跟踪每一个在线服务或服务指标的异常情况。找到工作室并继续跟进风险修复,以便更,稳定的分布系统。这、条路很长,我会上上下下,和你一起去。

极速快三官网

Copyright © 2020 极速快三官网科研集团 版权所有

公司地址:江苏省连云港市兰山区永兴商贸城44区

联系电话:0981-7103077 备案号晋ICP备77809081号-1