sheldon发布于 2019-07-08
转:https://segmentfault.com/a/1190000019700701
alinode是基本上是免费开源的,不只是可以运行在ECS里面,理论上可以应用在任何地方(只要面子上过得去)。本文将赘述一下alinode的使用方法。
本文首先啰嗦一下 Node.js 平台的性能问题分析所包含的一些内容,第二part再叙述下 alinode 是如何使用的
要定位 Node.js 的性能问题,一般要对Node进程进行性能方面的进程分析。
进程分析一般包括 内存、CPU、EventLoop、ActiveHandlers 等的分析。对于开发人员来说,这里面包括3个主要任务:
这个有几个比较常用的工具,例如 Apache ab、wrk 以及 Node.js 编写的 autocannon
这里就不具体讲用法了,通过压测工具,我们可以量化我们站点的性能指标,在性能问题排查过程中为我们提供依据。
一般我们的性能指标需要达到一定的吞吐量 req/sec,且单个请求的耗时要在预期范围之内。否则耗时过高影响用户体验、吞吐太低则会造成某些用户访问失败。
CPU
cpu一般要观察一些时间来拿到他的函数执行堆栈情况,比如 alinode 进行dump时也是要等3分钟。
node --prof app.js
node.js 从 4.4.0 版本开始内置了 profiler, --prof 命令选项运行应用会在当前目录生成性能日志文件
以上命令会在项目根目录会生成 `isolate-xxxxxxx-v8.log` 格式的文件,这个log文件还不能直接进行分析,一般可视化工具都是要一个json文件。因此,log需要进行预处理,我们可以这样预处理这个log:
node --prof-process --preprocess isolate-xxxxxxxxxx-v8.log > v8.json
这样就可以把它转为一个json字符串文件。
方法2:使用npm包 v8-profile
使用示例如下:
profiler.startProfiling('', true); setTimeout(function() { var profile = profiler.stopProfiling(''); profile.export() .pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`)) .on('finish', () => profile.delete()) }, 1000);
内存
kill -USR2 <pid>
的信号。分析的话,无非是用一些易于查看的数据展示工具或定位工具来帮助我们更好的展示数据。比如能按函数热度去展示cpu profile文件。
方法1: 使用v8自身提供的界面分析工具。
git clone https://github.com/v8/v8.git
打开 v8/tools/profview/index.html
文件,是个静态界面,在界面中心选择刚生成的 v8.json文件,文件解析成功后,界面上就展示了函数调用的时间信息了。
chromedevTools
这里不再赘述了。chromedevtool提供了heavvvy、chart多种视图,还是很不错的。
方法3:使用 v8-analysis工具
v8-analysis这个模块可以解析 v8-profiler
和 heapdump
等工具输出的cpu & heap-memory日志,可以提供:
通过上面简单的介绍,可以发现性能分析这里有2个痛点。一个是收集数据,需要侵入代码,手工执行相应的指令。另外一个是: 分析工具五花八门,哪怕用chrome devtool也得经历把dump的数据下载回来导入的比较痛苦的过程。
alinode 阿里Node.js性能平台 对以上一些问题的解决过程进行了集成,提供了更易用的体验,解决了大部分的痛点。而且是免费开源的(基本上)。alinode通过 错误日志、操作系统指标(cpu/内存/磁盘/IO)、慢日志、异常等维度来监控node应用,并提供了如 coredump、cpuProfile、heamdump 等工具,同时提供了Profile的在线web数据可视化分析的能力.
总体来看,alinode的几个工具也就是提供了本文最开始提到的性能分析相关的能力,即数据提取、数据分析能力(当然还有额外的监控通知、好看的UI、实时数据展示)。
alinode的设计架构如下:

其实,只看技术细节部分的话。alinode包括这3部分的组件,我们从底向上说:
我在本机macbook上进行了站点的性能分析,下面我们来看看 alinode 使用的基本步骤,对我们学习别人的设计和思路也是很有帮助的。除了观看这里的步骤之外,你还可以参考官方帮助文档 作为辅助。
从上面的分析可以看到,我们在本机要做的事情其实就是安装阿里改装后的node运行时(alinode)以及agenthub。下面是具体步骤:
wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash
执行安装脚本后,我们再执行
source ~/.bash_profile ,# 你的可能是 ~/.bash_rc
此时tnvm安装成功。
执行tvnm命令查看下 alinode远程有哪些版本
tnvm ls-remote alinode
选择一个alinode版本进行安装
tnvm install alinode-vx.y.z # 4.8.0->10.16.0
比如我安装的 v4.8.0,他对应 node的 v10.16.0
tnvm install alinode-v4.8.0
接下来,别忘了要 use 一下你安装的版本。
tnvm use alinode-v4.8.0 #别忘这一句。
此时,执行 which node
命令你会发现已经使用上了 tnvm管理的alinode:
/Users/cuiyongjian/.tnvm/versions/alinode/v4.8.0/bin/node
agenthub 只是一个 npm 命令行工具,通过如下命令可以很简单的完成安装:
npm install @alicloud/agenthub -g
agenthub接收和发送信息,需要知道云上的服务ID. 所以他启动需要一份配置,我们在任意地方新建一个config.json
1 { 2 "appid": "80535", 3 "secret": "3c4d************5”, // 你在aliyun上新建node监控实例时,会给你一个appid和secret 4 "logdir": "/tmp" 5 }
然后启动agenthub:
DEBUG=* agenthub start config.json
注意点:这里的 /tmp是指的agenthub从哪个目录来获取dump出来的日志文件。 因此这个目录必须跟你接下来启动node应用时指定的日志输出目录一致,否则你的agenthub将无法上传dump信息。
我们来启动我们的应用:
NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES node app.js NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES pm2 start app.js
例如我的实际项目:
sudo NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES PORT=80 MODE=ssr NODE_ENV=production CGI_ENV=online node ./backend/app.js
这俩LOG的环境变量必须指定。一个是前文所说的日志输出目录,一个是是否打开日志功能,如果不这样配置肯定就不能进行远程dump了
一些小问题
source ~/.bash_profile
来让tnvm的node路径优先。当你在管理平台查看数据或执行dump命令时,可能会提示出错。这里有几点排查思路:
打开 node.console.aliyun.com
,进入管理控制台首页。

这里会展示实例。所谓实例就是你的一台机器。在这里可以点击主页进入一个实例,也可以配置该实例相关的告警(如针对错误日志、内存等阈值配置告警),还可以配置团队成员。

左侧链接可以看到:针对当前实例有这么几个功能: 进程信息查看和管理、系统信息、异常信息、慢日志信息、依赖信息。



dump之后就去点页面左侧 文件列表
菜单, 来到文件面板这里,查看文件生生进度,生成完成之后就点击转储,转储完成就课可以点击分析。

当我们点击一个已经转储完成的 CPU profile 文件,管理平台会打开一个新页面展示火焰图:

cpuprofile还可以直接点击 devtool分析
查看,这种分析会自动会在浏览器中打开一个chrome风格 分析工具。很神奇:

GcTrace分析: