CNode

Node-Orm2框架,高并发状态下导致内存暴涨的问题[已找到原因]

问答
TTreagzhao发布于10 年前最后回复10 年前14 回复7681 浏览0 收藏

我是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)

M
mosaic101#1·10 年前

什么原因呢

T
Treagzhao#2·10 年前
引用 mosaic101什么原因呢

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

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

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

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

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

X
xZGit#7·10 年前

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

T
Treagzhao#8·10 年前
引用 xZGit找到原因也不说一下原因是什么?

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

T
Treagzhao#9·10 年前

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

J
JacksonTian#10·10 年前

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

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

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

T
Treagzhao#13·10 年前
引用 ncuzp还没共享下答案😄,这也是典型的队列消费不及时吧, 短时间内堆积的请求过多?

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

B
blackjack#14·10 年前

关注后续答案,

参与回复
登录后即可参与回复。登录