[英]Node redis publisher consuming too much memory
我使用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的垃圾收集器,因此它應該對內存釋放策略施加其他約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.