Node 服务内存告警,如何限制node服务的内存占用,node按内存自动重启

Node 服务内存告警,如何限制node服务的内存占用,node按内存自动重启

  • 问题排查
    • 使用postman并发请求
    • 分析
    • 解决方案
      • 1. 首先需要了解下pm2的一些基础命令
      • 2. 编写启动脚本
      • 3. 启动服务并观察

记一次生产环境内存告警问题
有一个专门用来画图的nodejs服务器, 一直一下运作得都好好的(通过pm2守护node的运行0, 今天突然收到这个服务所在的服务器的内存告警, 故又如下排查

问题排查

机器环境是8g的运行内存, centos服务器, 只部署了这一个应用, 按理说应该足够了, 我看了下每次请求才占用10几m的内存

使用postman并发请求

postman可以将整个collection中的接口打包发送, 并设置延时和重复次数
Node 服务内存告警,如何限制node服务的内存占用,node按内存自动重启_第1张图片

分析

发现内存占用并不高, 我并发了100个请求, 内存也就占用不到2g, 想着会不会是别的什么操作导致的内存告警…
过了一会发现问题了, 我请求完成后内存占用并没有下来, 闲置了几分钟发现还是这样

网上查询发现, node使用的v8引擎是基于浏览器使用的, 正常情况下并不会占用这么多的内存, 最主要的是没有主动的内存释放操作…

解决方案

找到问题所在就好办了, 不会主动释放内存, 那就只好人工手动释放了

研究发现可以利用pm2来管理node服务的内存

pm2 有个0秒停机重载的机制, 重启服务连接不会丢

1. 首先需要了解下pm2的一些基础命令

  • pm2 start xxx: 启动xxx
  • pm2 list: 列出所有pm2管理的进程(包裹中止和异常的)
  • pm2 log: 查看启动系统的滚动日志
  • pm2 monit: 监视器可以看到服务的资源占用, 日志等

2. 编写启动脚本

启动交不了是json格式的文件, 取名为startNode.json

[{
  "name": "nodejs 画图服务",
  "args": "",
  "script": "./post.js",
  "exec_interpreter": "/usr/local/bin/node",
  "exec_mode": "fork",
  "max_memory_restart": "400M"
}]

3. 启动服务并观察

使用命令以配置文件的设置启动
pm2 start startNode.json
Node 服务内存告警,如何限制node服务的内存占用,node按内存自动重启_第2张图片
再开200个请求模拟发现当内存超过一定阈值就会重启(也不是刚好400m会超过一些), 然后内存就释放
Node 服务内存告警,如何限制node服务的内存占用,node按内存自动重启_第3张图片

你可能感兴趣的:(前端)