接入阿里云node.js性能平台
参考文档:https://help.aliyun.com/document_detail/60338.html?spm=a2c4g.11186623.6.548.47d22544YdCeIn
创建应用
在阿里云创建应用,使用阿里云账号登录,切换到 Node.js 性能平台控制台,或者直接打开 Node.js 性能平台 ,然后点击 创建新应用
按钮,如下图所示:
在弹出框内输入您的应用名称,点击提交,如下图所示:
创建应用成功后会展示出您创建的应用 App Id
以及 App secret
信息,如下图所示:
您需要保管好您应用的 App Id
和 App secret
信息,下面部署 Node.js 性能平台 runtime 的步骤中需要使用到它们。
部署 1. 安装 Node.js 性能平台运行时
Node.js 性能平台使用 tnvm
进行版本维护,采用如下命令安装 tnvm
。
wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash
wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash
将 tnvm
添加到系统命令。根据上面命令最后的提示,针对不同操作系统,进行手工操作。例如 linux 系统下
source ~/.bashrc
source ~/.bashrc
利用 tnvm 安装需要版本的运行时。请参考 Node.js性能平台运行时版本 选择合适的运行时版本。
查看远端版本
tnvm ls-remote alinode
tnvm ls-remote alinode
安装需要版本:版本对应关系
请根据版本对应关系,选择合适(与当前应用使用的 Node.js 版本一致)的 alinode 版本。
tnvm install alinode-vx.y.z(如tnvm install alinode-v4.7.0)
tnvm install alinode-vx.y.z(如tnvm install alinode-v4.7.0)
使用vx.y.z的运行时
tnvm use alinode-vx.y.z
tnvm use alinode-vx.y.z
2. 安装 agenthub
agenthub 是为 Node.js 性能平台的常驻代理服务,可以帮助执行一些监控和诊断的操作,并且它包含一组 Node.js 性能平台服务执行任务所需要的命令集合,Node.js 性能平台有且仅有执行这些命令的权限。
agenthub 同时是一个 npm 命令行工具,通过如下命令可以完成安装:
npm install @alicloud/agenthub -g
npm install @alicloud/agenthub -g
推荐阿里云用户使用 cnpm 安装任何 npm 模块
3. 配置和启动 agenthub
agenthub 需要一个配置文件来进行使用,agenthub 仅会在配置指定下的目录执行命令或读取日志。
极简配置
最简单的配置只需要传入 appid 和 secret 即可,格式如下:
{
"appid": "<YOUR APPID>",
"secret": "<YOUR SECRET>"
}
{
"appid": "<YOUR APPID>",
"secret": "<YOUR SECRET>"
}
其中您的应用 ID 和您的应用 Secret 请在应用设置
页面获取。将上述配置保存为 config.json
,完成配置后,请使用以下命令进行执行:
$ agenthub start config.json
$ agenthub start config.json
agenthub 将以常驻进程的方式执行,agenthub 运行日志文件为 ~/.agenthub.log
文件中。如果 agenthub 启动不成功,控制台将无法看到系统和进程详细信息,您可以以 DEBUG 方式启动 agenthub,查看 ~/.agenthub.log
日志来确定异常。
DEBUG=* agenthub start config.json
DEBUG=* agenthub start config.json
部署完成后,请访问 https://node.console.aliyun.com/ 查看您的应用详情。如果一切正常,稍等片刻(1分钟)即可收到你的应用性能数据。
详细配置
详细配置如下所示:
注意: logdir
应该与 启动应用 时设置的环境变量 NODE_LOG_DIR 的值一致。
{
"appid": "<YOUR APPID>",
"secret": "<YOUR SECRET>",
"logdir": "</path/to/your/log/dir>",
"error_log": [
"</path/to/your/error.log>",
"您的应用在业务层面产生的异常日志的路径",
"例如:/root/.logs/error.#YYYY#-#MM#-#DD#-#HH#.log",
"可选"
],
"packages": [
"</path/to/your/package.json>",
"可以输入多个package.json的路径",
"可选"
],
"disks": [
"/",
"/home/user"
"可选"
],
"agentidMode": "IP" “可选”
}
{
"appid": "<YOUR APPID>",
"secret": "<YOUR SECRET>",
"logdir": "</path/to/your/log/dir>",
"error_log": [
"</path/to/your/error.log>",
"您的应用在业务层面产生的异常日志的路径",
"例如:/root/.logs/error.#YYYY#-#MM#-#DD#-#HH#.log",
"可选"
],
"packages": [
"</path/to/your/package.json>",
"可以输入多个package.json的路径",
"可选"
],
"disks": [
"/",
"/home/user"
"可选"
],
"agentidMode": "IP" “可选”
}
-
error_log
配置完成后您可以在 Node.js 性能平台上看到规整后的错误日志信息; -
packages
配置完成后您可以看到项目的版本依赖,以及对应的安全风险提示; -
disks
配置需要监控的磁盘,可以在系统监控监控数据
查看; -
agentidMode
设置为IP
时,实例 ID 会添加部分 IP 信息,主要用于多个容器hostname
相同的场景。
配置中的#YYYY#、#MM#、#DD#、#HH#是通配符,如果您的异常日志是按时间生成的,请使用它。
Egg 集成部署如果您采用了 Egg.js 框架进行 web 开发,那么可以采用 Egg 框架提供的插件来进行部署。
1. 安装 runtime
有时候,同机会部署多个项目,期望多版本共存时,则可以把 runtime 安装到当前项目:
npm i nodeinstall -g nodeinstall --install-alinode ^4
221npm i nodeinstall -g
2nodeinstall --install-alinode ^4
nodeinstall
会把对应版本的alinode
安装到项目的node_modules
目录下。注意:打包机的操作系统和线上系统需保持一致,否则对应的 runtime 不一定能正常运行。
2. 安装 egg-alinode 插件
执行如下命令将 egg-alinode 依赖安装并保存到您的 Node.js 项目中:
npm i egg-alinode --save
npm i egg-alinode --save
3. 在 Egg 项目的 config/plugin.js 中启用此插件
// config/plugin.js
exports.alinode = {
enable: true,
package: 'egg-alinode'
};
// config/plugin.js
exports.alinode = {
enable: true,
package: 'egg-alinode'
};
4. 在 Egg 项目的 config/config.default.js 中添加配置
// config/config.default.js
exports.alinode = {
server: 'wss://agentserver.node.aliyun.com:8080',
appid: 'Node.js 性能平台给您的项目生成的 appid',
secret: 'Node.js 性能平台给您的项目生成的 secret',
logdir: 'Node.js 性能平台日志输出地址绝对路径,与 NODE_LOG_DIR 保持一致。如:/tmp/',
error_log: [
'您的应用在业务层面产生的异常日志的路径,数组,可选,可配置多个',
'例如:/root/.logs/error.#YYYY#-#MM#-#DD#.log',
'不更改 Egg 默认日志输出路径可不配置本项目',
],
agentidMode:'IP' '可选,如果设置,则在实例ID中添加部分IP信息,用于多个实例 hostname 相同的场景(以容器为主)'
};
// config/config.default.js
exports.alinode = {
server: 'wss://agentserver.node.aliyun.com:8080',
appid: 'Node.js 性能平台给您的项目生成的 appid',
secret: 'Node.js 性能平台给您的项目生成的 secret',
logdir: 'Node.js 性能平台日志输出地址绝对路径,与 NODE_LOG_DIR 保持一致。如:/tmp/',
error_log: [
'您的应用在业务层面产生的异常日志的路径,数组,可选,可配置多个',
'例如:/root/.logs/error.#YYYY#-#MM#-#DD#.log',
'不更改 Egg 默认日志输出路径可不配置本项目',
],
agentidMode:'IP' '可选,如果设置,则在实例ID中添加部分IP信息,用于多个实例 hostname 相同的场景(以容器为主)'
};
下面是参数含义及获取方式
- appid: 您的应用 id,在 Node.js 性能平台 控制台中应用的
设置
页面获取- secret: 您的应用 secret,在 Node.js 性能平台 控制台中应用的
设置
页面获取- logdir: 您使用 Node.js 性能平台提供的 runtime 运行 Node.js 项目生成的日志存放地点,和启动应用时设置的环境变量 NODE_LOG_DIR 的值保持一致,以绝对路径形式提供,默认为
/tmp/
- error_log: 您的 Node.js 项目生成的异常日志目录,Egg 在生产环境下默认会将 web 日志输出到
$HOME/logs/
目录下,如果您不更改 Egg 的日志输出配置,那么本字段默认即可,无需额外配置
使用示例:5. 使用 Node.js 性能平台提供的 runtime 启动 Egg 应用
egg-scripts start --daemon
egg-scripts start --daemon
观察监控指标
进入应用控制台,点击想查看的应用
实例
按钮,进入对应的实例即可查看 Node.js 性能平台提供的各种监控指标。概览
首先看到的是信息概览页面,如下图所示:
顶部导航栏展示服务器通用的一些信息,下面我们会对每一个栏目进行说明。
进程数据
进程存活时间线
进程存活时间线表示进程启动的一些基本信息,如下图所示:
如果有异常重启可以在这一栏一目了然地看到。
进程指标分布
这里主要展示 CPU & RSS 和 QPS & GC 占比的关系图,如下图所示:
查看当前进程的内核数据
点击左侧的
数据趋势
按钮即可查看当前进程的一些内核分析数据,如下图所示:这里能比较细致且直观地反映进程是否健康,比如堆整体信息一栏中堆内内存非常高那么很可能就是发生内存泄漏。
抓取性能数据进行分析
点击左侧的
堆快照
、堆时间线
、CPU Profile
、GC Trace
按钮,即可实现性能数据的抓取,对应的数据保存文件和分析操作在右侧导航栏的文件
一栏中进行,具体可以查看 故障诊断 一节。系统数据监控
本栏目展示服务器系统的一些通用信息指标,如下图所示:
异常日志
本栏目会对您在 runtime 与 agenthub 部署 一节中配置给 agenthub 的 error_log 属性对应的错误日志进行规整展示,如下图所示:
慢 Http 日志
本栏目会展示您的 web 应用比较慢的 Http 信息
模块依赖
本栏目会展示您的项目依赖的模块信息,如果有安全风险的版本也会给出对应的提醒,如下图所示:
故障诊断
注意:
所有诊断操作请顺序执行。一个操作未完成时进行下一个操作会提示操作失败。
文件
页面转储
按钮有效时表明操作已完成(诊断报告数秒可完成,堆快照根据堆大小可能数秒到数分钟,其他操作持续时间为 3 分钟)。抓取性能数据
进入应用控制台,点击想查看的应用
实例
按钮,进入对应的实例即可查看 Node.js 性能平台提供的抓取性能数据
功能,如下图所示:一般来说,如果涉及到内存泄漏的,可以抓取 堆快照,如果是 CPU 异常飙高的,可以抓取 CPU Profile 数据,下面我们以一个 CPU 异常飙高和内存泄漏的例子来看下如何使用 Node.js 性能平台提供的故障诊断功能。
CPU 异常飙高
发生 CPU 异常飙高时,点击上图中的 CPU Profile 按钮,会在线生成三分钟的 CPU Profile 的日志文件,点击导航栏左侧的
文件
选项,即可看到刚才生成的 CPU Profile 文件,转储至云端后如下图所示:Node.js 性能平台提供了两种分析 CPU Profile 的工具,下面逐一介绍:
火焰图
点击上图中的第一个
分析
按钮,则进入火焰图分析,如下图所示:很明显,profiling 期间用户编写耗时比较大的函数为 test.js 中的 slow 函数,占据了整个 profiling 时长的 75.5%,所以接下来我们只要去对 slow 函数进行优化就可以了。
devtools
点击上图中的第二个
分析
按钮,则进入 devtools 分析,如下图所示:同样,slow 函数执行耗费最久,显然需要优化
内存泄漏
发生内存泄漏时,点击第一节图中的
堆快照
按钮,会在线把当前进程的堆结构 dump 成文件,点击导航栏左侧的文件
选项,即可看到刚才生成的堆快照文件,转储至云端后如下图所示:同样提供了两种分析方式,下面逐一介绍:
MAT 分析
点击上图中的第一个
分析
按钮,则进入 MAT 分析,如下图所示:可以看到,泄漏点是 test-alinode.js 文件中的一个 array 数组
devtools 分析
devtools 分析功能和 chrome 自带的体验一致,如下图所示:
<wiz_tmp_tag id=”wiz-table-range-border” contenteditable=”false” style=”display: none;”>