美文网首页
再记录一次nodejs内存溢出分析

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

作者: lxg1986 | 来源:发表于2019-10-02 22:12 被阅读0次

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

前言

用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的代码了。

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

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

相关文章

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

    欢迎访问我的最佳实践网站 前言 用nodejs做服务端渲染是目前主流的web服务器架构,服务端渲染的最大特点就是i...

  • angular打包报错内存溢出 nodejs 执行失败报错 “J

    报错信息很直观地指出是内存溢出了。是什么导致了内存溢出呢?其根本原因在于 nodejs 默认限制了最大可使用的内存...

  • JVM学习系列学习七

    5:实战:内存溢出的定位与分析 内存溢出在日常工作中,这个错误很容易遇到。遇到内存溢出,首先我们需要快速定位内存溢...

  • Memory Analyzer

    Memory Analyzer用来分析内存溢出dump日志

  • 内存优化

    内存优化主要是分析内存泄露和内存溢出。将从内存是怎么分配,内存怎么出现泄露和溢出,用工具判断什么情况出现泄露,找出...

  • Java开发

    JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析Java - 注解详解 详细介绍 ...

  • JVM架构和GC垃圾回收机制详解

    原文JVM架构图分析 下图:参考网络+书籍,如有侵权请见谅(想了解Hadoop内存溢出请看:Hadoop内存溢出(...

  • iOS 项目性能分析(用Xcode进行内存分析)

    项目中的性能分析分为两种 先解释一下什么内存泄漏和内存溢出 内存泄漏:该释放的时候没有释放内存溢出:简单说就是内存...

  • Android 内存泄漏分析

    Android 内存泄漏分析 Hi,这几天应用内存溢出了,所有我学习了下内存溢出相关的知识点,以下的知识点都来自网...

  • JAVA内存溢出分析

    开发多年,最近2年,经常遇到其他同行或者别的项目组在业务测试环境上,甚至还有的在生产环境上出现(多数是后台管理系统...

网友评论

      本文标题:再记录一次nodejs内存溢出分析

      本文链接:https://www.haomeiwen.com/subject/yssbyctx.html