Node-Orm2框架,高并发状态下导致内存暴涨的问题[已找到原因]
发布于 5 个月前 作者 Treagzhao 1421 次浏览 最后一次编辑是 4 个月前 来自 问答

我是node新人一枚,刚刚开始接触node服务。看网上说现在比较流行的orm框架是sequelize和orm2,于是就选了orm2试了一下。昨天让公司的同事给我进行了一次压力测试。单表出入单条数据的接口,tps在1400左右的时候,服务非常稳定,内存保持在70M左右稳定不动。但是当压力增加到1500左右的时候,内存开始持续爆炸性增长,最终会达到1.4G,然后被强制杀进程。我想知道有什么办法可以防止node-orm2框架这种内存爆炸性增长的现象?

代码如下,框架用的是express4,数组里只有一条数据。

function saveData(app) {
    app.post("/errorlog/saveData.re", function(req, res, next) {
        'use strict';
        var params = req.body;
        var list = JSON.parse(params.items);
        //console.log("插入之前耗时:"+(+new Date() - startTime));
        for (let i = 0,
                len = list.length; i < len; i++) {
                let item = list[i];
                item.receive = false;
                item.detail = JSON.stringify(item);
        }
        bean.Message.create(list, function(err, data) {});
        //console.log("插入耗时:"+(+datebaseEndDate - datebaseDate));
        res.send("aaaa");

    });
};

module.exports = saveData;
14 回复

@mosaic101 我的代码是在插库返回成功之前返回的请求,也就是说没有等到插库操作执行完就返回结果了。如果压力上去以后,就会挤压一大堆异步操作,内存就爆炸了。

@Treagzhao 跟我之前一个同事一个问题,(^o^)/

@Treagzhao 即使是这样的话貌似也没有解决根本上的问题啊 无论是提前返回还是之后返回都会挤压一大堆异步任务啊

@showen 不会啊,压测的原理是你前一个请求返回了后一个请求才会发起。实际情况是我把返回语句写在插库之后,随着压力增大,返回的响应时间变长了,但是服务趋于稳定,内存也没有爆炸性增长。

@Treagzhao 好吧 这样测试能正在测出来并发?

找到原因也不说一下原因是什么?

@xZGit 啊,我回复了一楼,是说我回复他另外的人看不到么?我是cnode的新人,不太清楚,不好意思。

我的代码是在插库返回成功之前返回的请求,也就是说没有等到插库操作执行完就返回结果了。如果压力上去以后,就会挤压一大堆异步操作,内存就爆炸了。

你的并发高了之后,写入的速度跟不上,导致数据在内存中堆积。改进建议:

  1. 先要了解你数据库的写入TPS能到多少。
  2. 如果并发写入的速度低于数据库的极限,那可能是排队所需的内存不足,可以设置max_old_space_size来 增大老生带空间大小。

@JacksonTian 应该不是写入速度的问题,因为我们公司的运维一直在监控mysql机器的性能,离性能瓶颈差着十万八千里

还没共享下答案😄,这也是典型的队列消费不及时吧, 短时间内堆积的请求过多?

@ncuzp 酱紫啊,我查一查这一类问题的通用解决方案,谢谢啦。

关注后续答案,

回到顶部