当我的 Node js 服务器通过 pm2 运行时,在 DevTools 中检查时,它的内存使用量读数高于应用程序中的实际内存堆。更重要的是,pm2 中的 memory
下的值随着时间的推移缓慢增加,可能表明存在某种内存泄漏。在 DevTools 中也无法观察到内存使用量的缓慢增加。
对这两个(看似)奇怪的事件有什么解释和/或解决方案吗?
这是我的开发工具
这是pm2列表
这是我的 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();
});
}
});
}
最佳答案
与 OP 合作解决此问题后,已确认 PM2
中存在某种内存泄漏。 .
请参阅以下有关我们调查结果的“记录”:
<小时/>问题:
- 随着时间的推移慢慢
PM2
使用越来越多的内存- 这表明存在某种内存泄漏
证据与谣言:
- 在没有
PM2
的情况下运行应用程序时,只需使用node myserver.js
,没有证据表明 RAM 随着时间的推移缓慢增加- RAM 保持不变
- 用于测试该理论的应用程序是一个小型 Web 应用程序,目的是最大限度地减少代码包含内存泄漏的可能性,而泄漏实际上来自
PM2
PM2
中存在内存泄漏的“谣言”和证据已经有一段时间了 - 可以追溯到 4 年前(这个答案写于 2019 年 12 月)- Someone describing why they stopped using
PM2
- 查看最后评论
- Thread where others are describing similar issues
- 当
PM2
时不会发生这种情况未使用
- 当
- Bug filed on
PM2
GitHub with a confirmed memory leak- 此错误于今年 [2019] 年提交,在撰写本文时,最近有 10 月份的评论,其中有人描述了这仍然是一个问题
您应该考虑的 PM2 替代方案:
-
Phusion Passenger
似乎是替换PM2
的有力候选者- `Quick-start guide can be found here
- Phusion Passenger 看起来与
PM2
最接近这就是我要开始的地方 - 不,我与 Phusion Passenger 没有任何隶属关系...
-
Forever
- 它似乎没有得到积极维护(在 GitHub 上提交的一些问题中,人们建议使用其他应用程序)
-
Nodemon
- 与
PM2
并不是真正的“同类” ,但是嘿,多样性是生活的调味品
- 与
-
Naught
- 似乎没有得到积极维护,并且就星级而言有点“小”
- Native
Node.js
cluster
PM2
解决方法/创可贴:(!不建议在生产中依赖这些!)
- Set a Memory Threshold自动重新加载
PM2
一旦 X 数量的 RAM 被消耗- 此“功能”是
PM2
中固有的
- 此“功能”是
- Use a Cron Job重新启动
PM2
每 X 小时- Another example Cron 作业的内容
关于javascript - PM2 - Node.js 应用程序的内存使用读取不正确以及可能存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474575/