【问题标题】:PM2 - Incorrect memory usage reading & possible memory leak with Node.js applicationPM2 - Node.js 应用程序的内存使用读取不正确和可能的内存泄漏
【发布时间】: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


【解决方案1】:

在与 OP 合作后,已确认 PM2 存在某种内存泄漏。

请参阅以下关于我们发现的“文章”:


问题:

  • 随着时间的推移,PM2 使用越来越多的 RAM
    • 这表明存在某种内存泄漏

证据与谣言:

  • 在没有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
    • 这个 bug 是在今年 [2019] 提交的,在撰写本文时,cmets 早在 10 月份就有,有人描述了这仍然是一个问题

您应该考虑的 PM2 替代品:

  • Phusion Passenger 似乎是替换 PM2 的有力候选人
  • Forever
    • 似乎没有得到积极维护(在他们的 GitHub 上提交的一些问题中,人们建议使用其他应用程序)
  • Nodemon
    • PM2 并不是真正意义上的“苹果对苹果”,但是嘿,多样性是生活的调味品
  • Naught
    • 似乎没有得到积极维护,就星星而言有点“小”
  • Native Node.js cluster

PM2 Workarounds/Band-Aids:(!不建议在生产中依赖这些!)

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2012-10-16
    • 2017-09-08
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多