nodejs 2020-07-02 15:09:52

创建应用

公司可以使用RAM账号保护账号安全性 查看具体RAM账号创建方法

  1. 在阿里云创建应用,使用阿里云账号登录,切换到 Node.js 性能平台控制台,或者直接打开 Node.js 性能平台 ,然后点击 创建新应用。
  2. 创建应用成功后会展示出您创建的应用 App Id 以及 App secret 信息

部署runtime与agent

安装Node.js性能平台运行时

Node.js 性能平台使用 tnvm(类似nvm) 进行版本维护,采用如下命令安装 tnvm。

wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash

将 tnvm 添加到系统命令。根据上面命令最后的提示,针对不同操作系统,进行手工操作。例如 linux 系统下

source ~/.bashrc

利用 tnvm 安装需要版本的运行时。请参考 Node.js性能平台运行时版本 选择合适的运行时版本。
查看远端版本

tnvm ls-remote alinode

安装需要版本:
<font color=red>请根据版本对应关系,选择合适(与当前应用使用的 Node.js 版本一致)的 alinode 版本。</font>

tnvm install alinode-vx.y.z

使用vx.y.z的运行时

tnvm use alinode-vx.y.z

安装agenthub

agenthub 是为 Node.js 性能平台的常驻代理服务,可以帮助执行一些监控和诊断的操作,并且它包含一组 Node.js 性能平台服务执行任务所需要的命令集合,Node.js 性能平台有且仅有执行这些命令的权限。
agenthub 同时是一个 npm 命令行工具,通过如下命令可以完成安装:

npm install @alicloud/agenthub -g

配置和启动 agenthub

agenthub 需要一个配置文件来进行使用,agenthub 仅会在配置指定下的目录执行命令或读取日志。

极简配置 最简单的配置只需要传入 appid 和 secret 即可,格式如下:

{
  "appid": "<YOUR APPID>",
  "secret": "<YOUR SECRET>"
}

其中您的应用 ID 和您的应用 Secret 请在应用设置页面获取。将上述配置保存为 config.json ,完成配置后,请使用以下命令进行执行:

$ agenthub start config.json

启动应用

使用安装好的 Node.js 性能平台的 runtime 启动并监控应用。

直接启动应用
NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES node app.js
使用pm2管理的应用
NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES pm2 start app.js

<span id='pm2'>使用 pm2 管理的应用如何使用 Node.js 性能平台运行时</span>

  • 如果安装 Node.js 性能平台运行时前系统已经安装社区 Node.js 运行时和 pm2 :
    • 安装 Node.js 性能平台运行时后重新安装 pm2,确保 which pm2 结果中包含 .tnvm 字段;

      npm install pm2 -g
      
    • 将 pm2 所有进程杀掉,尤其是其守护进程 PM2 v0.15.8: God Daemon 不能漏掉;

      pm2 kill
      ps -ef | grep pm2
      kill -9 <pid>
      
    • 重新用 pm2 启动应用。

      $ ENABLE_NODE_LOG=YES pm2 start app.js
      

卸载tnvm

要移除、删除或者卸载tnvm,只需要移除~/.tnvm, ~/.npm, and ~/.bower文件夹

观察监控指标

更新runtime版本

常见问题

1. 无法正常监控

绝大部分是因为使用了非alinode启动应用。 由于自己用的pm2自动部署,主要启动命令:

pm2 startOrRestart ecosystem.config.js --env production

通过pm2 ecosystem.config.js的post-deploy自动部署远程应用,<font color=red>相当于每次都会打开新的shell终端(同nvm,只要新起shell就会使用默认的node版本),导致shell使用的node版本一直是系统默认的Node.js版本。</font>

解决:在部署应用之前,切换node版本为alinode

'post-deploy': 'tnvm use alinode-v5.13.0 && npm run start'

2. 异常日志为空

阿里监控后台只返回最近24小时的异常日志

3. node传参一直是undefined

