alinode-基于Node.js运行时的应用性能管理解决方案

本文涉及的产品
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 本文主要以alinode开发过程总结讲述了基于Node.js运行时的应用性能管理解决方案的一些经验和学习参考。对alinode或者Node.js感兴趣的小伙伴们不要错过哟!

本文主要由中生代技术群的技术讨论分享整理而成,作者张子发(花名:穆客)是阿里云Node.js方面的专家。本文主要是Alinode的开发过程总结,同时希望能造福广大Node.js开发者。


今天分享Node.js应用管理方面的心得,对Node.js感兴趣的朋友可以关注下更多内容可以参考团队里面朴灵同学的《深入浅出Node.js》,哈哈~


针对Node.js应用管理,我们做了一套解决方案alinode,是针对Node.js应用的性能管理方面,解决生产环境下Node.js应用的深度监控和在线故障诊断

56939d5aae665a9b154c5f1d5c6cccbbb94866b3024bbf2b39cc5532e8c6ad0aa11726c624fb8665d21f59605bbc56553fa026c690a93e5500ce8ced9f56f953cd14e369015e9a134af07f14f717522d4dd66c1d74cbb568e24f129715141bf41116ee80a4c36a96072f1668bc704790342e0faa005fc549fff955b0e8735737bf5badbc0a0a6db8e625700882b8b244a08125cfd94d8c669b0e1277c594546f

沿着提出问题->分析问题->解决问题的道路,针对上面的问题,我们做了alinodecf022f05697b0f2a04c2f87129864af0df623487

下面是一些具体的监控指标在实际应用中的用途

d6eaaeff22c1dbdfd9909817a3b9ca081f11e64a

node进程级别的内存数据,主要是内存使用状态和趋势, 到底是v8堆上内存用多了,还是堆外内存使用的多

如果内存不合理,优化的时候就有了方向

13db79c6cb6d73c29e777b30aa573e027ecb967f

这个是具体到v8上各个space的使用情况, 新生代/老生代/大对象空间之类的,也是给优化提供更精确的知道意义c56b2a5d07c377bd6eff55ff4a393bec6dcbc371

垃圾回收时间占比,因为在垃圾回收的时候,用户代码是停止的,所以这个数值过高,也是需要关注的
9867c0577eaa0a49e46f107c892241bd5c869323

这个是qps和timer状态和趋势,qps/rt堆业务是和重要的指标,timer本身是比较耗资源的,如果timer数量不正常,那么需要关注下,因为写代码的人应该知道具体使用timer的情况,所以异常还是比较容易判断的

f54921b481bfd44c851a52c80682e889afc7eb21

这个是系统级别(同一服务器上所有node进程总计)的一些load/qps/memory/cpu之类的信息。

下面是一些诊断的试图,在发现系统异常后,可以做堆快照, CPUProfiling来分析,因为代码逻辑错误之外的问题,基本上最终都归于内存和cpu的问题63a9164d290ad48753a9cf8c805c1dd54c628a98

这个图是比较糊的, 用过chrome devtools的同学应该比较熟悉,就是分析cpuprofiling,有三种视图20a60960744236874299721b86df40dbbd5a1149155b6037801c0753632662b901438bb1a0031cd5

与原生的node想必,我们在v8层面多输出了一些信息,所以看到代码是否被优化过05cbde895b94807c8e2e5e9ece961dde4407746e541ff97da6530a94b0be48d59f01770d43f9a0cc

与原生的node想必,我们在v8层面多输出了一些信息,所以看到代码是否被优化过这两个图是堆快照的输出,基本上所有与内存相关的问题,仔细分析下都能知道到原因,可以直接把堆上占用内存排前几位的对象指出,展开后就能分析到对应到代码哪一部分了

f740a6e262c3b96893a5318c312ccaf36bb2ddba

下面说几个解决问题的案例

一个是cpu相关的,某用户在高峰期,cpu会到80-90%的样子,找不出原因,profiling后,发现是这样的97a594ef2e759ec78d035e5936f13598bc01355ef2b6d9f721a967c0d6674eee137e58fdf5c93bce

处理函数降到了 24%不到一点,其实我们做开发的都知道,如果发现问题了,解决问题不是很难的事情7f8811434207b36ab02b0c41682aa647245693cd


这里有个很夸张的值,就是发现内存慢慢增长,大了没办法就重启;做了个堆快照后,发现是tlswrap这个独享有几万个...
原来是有个库封装的问题,本来一条链接就可以了,结果每次都创建一个新的。不释放...然后堆起来了
类似的问题很多
可能对群里面的大牛而言,这些错误会犯的比较少,可是对那些不是大牛的同学来讲,有时候还真难以避免这些问题,朴灵同学也犯过内存泄露的错误....因为有个数据库异常没有处理,然后堆起来,v8的堆就爆掉了

接下来分享下做alinode的过程中对v8的学习

2d645bacd5135493ca5050195d4e66db51f3cf46

我们也不敢说理解了v8了,花了大部分时间在v8的学习上面
下面是一些学习笔记的例子,详细内容就不列了,只列了一些标题

2d645bacd5135493ca5050195d4e66db51f3cf46b8a0110673c0729f4ba8783069454bc336feb31ead5afeac9f126f985ee52fbe6420b4b2500046c9f67fd78690bf6d28326ef9a73a4e059800803877b1d51b7996dfeb07909177c4840736594c07bb2c0f6c6e78b9c05b4b53b910fc30e270e223399906569d7ac994be40205949a8bf44a39b6e2a40bef3

http://alinode.aliyun.com/

Q&A

问题1:mysql在update某行的过程中,其他线程是不是不能读这一行了?等update完毕才能读?
这个不是我的领域哎... 这方面的专家谁帮忙回答下吧

问题2:张老师,你们在调优过程中是否对V8引擎作一些优化呢,是否可以举个案例?

这个也是学习v8的出发点, 其中一个优化是对ArrayJoin的汇编改进了一下,原来只支持ascii,改进后也支持中文

问题3:看您介绍的很多都是宏观上的监测,在调优过程是否有发现像CVE-2015-8027 Denial of Service Vulnerability这样的NodeJS漏洞呢?
安全漏洞倒是没有发现,发现了nodejs本身的一些性能问题,踢给社区了

问题4:NodeJS的性能是否还有很大的潜力挖掘呢?
个人觉得不会有几倍的提升了, 小改进会有
我以前是做c开发的,开始非常难以接受js,后来做alinode的过程中发现,这个东西开发效率太高了,比c高了不知道多少倍,这个非常重要,尤其在一些创业公司中,开发效率的提高,然后还有无数的库的支持,当然这也带来了库本身参差不齐的问题,所以才需要应用性能管理

问题5:张老师,能否简单列举下node.js在ali的主要应用场景?
这个可以参考一下https://www.zhihu.com/question/37379084

里面也有deadhorse同学在天猫那边的应用,基本上,阿里内部有几百个应用在用Node.js了,但是核心交易系统没有用,那个是java的天下,哈哈

问题6 Node.js 进程间缓存共享你们有用到吗?
我写过一个模块,用共享内存的,适合同一台服务器内不同进程间应用,但是没有用到线上,因为线上还要考虑不同服务器之间的问题,使用tair了

问题7 阿里的node主要是前段工程师在写还是服务器端工程师在写
都有,比例我还真的不清楚,估计现在还是前端多点吧。

问题8:慢请求调用链比较长这个怎么排查的
这个先把慢路径找出来,然后再想办法解决吧

问题9:为何选择了node.js,而不是erlang,go这些?除了开发效率和并发之类的考虑,技术选型上是否还有其他关注点?
这个貌似这个群还是另外一个群正在讨论,选Node.js是因为有这方面的人才储备,国内一伙做node比较早的阿里有好几个,然后就是js语言与前端统一,沟通成本降低很多


                                                        中生代技术群微信公众号

                                                da9312524921e637b684eed7bf3249db58f7badc

本文作者 张子发(花名:穆客) 阿里云专家

相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
目录
相关文章
|
4月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
145 1
|
9天前
|
监控 JavaScript Linux
[译] 在生产环境运行 PM2 & Node.js
[译] 在生产环境运行 PM2 & Node.js
|
4月前
|
前端开发 JavaScript API
Howler.js:音频处理的轻量级解决方案
Howler.js:音频处理的轻量级解决方案
293 0
|
2月前
|
JavaScript NoSQL Serverless
函数计算产品使用问题之如何创建一个自定义运行时并指定Node.js版本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
24天前
|
Kubernetes 容器 Perl
Kubernetes(K8S) Node NotReady 节点资源不足 Pod无法运行
Kubernetes(K8S) Node NotReady 节点资源不足 Pod无法运行
23 0
|
1月前
|
JavaScript 调度
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
38 0
|
2月前
|
运维 监控 JavaScript
函数计算产品使用问题之将自定义层(nodejs 20)添加到了函数中,本地运行没有问题,但在函数计算中出现问题,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
|
3月前
|
Dart JavaScript 前端开发
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
1186 1
|
2月前
|
JavaScript 前端开发 API
vue 报错【解决方案】/sockjs-node/info?t=
vue 报错【解决方案】/sockjs-node/info?t=
309 0
下一篇
DDNS