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 のリクエストを行うと、次のメモリ使用量が得られます
ご覧のとおり、メモリリークが発生しています。最後に OutOfMemory 例外が発生します。
関数内で同じ量のデータをログに記録するとsetInterval
、メモリはリークしません。
このような単純なアプリケーションでのリークの原因は何でしょうか?