Node.js GC mark-compact - PullRequest
       1

Node.js GC mark-compact

4 голосов
/ 30 марта 2012

У меня проблема с приложением, использующим словари в памяти (создается с помощью нового конструктора (bla, fla, pla)).Как только размер резидентной памяти приближается к ~ 100-150 Мбит / с, фаза сжатия метки занимает больше секунды.Каждая сотня мег добавляет одну секунду.

Поведение можно воспроизвести, выполнив следующее:

node --trace_gc test-memory.js

test_memory.js:

var http      = require('http'),
    Construct = function () {
        this.theField = Math.random();
    },
    storage   = [];

http.createServer(function (req, res) {
    var i = 100000;

    while (--i) {
        storage.push(new Construct());
    }

    res.end('Lots of data generated.');
}).listen(1337, '127.0.0.1');

Затем выполните curl localhost: 1337 какое-то время, и посмотрите это:

Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 943 ms.
Mark-compact 143.5 -> 143.5 MB, 1306 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1189 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 935 ms.
Mark-compact 143.5 -> 143.5 MB, 1191 ms.
Scavenge 143.5 -> 143.5 MB, 1 ms.
Mark-sweep 143.5 -> 143.5 MB, 1015 ms.
Mark-compact 143.5 -> 143.5 MB, 1218 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1195 ms.

Насколько я могу судить, GC пытается перемещаться вокруг объектов, которые не будут освобождены в любом случае.

Единственное решение, которое я нашел, - это переместить эти объекты в буфер, но для моего приложения это означало бы служебную нагрузку JSON.stringify | JSON.parse, которая, скорее всего, приведет к увеличению времени процессора.Кроме того, это потребует переписывания.

Я понимаю, что это может быть больше проблемой v8, но может быть есть какой-то способ обойти GC для объектов, которые не будут выпущены?

node.js версия 0.6.11

1 Ответ

1 голос
/ 23 июня 2012

Вы пытались сравнить производительность с использованием REDIS или Membase?Насколько я вижу, вы достигли уровня, когда это можно считать базой данных в памяти, поэтому вы можете попытаться сравнить ее с фактическим использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...