[英]PM2 - Incorrect memory usage reading & possible memory leak with Node.js application
當我的節點 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();
});
}
});
}
在與 OP 合作后,已確認PM2
存在某種內存泄漏。
請參閱以下有關我們調查結果的“文章”:
問題:
PM2
使用越來越多的 RAM
證據與謠言:
PM2
的情況下運行應用程序時,僅使用node myserver.js
,沒有證據表明 RAM 隨着時間的推移緩慢增加
PM2
PM2
內存泄漏的證據——可以追溯到 4 年前(這個答案寫於 2019 年 12 月)PM2
PM2
時不會發生這種情況PM2
GitHub 上提交的錯誤已確認內存泄漏
您應該考慮的 PM2 替代品:
Phusion Passenger
似乎是替代PM2
的有力候選人
PM2
比較,也是我要開始的地方Forever
Nodemon
PM2
並不是真正的“蘋果對蘋果”,但是嘿,多樣性是生活的調味品Naught
Node.js
集群 PM2
解決方法/創可貼:( !不建議在生產中依賴這些!)
PM2
PM2
是原生的PM2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.