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

作者:秒速赛车官网 时间:2019-04-25 16:46 浏览量:168

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

版权所有 © 秒速赛车官网制造有限公司 地址:河北省黄骅市顺德区容桂华口工业区54号 ICP备案号:琼ICP备08330777号-1 网站地图