再记录一次nodejs内存溢出分析

2019-10-02  本文已影响0人  lxg1986

欢迎访问我的最佳实践网站

前言

用nodejs做服务端渲染是目前主流的web服务器架构,服务端渲染的最大特点就是isomorphic,也就是服务端代码和客户端代码是共用的。这给js的开发者带来一个大的挑战就是我们平时不注意的一些习惯就会导致客户端代码运行到服务端,就会导致内存释放不了。比如某个全局变量在浏览器里一个窗口里运行,没任何问题,但是如果在后端并发下,就有很大的可能性导致内存溢出。下面请开始我们的表演。

准备工作

FROM node:10

ENV LANG=C.UTF-8

WORKDIR /home/App

COPY package.json .
COPY yarn.lock .
RUN yarn install

COPY . .

RUN yarn build

EXPOSE 80 

CMD ["yarn", "start"]
version: '1'

services:
  server:
    build: .
    env_file:
      - .env
    environment:
      - NODE_ENV=production
    ports:
      - 3000:3000
      - 9222:9222
    command: node --inspect=0.0.0.0 server.js

{
  "version": "1.0.0",
  "scripts": {
    "dev": "node server.js",
    "build": "next build",
    "start": "cross-env NODE_ENV=production node server.js"
  },
  "dependencies": {
    "express": "^4.14.0",
    "next": "latest",
    "react": "^16.7.0",
    "react-dom": "^16.7.0"
  },
  "devDependencies": {
    "cross-env": "^5.2.0"
  }
}

启动服务

# 项目根目录下执行此命令,生成docker image
docker build . 

# 启动服务,注意我们导出的端口号,9222是nodejs默认调试端口
docker-compose up -d

浏览器调试

这时候,我们使用Chrome浏览器打开 http://localhost:3000 打开debug窗口,我们会看到有一个nodejs的小图标亮起来了,说明你的浏览器的debug模式已经可以调试node server的代码了。

image.png
点击被点亮的小图标,我们进入了node server 的debug模式了。
image.png

模拟内存溢出场景

首先我们选择我们的压测命令,这里推荐使用Siege,Mac下安装 brew install siege
siege --help可以查看到压测参数,贴出常用的几个来

-c 200 指定并发数200
-r 5 指定测试的次数5
-f urls.txt 制定url的文件
-i internet系统,随机发送url
-b 请求无需等待 delay=0
-t 5 持续测试5分钟
-r和-t一般不同时使用

开始我们的压测:

// 并发200 持续5分钟
siege -c 200 -t 5 localhost:3000
image.png

像这种蓝色的很长时间没有消失的,就有可能存在内存溢出的可能性,将鼠标滑块拖拽到此区域,下方展示的就可能定位到泄露点。当然也要有足够的耐心,一点点分析。

上一篇 下一篇

猜你喜欢

热点阅读