记录解决让人崩溃的nuxt服务端内存溢出

2,246 阅读2分钟

第一次JMeter压力测试

lQLPJxZY7TvDvuvNAbnNBe6w_nU3opRRN-0CksOIv8C7AA_1518_441.png

短短的一分多钟,就开始出现大量的error

image.png

一查看,所有的请求502并且node 服务器已经停止工作了。

查看阿里云的监控,发现有一段时间内,cpu接近100%,然后急剧下降,初步分析可能是在error的时候,node 不工作了,所有cpu直接降到正常值了。如下图:

image.png

内存使用率确一直再正常值范围内?这让我很困惑,js会导致cpu飙升?

在项目里寻找会导致cpu飙升的死循环,未发现。于是开始了各种寻找cpu飙升的原因,还是未发现。

这时候我给了自己一个假设,如果是内存飙升,导致cpu飙升呢?

然后我重新部署了一个服务。添加了pm2

pm2来监测一下服务的内存cpu

image.png

短短不到30s 我就看到我的内存飙升到了400多M 每台,没多久阿里云检测上cpu接近100%,然后一瞬间所有的node服务内存降至初始100多M

这时候jmetererror 就开始大量产生,node服务就被强制停止。控制台抛出一个错误,内存不足分配,这个时候,我想大概找到真正的原因了。

就是内存导致的cpu飙升。

但是真正让node服务502就是因为内存导致的服务被重启,在重启的这段时间里无法访问

cpu飙升是内存溢出导致,而不是因为cpu飙升导致服务无法访问。

于是,开始了寻找内存溢出的问题了,首先我搜索了项目里所有的定时器延时器等一系列寻找客户端会导致内存溢出的代码,一顿改。

继续jmeter测试,结果却仍然和之前一样。

裂开了...

想了很久我开始第二次尝试。

把项目里所有的vue.use(xxx) vue.component(xxx) 全部注释。

继续jmeter的压力测试。

打开pm2监控。

打开了jmeter

image.png

看到稳定的运行了10分钟。没用error,内存也是有升有降。

泪奔了~

总结

客户端的内存溢出其实并不会导致服务器挂掉,但是客户端内存溢出的东西如果在服务端执行了,那么就会导致服务器挂掉。举个例子,如果一个vue.use(xxx)在客户端会导致内存增长1M。那么在服务端1s一次的并发,在1min内可能就直接会导致服务器内存溢出了