簡體   English   中英

PM2 - 不正確的內存使用讀取和 Node.js 應用程序可能的內存泄漏

[英]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 隨着時間的推移緩慢增加
    • RAM保持平穩
    • 用於測試該理論的應用程序是一個小型 Web 應用程序,以盡量減少代碼包含內存泄漏的機會,而泄漏實際上來自PM2
  • 很長一段時間以來,一直有“謠言”和PM2內存泄漏的證據——可以追溯到 4 年前(這個答案寫於 2019 年 12 月)
  • 有人描述了他們停止使用PM2
    • 查看最后一條評論
  • 其他人描述類似問題的主題
    • 使用PM2時不會發生這種情況
  • PM2 GitHub 上提交的錯誤已確認內存泄漏
    • 這個錯誤是在今年 [2019] 年提交的,在撰寫本文時,最近在 10 月份就有評論,有人描述了這仍然是一個問題

您應該考慮的 PM2 替代品:

  • Phusion Passenger似乎是替代PM2的有力候選人
  • Forever
    • 似乎沒有得到積極維護(在他們 GitHub 上提交的一些問題中,人們建議使用其他應用程序)
  • Nodemon
    • PM2並不是真正的“蘋果對蘋果”,但是嘿,多樣性是生活的調味品
  • Naught
    • 似乎沒有得到積極維護,並且在星級方面有點“小”
  • 原生Node.js集群

PM2解決方法/創可貼:( !不建議在生產中依賴這些!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM