2016-09-07 4 views
2

프로덕션 코드에서 2 개의 약점에 대한 메모리 누수가 발생했습니다. 마지막에는 간단한 nodejs 서버와 gcloud 로깅 API를 사용하여 메모리 누출을 재현했습니다.NodeJS + GCloud 로깅에서의 메모리 누수

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하는 모든 요청 헤더를 쓰기 로깅 : 내가 얻을이 서버에 300K 요청을 할 경우

'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); 
    } 
} 

다음 메모리 사용량

enter image description here

메모리 누수가 보입니다. 결국 OutOfMemory 예외가 발생합니다.

setInterval 내부에 같은 양의 데이터를 기록하면 메모리가 누출되지 않습니다.

간단한 응용 프로그램에서 그 누수의 원인이 될 수있는 것은 무엇입니까?

+0

어떤 gcloud-node 버전을 사용하고 있습니까? –

+0

우리는 gcloud-node 0.37.0과 nodejs 4.2.2를 사용합니다. 그러나 gcloud-node 0.39.0 및 nodejs 4.50과 동일한 문제가 발생했습니다. – muryginm

답변

2

우리의 의존성, gRPC는 원래 여기에보고 된 메모리 누수했다 : https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1414

수정 사항이 최근 gRPC에 발표되었다, 우리는 오늘 구글 클라우드의 버전과 영향을받는 서브 모듈을 출시한다.

+0

고마워요. – muryginm

+0

출시! https://github.com/GoogleCloudPlatform/google-cloud-node/releases/tag/v0.40.0 – Stephen

+0

문제는 아직 해결되지 않았습니다. @ google-cloud/logging 0.8.1, 노드 v.6.3.1, Mac OS 10.11.6 –