【发布时间】:2020-04-15 21:05:40
【问题描述】:
当我的节点 js 服务器通过 pm2 运行时,在 DevTools 中检查时,它的内存使用率读数高于应用程序中的实际内存堆。更重要的是,pm2 中memory 下的值随着时间的推移缓慢增加,可能表明某种内存泄漏。在 DevTools 中也无法观察到内存使用量的缓慢增长。
对这两个(看似)奇怪的事件有任何解释和/或解决方案吗?
这是我的开发者工具
这是pm2 list
这是我的javascript 代码
var SSE = require('sse');
var https = require('https');
var fs = require('fs');
var url = require('url');
var mysql = require('mysql');
var schedule = require('node-schedule');
var options = {
key: fs.readFileSync('pathto/ssl.key'),
cert: fs.readFileSync('pathto/ssl.crt'),
ca: fs.readFileSync('pathto/ssl.ca-bundle')
};
var pool = mysql.createPool({
connectionLimit: 100,
host: "host",
user: "user",
password: "pass",
database: "db"
});
async function connectandrun() {
try {
var server = https.createServer(options, function(req, res) {
var queryData = url.parse(req.url, true).query;
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Access-Control-Allow-Origin': '*',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,OPTIONS',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
});
if (queryData.connectionid) {
var connecitonid = queryData.connectionid;
} else {
var connecitonid = "";
}
var myconection = "myconnecction" + connecitonid;
var uuserjson = {};
uuserjson[myconection] = {
Data: {
Element: null
}
};
schedule.scheduleJob('*/3 * * * * *', function() {
var runninginstance = main(uuserjson, queryData, myconection, res).catch(console.error);
runninginstance = null;
});
res.on("close", function() {
res.end();
uuserjson[myconection] = null;
myconection = null;
connecitonid = null;
});
});
server.listen(3000, '0.0.0.0', function() {
var sse = new SSE(server);
sse.on('connection', function(client) {
client.send('hi there!');
});
});
} finally {}
}
connectandrun().catch(console.error);
async function main(uuserjson, queryData, myconection, res) {
pool.getConnection(function(err, con) {
if (err) {
console.log(err);
} else {
con.query("MYSQL QUERY",
function(err, result, fields) {
if (err) throw err;
if (result.length != 0) {
uuserjson[myconection] = {
Data: {
Element: result[0]
}
};
if (result[0]) {
res.write("retry: 30000\n\n" + "event: blanks\ndata: " + result[0] + "\n\n");
}
}
con.release();
});
}
});
}
【问题讨论】:
-
那么内存泄漏呢?我的应用程序总是在 9-11MB 左右。但是pm2的内存好像是随着时间增加的?
-
我不确定。没有任何代码就很难诊断内存泄漏...可能是一些 pm2 开销?
-
听起来不错 - 我也需要做一些研究,因为我一直在使用 pm2(但设置了内存限制,所以如果 RAM 研究某个阈值,我会自动重启 pm2).. 所以这样的事情会我很难抓住。很好的发现!
-
好的,我可以确认 pm2 上似乎有某种泄漏。我在Passenger上试过,记忆停滞不前。在你的回答中,你能谈谈关于 pm2 泄漏的讨论和谣言吗?并提供您找到的解决方案/替代方案。感谢您指出这一点
-
干得好——我刚刚写完这篇文章。很高兴我们(主要是你)能够解决这个问题。 Hi-5 团队合作!大声笑
标签: javascript node.js memory-leaks pm2