【问题标题】:Node.js + Redis memory leak. Am I doing something wrong?Node.js + Redis 内存泄漏。难道我做错了什么?
【发布时间】:2015-09-27 15:11:15
【问题描述】:
var redis = require("redis"),
client = redis.createClient();

for(var i =0 ; i < 1000000; i++){
    client.publish('channel_1', 'hello!');
}

代码执行后,Node进程消耗1.2GB内存并停留在那里; GC 不会减少分配的内存。如果我模拟 200 万条消息或 4x500000,节点会因内存错误而崩溃。

节点:0.8.*,后来尝试了 4.1.1,但没有任何改变
Redis:2.8,运行良好(分配了 1MB 内存)。

我的服务器每小时将发布超过 100 万条消息。所以这是绝对不能接受的(进程每小时崩溃一次)。

更新测试

var redis = require("redis"),
    client = redis.createClient();

var count = 0;
var x;

function loop(){
    count++;
    console.log(count);

    if(count > 2000){
        console.log('cleared');
        clearInterval(x);
    }
    for(var i =0 ; i < 100000; i++){
        client.set('channel_' + i, 'hello!');
    }

}

x = setInterval(loop, 3000);

这分配了 ~ 50Mb,峰值为 200Mb,现在 GC 将内存降回 50Mb

【问题讨论】:

  • 对于更真实的测试场景,我建议你做 10,000 条消息,setTimeout 几秒钟以允许垃圾收集完成它的事情,然后再做 10,000 条,等等......看看这是如何工作的。请记住,当您的 JS 正在执行时,垃圾收集不会运行,并且查看进程内存并不意味着 GC 没有完成它。垃圾收集器回收的内存不一定会返回给操作系统,它可能只是在 node.js 中标记为可供将来使用。
  • @jfriend00 好信息,谢谢。

标签: node.js memory-leaks redis node-redis


【解决方案1】:

如果您查看node_redis 客户端源代码,您将看到每个send 操作returns a boolean 指示命令队列是否已通过高水位线(默认为1000)。如果你要记录这个返回值(或者,启用redis.debug_mode),你很有可能会看到很多false——这表明你发送的请求太多了,Redis 无法同时处理所有请求.

如果事实并非如此,那么命令队列确实被定期清除,这意味着 GC 很可能是问题所在。

无论哪种方式,请尝试 jfriend00 的建议。无延迟地发送 1M+ 异步消息(所以基本上是一次)并不是一个好的测试。队列需要时间来清除,而 GC 需要时间来完成它的工作。

来源: Backpressure and Unbounded Concurrency & Node-redis client return values

【讨论】:

  • 通过一次发送1M,redis日志告诉我redis成功处理了所有消息。但是,我做了像@jfriend00 sad var redis = require("redis"), client = redis.createClient(); 这样的测试变量计数 = 0;变量 x;函数循环(){计数++;控制台.log(计数); if(count > 2000){ console.log('cleared');清除间隔(x); } for(var i =0 ; i
  • @AlexProh 很高兴听到您解决了记忆问题。你有什么理由从publish切换到set吗?您是否有特定的用例,或者您只是在测试 Redis 的一般性能?
  • Hoooly cow.... 我还以为是发布方法的问题,换成set,忘记带回来了。现在用发布测试。没关系。结果相同。
  • github.com/NodeRedis/node_redis/issues/870 node_redis 开发者的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
相关资源
最近更新 更多