-
Notifications
You must be signed in to change notification settings - Fork 11.1k
Node.js: Potential memory leak #10445
Copy link
Copy link
Closed
Labels
Description
Ref: googleapis/google-cloud-node#2135
See the above customer reported issue of a memory leak with the @google-cloud/logging library. I can reproduce the leak (sample code below). Looking a memory usage, JS heap and Node.js external memory is constant but RSS increases. This suggest that this is memory leaking from a native module. Since gRPC is the only native module involved, this is possibly a leak in gRPC?
❯ node index.js
myapp listening at http://[::]:8080
rss 66093056 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 66101248 heap 59740160 external 153861
rss 143564800 heap 86478848 external 835128
rss 149528576 heap 77041664 external 794091
rss 161824768 heap 75993088 external 515467
rss 177254400 heap 75993088 external 438475
rss 195915776 heap 76517376 external 543307
rss 210944000 heap 75993088 external 712427
rss 225538048 heap 75993088 external 732971
rss 241627136 heap 75993088 external 523787
rss 256933888 heap 76517376 external 430443
rss 275152896 heap 75993088 external 712395
rss 291975168 heap 75993088 external 438635
rss 303693824 heap 75468800 external 724875
rss 321449984 heap 76517376 external 523979
rss 338817024 heap 77041664 external 724587
rss 354705408 heap 77041664 external 540107
rss 372436992 heap 76517376 external 438667
rss 385081344 heap 75993088 external 741227
rss 403259392 heap 75468800 external 729419
rss 420491264 heap 76517376 external 749227
rss 436707328 heap 76517376 external 523147
rss 452116480 heap 76517376 external 404203
rss 468451328 heap 75468800 external 633995
rss 485847040 heap 75468800 external 734251
rss 501522432 heap 75993088 external 741291
rss 516468736 heap 75468800 external 514923
rss 537968640 heap 75993088 external 683531
....
Testcase
const logging = require('@google-cloud/logging')();
const plugins = require('restify-plugins');
const restify = require('restify');
const util = require('util');
const log = logging.log('logging-log');
const metadata = {
resource: {
type: 'global'
}
};
const server = restify.createServer({
name: 'myapp'
});
server.use(plugins.acceptParser(server.acceptable));
server.use(plugins.queryParser());
server.use(plugins.bodyParser());
server.get('/echo/:name', function (req, res, next) {
const entry = log.entry(metadata, `got /echo request: ${req.params.name}`);
log.info(entry, {}, function() {});
res.send(req.params);
return next();
});
server.listen(8080, function () {
console.log('%s listening at %s', server.name, server.url);
});
setInterval(() => {
const m = process.memoryUsage();
console.log(`rss ${m.rss} heap ${m.heapTotal} external ${m.external}`);
}, 5 * 1000);Even with mild load, the above leaks memory fairly rapidly.
This does require $GCLOUD_PROJECT to be set and valid credentials to be available.
/cc @murgatroid99
Reactions are currently unavailable