sql >> Database teknologi >  >> NoSQL >> Redis

Node redis-udgiver bruger for meget hukommelse

Der er to spørgsmål her.

Hvorfor kræver programmet så meget hukommelse?

Jeg tror, ​​det skyldes det manglende modtryk.

Dit script sender bare 1M publiceringskommandoer til Redis, men det behandler ikke noget svar på disse kommandoer (som derfor bare kasseres af node_redis). Fordi det aldrig venter på noget svar, vil scriptet akkumulere en masse kontekst i hukommelsen for alle disse kommandoer. node_redis skal holde en kontekst for at holde styr på kommandoerne og tilknytte Redis-kommandoer og -svar. Node.js er hurtigere til at sætte kommandoer i kø, end systemet er til at overføre disse kommandoer til Redis, behandle dem, bygge svar og sende svar tilbage til node.js. Konteksten vokser derfor, og den repræsenterer meget hukommelse.

Hvis du vil holde hukommelsesforbruget på et acceptabelt niveau, skal du skrue ned for din kode for at give node.js mulighed for at behandle Redis-svar. For eksempel behandler følgende script også 1M elementer, men det udgiver dem som batches af 1000 elementer og venter på svarene for hver 1000 elementer. Det bruger derfor meget lidt hukommelse (konteksten indeholder højst 1000 ventende kommandoer).

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 hukommelsen frigives?

Normalt kan den ikke. Som alle C/C++-programmer bruger node.js en hukommelsesallokator. Når hukommelsen frigives, frigives den ikke til systemet, men til hukommelsesallokatoren. Generelt er hukommelsesallokatoren ikke i stand til at give den ubrugte hukommelse tilbage til systemet. Bemærk venligst, at det ikke er en lækage, for hvis programmet udfører en ny allokering, vil hukommelsen blive genbrugt.

At skrive et C/C++-program, som faktisk kan frigive hukommelse til systemet, involverer generelt at designe en brugerdefineret hukommelsesallokator. Få C/C++ programmer gør det. Oven i det inkluderer node.js en skraldeopsamler med v8, så det burde lægge yderligere begrænsninger på politikken for frigivelse af hukommelse.




  1. MassTransit saga med Redis persistens giver Metode Accpet har ikke en implementering undtagelse

  2. Returner den faktiske type af et felt i MongoDB

  3. Kan jeg gøre to kolonner unikke for hinanden? eller bruge sammensatte primære nøgler i redis?

  4. MongoDB - Forespørgsel på det sidste element i et array?