sql >> Databasteknik >  >> NoSQL >> Redis

Node redis utgivare förbrukar för mycket minne

Det finns två frågor här.

Varför kräver programmet så mycket minne?

Jag tror att det beror på bristen på mottryck.

Ditt skript skickar bara 1M publiceringskommandon till Redis, men det bearbetar inget svar på dessa kommandon (som därför bara kasseras av node_redis). Eftersom det aldrig väntar på något svar, kommer skriptet att ackumulera mycket sammanhang i minnet för alla dessa kommandon. node_redis måste ha ett sammanhang för att hålla reda på kommandona och associera Redis-kommandon och svar. Node.js är snabbare att köa kommandon än systemet är att förmedla dessa kommandon till Redis, bearbeta dem, bygga svar och föra tillbaka svar till node.js. Sammanhanget växer därför, och det representerar mycket minne.

Om du vill hålla minnesförbrukningen på en acceptabel nivå måste du strypa ner koden för att ge node.js en chans att bearbeta Redis-svar. Till exempel bearbetar följande skript också 1M objekt, men det publicerar dem som partier med 1000 objekt och väntar på svaren var 1000:e artiklar. Den förbrukar därför väldigt lite minne (sammanhanget innehåller högst 1000 väntande kommandon).

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);

Kan minnet frigöras?

Vanligtvis kan det inte. Som alla C/C++-program använder node.js en minnesallokator. När minnet frigörs frigörs det inte till systemet, utan till minnesallokatorn. I allmänhet kan minnesallokatorn inte ge tillbaka det oanvända minnet till systemet. Observera att det inte är en läcka, för om programmet utför en ny allokering kommer minnet att återanvändas.

Att skriva ett C/C++-program som faktiskt kan frigöra minne till systemet innebär i allmänhet att utforma en anpassad minnesallokator. Få C/C++-program gör det. Utöver det inkluderar node.js en sophämtare med v8, så det borde sätta ytterligare begränsningar på policyn för minnesfrigöring.




  1. Hur kan jag hitta storleken på ett redis-ämne (underuppsättning av nycklar)?

  2. Importera en JSON-fil till MongoDB med mongoimport

  3. Validerar lösenord / bekräfta lösenord med Mongoose-schema

  4. mongodb markör-id inte giltigt fel