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

作者:一分快三平台 发布时间:2019-10-06 13:55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

版权所有 © 2020 一分快三平台技术研发中心

邮箱:desdev@vip.qq.com 备案号:晋ICP备15566906号-1

联系地址:四川省万源市沂水县北外环工业园33号 电话:0266-5494432