alinode是基本上是免费开源的,不仅是能够运行在ECS里面,理论上能够应用在任何地方(只要面子上过得去)。本文将赘述一下alinode的使用方法。html
本文首先啰嗦一下 Node.js 平台的性能问题分析所包含的一些内容,第二part再叙述下 alinode 是如何使用的node
要定位 Node.js 的性能问题,通常要对Node进程进行性能方面的进程分析。git
进程分析通常包括 内存、CPU、EventLoop、ActiveHandlers 等的分析。对于开发人员来讲,这里面包括3个主要任务:github
这个有几个比较经常使用的工具,例如 Apache ab、wrk 以及 Node.js 编写的 autocannongolang
这里就不具体讲用法了,经过压测工具,咱们能够量化咱们站点的性能指标,在性能问题排查过程当中为咱们提供依据。web
通常咱们的性能指标须要达到必定的吞吐量 req/sec,且单个请求的耗时要在预期范围以内。不然耗时太高影响用户体验、吞吐过低则会形成某些用户访问失败。chrome
cpu通常要观察一些时间来拿到他的函数执行堆栈状况,好比 alinode 进行dump时也是要等3分钟。npm
node --prof app.js
node.js 从 4.4.0 版本开始内置了 profiler, --prof 命令选项运行应用会在当前目录生成性能日志文件json
以上命令会在项目根目录会生成 `isolate-xxxxxxx-v8.log` 格式的文件,这个log文件还不能直接进行分析,通常可视化工具都是要一个json文件。所以,log须要进行预处理,咱们能够这样预处理这个log:
node --prof-process --preprocess isolate-xxxxxxxxxx-v8.log > v8.json
这样就能够把它转为一个json字符串文件。api
方法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分析: