参考:

Node.js 应用故障排查手册
Node.js 调试指南
记一次Node.js直出服务的性能优化 (京东社交电商前端)
Node.js 应用故障排查手册 —— 正确打开 Chrome devtools
腾讯课堂node性能优化实践
基于阿里云的 Nodejs 稳定性实践
唯快不破:高效定位线上Node.js应用内存泄漏
Node.js 性能平台-博客

1 工具:

1.1 clinic

https://clinicjs.org/doctor/ (只支持单进程,egg用不上)
image.png

1.2 阿里云nodejs性能平台

alinode runtime 兼容社区版nodejs,提供系统监控等功能
egg+alinode(egg文档)

1.3 v8-profiler-next

按文档生成cpu-profile,使用chrome devtools,加载load生成的cpu-profile
image.png
如图分析一次请求中各个函数消耗的时长
image.png

1.4 —inspect开启调试模式

打开chrome://inspect/#devices,
找到调试链接, 在profiler 面板就可以开始记录
image.png

1.5内存

利用堆快照,可以看出压测前后内存占用基本回归,说明不存在内存泄漏(out of memory)问题
image.png
造成内存泄漏的例子:每次请求处理都会网往数组里push
image.png
image.png
node占用电脑内存,压测后排到第一,当请求越来越多,内存肯定会泄漏
image.png
在云服务器上+alinode测试,
image.png
image.png

image.png
image.png
image.png

image.png

image.png

2 部署方式:

单机:边缘应用

单机多进程:高可用
nginx(反向代理) + 单机多进程(pm2)
image.png

集群:

3 案列

基于Node.js的苏宁电商核心业务实践

3.1 开启ejs模板缓存

image.png
image.png

3.2 优先路由匹配

image.png

3.3 更少中间件

image.png

3.4 inclued缓存

image.png

3.5 严格包管理

image.png

3.6 pm进程管理和发布

image.png

4 优化

具体参考:
38 | 性能工具:Node.js性能分析工具(极客时间-nodejs实战)
image.png
比如模板开启缓存,提前读取文件

  1. // 优化后:提前读取文本到内存
  2. const data = fs.readFileSync(__dirname + '/source/index.htm')
  3. app.use(
  4. mount('/', async (ctx) => {
  5. // 可优化前:这样导致每次请求都会读取
  6. ctx.body = fs.readFileSync(__dirname + '/source/index.htm')
  7. })
  8. );

比如 直接设置响应为buffer,避免node再转换成buffer

  1. const buffer = fs.readFileSync(__dirname + '/source/index.htm')
  2. app.use(
  3. mount('/', async (ctx) => {
  4. ctx.type = "html"
  5. ctx.body = buffer
  6. })
  7. );

image.png
优化后,qps提升巨大
image.png
静态资源
可以使用nginx,其并发性能高于node框架的静态资源处理,同时减少node请求
也可以使用CDN

依赖其他第三方服务,非实时性接口可以加redis缓存

image.png

5 备注

v8-profile-next这个包需要编译,在centos上会报错
g++: command not found的解决
image.png
image.png