NodeJS + GCloud日志记录中的内存泄漏

时间:2016-09-07 09:31:34

标签: node.js logging memory-leaks gcloud gcloud-node

我一直在我们的生产代码中找到2个弱点的内存泄漏。最后,我用简单的nodejs服务器和gcloud logging api重现了内存泄漏。

Nodejs服务器与Nodejs入门指南

内部相同
'use strict';

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

module.exports = server;

我将每个请求标头写入gcloud logging:

'use strict';

const app = require('./app.js');

const gcloud  = require('gcloud')({
    keyFilename: 'my-key-file',
    projectId: 'my-project-id'
});

const logging = gcloud.logging();

const logs = logging.log('log-bucket');

const resource = {
  type: 'logging_log',
  labels: {
    name: 'clear_node_logs',
  }
};

app.on('request', function onServerRequest(req, res) {
    const entry = logs.entry(resource, req.headers);

    logs.info(entry, logHandler);
});

function logHandler(err) {
    if (err) {
        console.log(err);
    }
}

如果我向该服务器发出300k请求,我将获得以下内存使用

enter image description here

你可以看到内存泄漏。最后我得到OutOfMemory异常。

如果我在setInterval函数内记录相同数量的数据,则内存不会泄漏。

在这样一个简单的应用程序中,泄漏的原因是什么?

1 个答案:

答案 0 :(得分:2)

我们的依赖项gRPC有一个内存泄漏,最初在此报告:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1414

最近在gRPC上发布了一个修复程序,我们今天将发布google-cloud和受影响子模块的版本。