[英]PM2 - Incorrect memory usage reading & possible memory leak with Node.js application
When my node js server is running via pm2, it has a higher memory usage reading than the actual memory heap in the application when inspected in DevTools.当我的节点 js 服务器通过 pm2 运行时,在 DevTools 中检查时,它的内存使用率读数高于应用程序中的实际内存堆。 More so, the value under
memory
in pm2 slowly increases over time, possibly indicating some kind of memory leak.更重要的是,pm2 中
memory
下的值随着时间的推移缓慢增加,可能表明某种内存泄漏。 This slow increase in memory usage also cannot be observed in DevTools.在 DevTools 中也无法观察到这种内存使用量的缓慢增加。
Any explanation and/or solutions to these two (seemingly) strange occurrences?对这两个(看似)奇怪的事件有什么解释和/或解决方案?
This is my DevTools这是我的开发者工具
This is pm2 list
这是
pm2 list
here is my javascript
code这是我的
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();
});
}
});
}
After teaming up with OP on this, it has been confirmed there is some sort of memory leak in PM2
.在与 OP 合作后,已确认
PM2
存在某种内存泄漏。
Please see the below 'write-up' on our findings:请参阅以下有关我们调查结果的“文章”:
The Issue:问题:
PM2
uses more and more RAMPM2
使用越来越多的 RAM
Evidence & Rumors:证据与谣言:
PM2
, just using node myserver.js
, there is no evidence of RAM slowly increasing over timePM2
的情况下运行应用程序时,仅使用node myserver.js
,没有证据表明 RAM 随着时间的推移缓慢增加
PM2
PM2
PM2
for quite some time now - going back as far as 4 years (this answer was written in December 2019)PM2
内存泄漏的证据——可以追溯到 4 年前(这个答案写于 2019 年 12 月)PM2
PM2
PM2
is NOT usedPM2
时不会发生这种情况PM2
GitHub with a confirmed memory leakPM2
GitHub 上提交的错误已确认内存泄漏
PM2 Alternatives You Should Consider:您应该考虑的 PM2 替代品:
Phusion Passenger
seems like a strong candidate for replacing PM2
Phusion Passenger
似乎是替代PM2
的有力候选人
PM2
and is where I would start PM2
比较,也是我要开始的地方Forever
Nodemon
PM2
, but hey, variety is the spice of life PM2
并不是真正的“苹果对苹果”,但是嘿,多样性是生活的调味品Naught
Node.js
clusterNode.js
集群PM2
Workarounds/Band-Aids: (!not recommended to rely on these in Production!) PM2
解决方法/创可贴:( !不建议在生产中依赖这些!)
PM2
once X amount of RAM has been consumedPM2
PM2
PM2
是原生的PM2
every X hours PM2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.