当前位置: 首页 > 面试题库 >

节点Redis发布者占用过多内存

宋经赋
2023-03-14
问题内容

我使用node_redis库在node中编写了一个小的redis发布者。程序完成发布1M消息后,它将继续容纳约
350 MB 的内存。谁能提供任何线索说明该程序为何需要这么多的内存以及如何释放内存?

以下是代码段-

var redis = require("redis"),
    publisher = redis.createClient();
    var i = 0;
    for (;;) {
        publisher.publish("rChat", i);
        i++;
        if (i == 1000000) {
            console.log("stopped sending messages");
            setTimeout(function(){publisher.end();},1000);
            break;
        }
    }
    setTimeout(function() {
            console.log("Keeping console alive");
        }, 1000000);

问题答案:

这里有两个问题。

为什么程序需要这么多的内存?

我认为这是由于缺乏反压力。

您的脚本仅向Redis发送1M发布命令,但不处理对这些命令的任何答复(因此,它们仅由node_redis丢弃)。因为它从不等待任何答复,所以脚本将为所有这些命令在内存中累积大量上下文。node_redis需要保持上下文以跟踪命令,并关联Redis命令和答复。Node.js排队命令的速度比系统将这些命令传送到Redis,对其进行处理,构建回复并将回复传送回node.js的速度要快。因此,上下文正在增长,它代表了大量的内存。

如果要将内存消耗保持在可接受的水平,则需要降低代码速度,以便有机会让node.js处理Redis答复。例如,以下脚本也处理1M个项目,但它将它们作为1000个项目的批次发布,并等待每1000个项目的答复。因此,它只占用很少的内存(上下文最多包含1000个待处理的命令)。

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

function loop( callback ) {
   var count = 0;
   for ( i=0 ; i < 1000; ++i ) {
        publisher.publish("rChat", i, function(err,rep) {
        if ( ++count == 1000 )
            callback();
        });
   }
}

function loop_rec( n, callback ) {
    if ( n == 0 ) {
        callback();
        return;
    }
    loop( function() {
        loop_rec( n-1, callback );
    });
}

function main() {
    console.log("Hello");
    loop_rec(1000, function() {
        console.log("stopped sending messages");
        setTimeout(function(){publisher.end();},1000);
        return;
    });
}

publisher.ping(main)

setTimeout(function() {
    console.log("Keeping console alive");
}, 1000000);

可以释放内存吗?

通常,它不能。作为所有C / C
++程序,node.js使用内存分配器。释放内存后,它不会释放到系统,而是释放到内存分配器。通常,内存分配器无法将未使用的内存返还给系统。请注意,这不是泄漏,因为如果程序执行新的分配,则内存将被重用。

编写实际上可以向系统释放内存的C / C 程序通常涉及设计自定义内存分配器。很少有C / C

程序可以做到这一点。最重要的是,node.js包括一个带有v8的垃圾收集器,因此它应该对内存释放策略施加其他约束。



 类似资料:
  • 问题内容: Tomcat 5.5.x和6.0.x Grails 1.6.x Java 1.6.x OS CentOS 5.x(64位) VPS服务器,内存为384M JAVA_OPTS:尝试了许多组合-包括以下内容 出口JAVA_OPTS =’-Xms128M -Xmx512M -XX:MaxPermSize = 1024m’ 导出JAVA_OPTS =’-server -Xms128M -Xmx

  • 问题内容: 我目前正在HashSet中存储单词列表(大约120,000个),目的是用作列表来检查所迷惑的单词以查看其拼写是否正确,并仅返回yes或no。 我想知道是否有一种方法可以占用更少的内存。当前120,000个单词约为12兆字节,从中读取单词的实际文件约为900 kb。 有什么建议? 提前致谢 问题答案: 查看布隆过滤器或布谷鸟哈希。布隆过滤器或cuckoo-hashing?http://c

  • 有一个基本示例,它对1个消费者起作用。它接收消息。但是添加一个额外的消费者将被忽略。 consumer2的“22”事件从未引发问题。如果我使用命令行工具检查该主题,则该主题的数据存在

  • 内核抢占点 调度本质上体现了对CPU资源的抢占。对于用户进程而言,由于有中断的产生,可以随时打断用户进程的执行,转到操作系统内部,从而给了操作系统以调度控制权,让操作系统可以根据具体情况(比如用户进程时间片已经用完了)选择其他用户进程执行。这体现了用户进程的可抢占性(preemptive)。但如果把ucore操作系统也看成是一个特殊的内核进程或多个内核线程的集合,那ucore是否也是可抢占的呢?其

  • 本文向大家介绍基于redis key占用内存量分析,包括了基于redis key占用内存量分析的使用技巧和注意事项,需要的朋友参考一下 Redis的指令看不出哪一类型的key,占用了多少内存,不好分析redis内存开销大的情况下,各应用程序使用缓存的占比。 借助第3方工具进行分析 1、采用2个工具结合 redis-rdb-tools+sqlite 2、sqlite linux服务器都会自带,安装r

  • 我正在使用框架用iPhone摄像头捕捉视频,我的代码: 在之前,一切都很顺利,内存被限制在3M,但在之后,内存使用量每秒增加0.06M,几分钟后,应用程序会因为内存警告而崩溃。似乎占用了太多内存,并且可能存在内存泄漏问题。 那么如何减少内存使用量呢? iOS版本:7.1.1