3

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、メモリはリークしません。

このような単純なアプリケーションでのリークの原因は何でしょうか?

4

1 に答える 1

2

私たちの依存関係である gRPC には、最初にここで報告されたメモリ リークがありました: https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1414

最近、gRPC で修正がリリースされました。本日、google-cloud と影響を受けるサブモジュールのバージョンをリリースします。

于 2016-09-07T12:35:06.023 に答える