当时并不是没有工具可以解决这个问题。例如,对于第一类内存泄漏问题,可以使用heapdum模块生成内存堆的快照,然后导入到Chrome浏览器的开发者工具中。对于第二类CPU激增问题,可以通过v8-profiler生成CPU Profile文件,对于第三类GC暂停问题,可以使用开发者工具查看分析。使用--gc-trace 标志输出GC 日志并查明问题。
然而,这些工具的共同缺点是对在线应用非常不友好,不是即插即用的,而且发现问题的成本很高。如果您的应用程序在离线状态下运行良好,但在上线后出现问题,那么安装该工具就为时已晚,并且您还需要修改应用程序以在上线后重现该错误。此外,如果将异常配置为触发文件生成以进行分析,则当应用程序大规模运行时,堆快照将快速增长。
“我们需要做别人做不到的事情。”从一开始,团队就一直在思考如何更好地解决Node.js 应用程序中的可诊断性问题以及我一直在寻找的V8 虚拟机的黑盒环境。寻找改变它的方法。有两件事需要解决。
更深入地了解Node.js 运行时的内部状态,并考虑如何使其对开发人员和操作人员更加透明。
当你在线应用程序遇到问题时,如何更好地解决它,而不是在问题发生时寻找工具来修复它。
因此,团队决定将重点放在提高监控和诊断能力的方法上。
传统的监控解决方案只能看到一些系统级信息,APM解决方案无法提供完整详细的问题报告。例如,可以得到系统级CPU过高的信息,但不清楚这是由于业务代码占用还是GC消耗所致。再比如,APM 解决方案可以告诉您哪些API 运行缓慢,但它们无法回答进一步的问题,例如故障出在CPU 还是内存上。
该团队对Node.js 内核(包括libuv 和V8)有深入的了解,并深入研究了多个地方以通过计划日志记录输出内核状态。性能指标包括GC(新生代、老年代)。堆内存(整体、子空间)、句柄、定时器等。这些性能数据与监控系统相结合,与报警判定和消息通知相结合,提供更深入、更透明的内核级性能监控。
获取内核级监控信息后,可以更有针对性地排查问题。在内核层面,团队提供了一种通过信号触发内核进行分析的机制,并提供了一组脚本来简化操作。如果您收到有关潜在内存泄漏的信息,找到受影响的进程并生成堆快照,在CPU激增期间生成cpuprofile,在GC异常发生时执行GC跟踪操作,或者执行以下操作的组合:可以。在更复杂的情况下进行协作。
从具体实现层面来看,Node.js 和Chrome 都基于V8,但它们无法提供像Chrome 那样有用的实时诊断。以GC Tracing为例,V8可以以flag方式输出GC日志,只不过flags在进程启动时打开,如果默认进程打开则关闭,这是一种非常不友好的格式。启动时会产生大量GC日志,但没有实际值。但是,如果出现问题,打开标志的唯一方法是重新启动进程。因此,我们修改了GC跟踪功能,以消除在一定时间后需要重新启动进程并结束日志输出。
“就像你生病时,医生使用设备收集详细的身体体征数据来进行诊断。对于在线运行的Node.js 应用程序,Node.js 性能平台诊断可能的功能通过‘捕获’提供更详细的性能。数据。诊断完成后,该进程可以继续运行。 ”蒲灵解释道。 “Node.js 诊断可以保留运行场景,以便更好地分析问题。”
除了上述监控和诊断能力外,团队还能够改进数据可视化、分析问题算法并直接告知问题的根本原因。
团队仔细考虑了平台的易用性、稳定性和安全性。首先,自主开发的Node.js 内核与开源社区的内核完全兼容。其次,与传统的APM仪表报告相比,该解决方案对平台日志服务器业务代码的行为没有影响。换句话说,我们构建的监控系统除了分析过程中作为初始准备的必要部署外,不会影响内核。如果出现此类问题,用户无需登录服务器,只需在界面上进行简单操作即可。
当头棒喝的技术教训
团队于2014年底完成产品原型,并于次年为集团内业务方面做出贡献。它最初被命名为Alinode,并开始尝试将其商业化。当时业界还没有类似的竞品,直到两年后NodeSource 发布了N|Solid。
Node.js在阿里巴巴内部的应用已经非常成熟,现在是继Java之后的第二个技术栈。除了超过1000个在线应用之外,我们还有Egg.js企业级框架、CNPM仓库解决方案以及无数的周边业务支持。中间件和SDK。几乎每个Node.js 业务都拥有Node.js 性能平台的全面稳定性解决方案,每天为数万台服务器提供性能监控和诊断服务。
在谈到产品定位时,濮凌表示: “我们总是小心地与社区的Node.js 版本保持同步,否则社区就会变得支离破碎。我们最重要的改进集中在稳定性上,稳定性提供了详细的监控和诊断,以便您可以更轻松地发现和解决问题。 “例如,在内存泄漏的情况下,详细的性能监控和在线分析可以将识别问题的时间从大约一周缩短到两到四个小时。”
现在,该产品已更名为Node.js性能平台,正式向所有阿里云公有云用户免费提供商业服务。从内部使用到外部服务提供,Node.js 性能平台团队的客户涵盖内部和外部Node.js 开发人员。业界同类产品仅有IBM的Node.js SDK和NodeSource的N|Solid。从产品形态来看,IBM的产品隶属于BlueMix产品线,N|Solid必须通过许可或私有部署的方式进行部署,Node.js性能平台是SaaS服务形态。当用户使用Node.js 性能平台时,他们拥有更大的灵活性,因为他们不必购买或部署依赖产品。
值得注意的是,它具有独特的堆快照分析功能。这是由于引入了在Java 领域非常成熟的MAT,而不是继续依赖Chrome 的devtools 工具。该算法比较先进,不仅可以直接捕获问题的疑点,还可以很好地适用于2GB堆快照等极端情况的排查分析(很难想象如何分析一个堆)。要在浏览器中创建快照,您必须使用开发工具来分析并查找大文件中的违规对象。这是一项技术和体力任务,就像大海捞针一样。 )
安全是更重要的方面。该平台的安全功能分为两部分:漏洞扫描和数据安全。平台不会扫描您的代码和环境,只会扫描您使用的节点版本和模块包版本(取决于您的包配置),并在该版本存在安全问题时发出提醒。为了保证用户数据的安全,Node.js性能平台会收集Node.js内核的运行状态、各空间的内存使用情况等信息,无需业务层参与。用户的日志仅在用户的阿里云账号中可见,如果需要支持,需要经过审批。
Case1: 应用稳定,运行时更高效安全
以下是一些来自实际客户的示例。 GC 时间百分比达到了非常夸张的43%。这意味着在3 分钟采样期间,应用程序有43% 的时间执行GC 操作。
平均暂停时间为30 毫秒至80 毫秒。仔细一看,新生代GC(Scavenge GC)发生得非常频繁。
对比老年代GC(标记清除GC),这个现象说明老年代GC的次数很少,但是新生代GC发生频繁但是停顿时间很大我理解。它与上一代GC类似,但每次只能回收少量内存。也就是说,新生代GC的性能比老年代GC要差。
当然,造成这种情况的原因主要是由于系统中存在大对象。
您还可以从heapsnapshot 中检查此问题。
为了解决这个客户的问题,仅仅依靠新生代GC是不够的,所以我们希望减少不必要的新生代GC,或者说减少新生代GC的数量。只要内存分配频率保持不变,新生代GC的频率与新生代空间的大小有一定的关系,因此只要增加新生代空间,就可以减少新生代的数量。
然后我要求他们在启动进程时添加--max_semi_space_size=64,但在监控条件下,极端GC 暂停最多只能达到20%,而正常情况下会低于5%。
我们来看一下转换后的性能图表。
我们将年轻/老一代的比例从1375/10 降低到134/14,并将GC 暂停减少到3%,满足正常预期。
Case2: 解决了令人讨厌的内存泄漏问题
内存泄漏是指未正确回收的内存在系统中随着时间的推移而增加,导致系统的有效内存(可以成功申请和回收)越来越少。外部症状是进程的内存使用量增加。
您可以直接通过Heap Snapshot生成功能以及对node.js性能平台的分析来获得分析报告。
展开对象以查看详细信息。
最后通过堆快照分析给出一些关键词:应用、封蝶、符号。从业务代码中就可以找到问题所在。
case3:高效利用CPU进行扩容
在对外部客户进行压力测试时,发现CPU 使用率较高,并通过平台生成了包含有效信息的CPU 配置文件。查看堆栈,可以看到Writable.onwrite-clearBuffer调用链路占用了25%的CPU资源。结合当时生成的堆快照文件可以判断日志写入负载较大,可以看出客户正在记录所有生产日志。经过检查并删除不必要的日志后,相应的CPU占用率最终下降到6-7%左右。
在上述过程中,Node.js性能平台使用PTS进行压力测试。 PTS 压力测试可让您了解系统性能是否符合预期,以及在预期高流量时是否存在任何问题。然后您可以使用Node.js性能平台来解决压测过程中遇到的瓶颈问题。
业务开发的学生普遍对业务逻辑如何实现感兴趣,而很少接触底层技术,这使得在需要解决瓶颈或奇怪问题时变得极其耗时和费力。 Node.js性能平台弥补了企业级应用层面的弱点,节省了解决问题的时间和精力,让企业能够专注于发展业务。
已有工具还不够好,潜心研究底层技术
除了上述问题之外,还有一些其他业界难以解决的问题,例如无限循环、堆外内存泄漏、尸检诊断(分析停止进程的原因)。这些都是团队正在克服的问题,我们计划在不久的将来以产品功能的形式提供相应的解决方案。团队将继续投入资源加强我们的核心功能,并持续改善用户体验。
目前,Node.js性能平台对所有阿里云用户免费。这意味着阿里云上的所有Node.js用户都可以受益于阿里巴巴这几年积累的Node.js领域的稳定性经验,远离困扰人们的各种疑难杂症,意味着可以更加专注。关于发展。自己的事。
未来,Node.js性能平台将朝着更加智能化的方向发展。理想的效果是,用户接入Node.js性能平台后,可以分析潜在的线上问题,并根据profiling后的性能自动识别有问题的代码行。文件。此外,自有云和国际化也是产品未来的发展方向之一。在服务层面,团队希望更好地服务更多用户。该产品当前提供的所有工具、功能和服务在公共云上都是免费的。该团队还计划在未来推出自己的云服务和专家咨询服务,但此类服务比维护SaaS 网站需要更多的劳动力。
“消除难以解决的Node.js 问题。”这是Node.js 性能平台团队的唯一目标。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。