NodeJS + GCloud 日志记录中的内存泄漏
Memory leak in NodeJS + GCloud logging
我一直在我们的生产代码中发现 2 个弱点的内存泄漏。最后,我用简单的 nodejs 服务器和 gcloud 日志 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;
我将每个请求 headers 写入 gcloud 日志记录:
'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 个请求,我将获得以下内存使用量
如您所见,内存泄漏。最后我得到 OutOfMemory 异常。
如果我在 setInterval
函数中记录相同数量的数据,内存不会泄漏。
在如此简单的应用程序中,泄漏的来源可能是什么?
我们的依赖项 gRPC 存在内存泄漏,最初报告于此处:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1414
最近在 gRPC 中发布了一个修复程序,我们将在今天发布 google-cloud 版本和受影响的子模块。
我一直在我们的生产代码中发现 2 个弱点的内存泄漏。最后,我用简单的 nodejs 服务器和 gcloud 日志 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;
我将每个请求 headers 写入 gcloud 日志记录:
'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 个请求,我将获得以下内存使用量
如您所见,内存泄漏。最后我得到 OutOfMemory 异常。
如果我在 setInterval
函数中记录相同数量的数据,内存不会泄漏。
在如此简单的应用程序中,泄漏的来源可能是什么?
我们的依赖项 gRPC 存在内存泄漏,最初报告于此处:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1414
最近在 gRPC 中发布了一个修复程序,我们将在今天发布 google-cloud 版本和受影响的子模块。