Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Penerbit node redis menghabiskan terlalu banyak memori

Ada dua pertanyaan di sini.

Mengapa program membutuhkan begitu banyak memori?

Saya pikir itu karena kurangnya tekanan balik.

Skrip Anda hanya mengirimkan 1 juta perintah publish ke Redis, tetapi tidak memproses balasan apa pun untuk perintah ini (yang karenanya hanya dibuang oleh node_redis). Karena tidak pernah menunggu balasan apa pun, skrip akan mengumpulkan banyak konteks di memori untuk semua perintah ini. node_redis perlu menjaga konteks untuk melacak perintah, dan mengaitkan perintah dan balasan Redis. Node.js lebih cepat dalam mengantrekan perintah, daripada sistem menyampaikan perintah tersebut ke Redis, memprosesnya, membuat balasan, dan menyampaikan balasan kembali ke node.js. Oleh karena itu, konteksnya berkembang, dan mewakili banyak memori.

Jika Anda ingin menjaga konsumsi memori ke tingkat yang dapat diterima, Anda perlu mengurangi kode Anda untuk memberi kesempatan kepada node.js untuk memproses balasan Redis. Misalnya, skrip berikut juga memproses 1 juta item, tetapi menerbitkannya sebagai kumpulan 1000 item, dan menunggu balasan setiap 1000 item. Oleh karena itu menggunakan memori yang sangat sedikit (konteks berisi paling banyak 1000 perintah tertunda).

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

Dapatkah memori dilepaskan?

Biasanya tidak bisa. Seperti semua program C/C++, node.js menggunakan pengalokasi memori. Ketika memori dibebaskan, itu tidak dilepaskan ke sistem, tetapi ke pengalokasi memori. Umumnya, pengalokasi memori tidak dapat mengembalikan memori yang tidak digunakan ke sistem. Harap dicatat ini bukan kebocoran, karena jika program melakukan alokasi baru, memori akan digunakan kembali.

Menulis program C/C++ yang benar-benar dapat melepaskan memori ke sistem umumnya melibatkan perancangan pengalokasi memori khusus. Beberapa program C/C++ melakukannya. Selain itu, node.js menyertakan pengumpul sampah dengan v8, sehingga harus memberikan batasan tambahan pada kebijakan pelepasan memori.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Django ValueError:Tidak ada rute yang ditemukan untuk jalur 'ws/chat//'

  2. jackson deserialize objek dengan daftar antarmuka pegas

  3. Catbox-redis menunjukkan kesalahan terputus pada aplikasi hapijs saya

  4. Pelengkapan otomatis ulang

  5. Redis + Node.js - bagaimana cara mengambil nilai