Javascript PM2-不正确的内存使用读取和;Node.js应用程序可能存在内存泄漏

Javascript PM2-不正确的内存使用读取和;Node.js应用程序可能存在内存泄漏,javascript,node.js,memory-leaks,pm2,Javascript,Node.js,Memory Leaks,Pm2,当我的节点js服务器通过pm2运行时,它的内存使用率读数高于在DevTools中检查时应用程序中的实际内存堆。更重要的是,pm2中memory下的值随着时间的推移缓慢增加,可能表明某种内存泄漏。在DevTools中也无法观察到内存使用的缓慢增加 对这两个(看似)奇怪的事件有何解释和/或解决方案 这是我的工具 这是pm2清单 这是我的javascript代码 var SSE = require('sse'); var https = require('https'); var fs = req

当我的节点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使用越来越多的RAM
    • 这指向某种内存泄漏

证据和谣言:

  • 在运行应用程序时,如果不使用
    PM2
    ,仅使用
    节点myserver.js
    ,则没有证据表明RAM会随时间缓慢增加
    • 公羊保持平坦
    • 用于测试这一理论的应用程序是一个小型web应用程序,目的是将代码包含内存泄漏的可能性降至最低,并且泄漏实际上来自
      PM2
  • 关于PM2内存泄漏的“谣言”和证据已经存在了相当长的一段时间,最早可以追溯到4年前(这个答案写于2019年12月)
    • 见最后评论
    • 不使用PM2时不会发生这种情况
    • 这个bug是在今年[2019]提出的,在撰写本文时,最近10月份就有评论,其中有人描述了这仍然是一个问题

您应该考虑的PM2替代方案:

  • 似乎是取代PM2的有力候选
    • Phusion乘客看起来是与PM2最接近的对比,这也是我的出发点
    • 不,我和Phusion乘客没有任何关系
    • 似乎没有积极维护(在GitHub上提交的一些问题中,人们建议使用其他应用程序)
    • 不是真的“苹果对苹果”的PM2,但嘿,多样性是生活的调味品
    • 似乎没有得到积极维护,就恒星而言有点“小”

PM2
解决方法/创可贴:
(!不建议在生产中依赖这些!)

  • 消耗X数量的RAM后自动重新加载PM2
    • 此“功能”是PM2中的固有功能
  • 每X小时重新启动一次PM2
    • 克朗的工作

内存泄漏怎么办?我的应用程序总是在9-11MB左右。但是pm2的记忆似乎随着时间的推移而增加?我不确定。如果没有任何代码,很难诊断内存泄漏。。。这可能是一些pm2开销?听起来不错-我也需要做一些研究,因为我一直在使用pm2(但是设置了内存限制,所以如果RAM研究某个阈值,我会自动重新启动pm2)。。所以像这样的事情对我来说很难抓住。很好的发现!!好的,我可以确认pm2上似乎有某种泄漏。我在乘客身上试过,但记忆却停滞不前。在你的回答中,你能谈谈关于pm2泄漏的讨论和谣言吗?并提供您找到的解决方案/备选方案。谢谢你指出这是一项很好的工作——我刚刚完成了这方面的写作。很高兴我们(大部分是你)能够弄明白这一点。团队合作,大家好!英雄联盟