我是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;
什么原因呢
@mosaic101 我的代码是在插库返回成功之前返回的请求,也就是说没有等到插库操作执行完就返回结果了。如果压力上去以后,就会挤压一大堆异步操作,内存就爆炸了。
@Treagzhao 跟我之前一个同事一个问题,(^o^)/
@Treagzhao 即使是这样的话貌似也没有解决根本上的问题啊 无论是提前返回还是之后返回都会挤压一大堆异步任务啊
@showen 不会啊,压测的原理是你前一个请求返回了后一个请求才会发起。实际情况是我把返回语句写在插库之后,随着压力增大,返回的响应时间变长了,但是服务趋于稳定,内存也没有爆炸性增长。
@Treagzhao 好吧 这样测试能正在测出来并发?
找到原因也不说一下原因是什么?
@xZGit 啊,我回复了一楼,是说我回复他另外的人看不到么?我是cnode的新人,不太清楚,不好意思。
我的代码是在插库返回成功之前返回的请求,也就是说没有等到插库操作执行完就返回结果了。如果压力上去以后,就会挤压一大堆异步操作,内存就爆炸了。
你的并发高了之后,写入的速度跟不上,导致数据在内存中堆积。改进建议:
- 先要了解你数据库的写入TPS能到多少。
- 如果并发写入的速度低于数据库的极限,那可能是排队所需的内存不足,可以设置max_old_space_size来 增大老生带空间大小。
@JacksonTian 应该不是写入速度的问题,因为我们公司的运维一直在监控mysql机器的性能,离性能瓶颈差着十万八千里
还没共享下答案😄,这也是典型的队列消费不及时吧, 短时间内堆积的请求过多?
@ncuzp 酱紫啊,我查一查这一类问题的通用解决方案,谢谢啦。
关注后续答案,