"start": "yarn install && cross-env NODE_LOG_DIR=/tmp/alinode ENABLE_NODE_LOG=YES NODE_ENV=production npm run combine",
"combine": "npm run build && which node && npm run server",
"server": "pm2 startOrRestart ecosystem.config.js --env production",
"build": "node ./build/scripts/build.js",

app.js

console.log('app process.env.NODE_ENV:', process.env.NODE_ENV, process.env.NODE_LOG_DIR, process.env.ENABLE_NODE_LOG);

本地npm start传参都能正常获取到

{"message":"app process.env.NODE_ENV: production /tmp/alinode YES\n","timestamp":"2020-09-11 19:26 +08:00","type":"out","process_id":1,"app_name":"alfred"}

一到服务器上,NODE_LOG_DIR一直是undefined

{"message":"app process.env.NODE_ENV: production undefined YES\n","timestamp":"2020-09-11 19:19 +08:00","type":"out","process_id":1,"app_name":"alfred"}

解决方法: pm2删除当前进程,再重新启动

pm2 delete <yourapp>

到最后虽然app.js接收到了NODE_LOG_DIR,监控平台依然获取不到。。。
作为一个有追求的开发,不能就此罢休。 看到文档中有这么句话 ==将 pm2 所有进程杀掉,尤其是其守护进程 PM2 v0.15.8: God Daemon 不能漏掉;== 将全部pm2进程杀掉包括守护进程(使用 pm2 管理的应用如何使用 Node.js 性能平台运行时),然后重新用pm2启动应用,可以正常运行监控

image

监控常用名词

Apdex

应用性能指标

Node.js 性能平台根据 HTTP 的响应时间 RT 来定义用户满意度(默认响应时间 100ms):

  • satisfied(满意):RT <= T
  • tolerating(容忍):T < RT < 4 * T
  • frustrated(失望):RT > 4 * T
  • 计算方式: satisfied + tolerating / 2
  • 举例来说:
    • 每分钟 satisfied 的 HTTP 请求为 60%,tolerating 的为 30%,frustrated的为 10%
    • 那么 Apdex = 0.6 + 0.3 / 2 = 0.75

Shallow Size

指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存, 注意不包括它引用的其他实例

计算公式:

Shallow Size = [类定义] + 父类fields所占空间 + 自身fields所占空间 + [alignment]
  • 类定义是指, 声明一个类本身所需的空间, 固定为8byte, 也就是说, 一个不包含任何fields的类的'空类', 也需要占8byte; 另外类定义空间不会重复计算, 就是说, 即使类继承其他类, 也只算8byte
  • 父类fields所占空间, 对于继承了其他类的类来说, 父类声明的fields显然需要占用一定的空间
  • 自身fields所占空间, 所有fields所占空间之和; fields分基本类型和引用, 基本类型所占空间和系统有关, 例如在32位系统中int=4byte, 64位系统中int=8byte; 引用固定占4byte, 例如String name;这个变量声明占4byte.
  • alignment是指位数对齐, 会让总空间为8的倍数, 例如某个A类, 以上3项计算出来为15byte, 那么为了对齐, 让它是8的倍数, 会取最接近的值, 所以它的Shallow Size是16byte;

Retained Size

实例A的Retained Size是指当实例A被回收时, 可以同时被回收的实例的Shallow Size之和

阿里云RAM账号申请

RAM 用户是一个身份实体,它通常代表您的组织中需要访问云资源的人员或应用程序。 https://ram.console.aliyun.com/users

通常的操作步骤如下:

  1. 创建用户,并为用户设置登录密码(用户登录控制台场景)或创建 AccessKey(应用程序调用 API 场景)。 image
  2. 添加用户到用户组(需要先创建用户组并完成对用户组的授权)
    新增alinode用户组:Node.js性能平台-子账号授权 image

参考资料

  1. https://help.aliyun.com/knowledge_detail/60418.html?spm=a2c4g.11186623.2.10.674a2927hQQ3Vs
  2. https://help.aliyun.com/knowledge_detail/60902.html?spm=a2c4g.11186623.2.10.1fb628cdlQcqI9
  3. tnvm
  4. Shallow Size和Retained Size详解
  5. 关于Nodejs的性能监控思考?