前言
用nodejs做服务端渲染是目前主流的web服务器架构,服务端渲染的最大特点就是isomorphic
,也就是服务端代码和客户端代码是共用的。这给js的开发者带来一个大的挑战就是我们平时不注意的一些习惯就会导致客户端代码运行到服务端,就会导致内存释放不了。比如某个全局变量在浏览器里一个窗口里运行,没任何问题,但是如果在后端并发下,就有很大的可能性导致内存溢出。下面请开始我们的表演。
准备工作
- 为了快速搭建出服务端渲染的业务场景,我们使用的是
nextjs+express
作为我们的基础框架,当然我们也可以自己做一个服务端渲染的框架,传送门走起 - 为了更好的模拟线上环境,我们采用docker,来一段
Dockerfile
的写法,
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"]
- 附录一段
docker-compose.yml
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
- 附录上一段
package.json
{
"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的代码了。

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

模拟内存溢出场景
首先我们选择我们的压测命令,这里推荐使用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

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