【问题标题】:Does node.js memory usage increase as the number of simultaneous requests increase, or is this a leak?node.js 内存使用量是否会随着同时请求数量的增加而增加,或者这是泄漏?
【发布时间】:2014-11-11 13:34:20
【问题描述】:

我正在运行以下 node.js 代码:

var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type': 'text/plain'});
res.write("Hello");
res.end();
}).listen(8888);

当我启动服务器时(通过输入node myFile.js),节点进程正在使用 9MB 内存。

然后我创建了以下网页,我在我的网络浏览器的几个选项卡中打开它,所以我同时向节点发出请求:

<html>
    <head>
                <script>
                    var ajax = {};
        var questions = [];
        var questionsResponses = [];

        ajax.x = function() {
            if (typeof XMLHttpRequest !== 'undefined') {
                return new XMLHttpRequest();
            }
            var versions = [
                "MSXML2.XmlHttp.5.0",
                "MSXML2.XmlHttp.4.0",
                "MSXML2.XmlHttp.3.0",
                "MSXML2.XmlHttp.2.0",
                "Microsoft.XmlHttp"
            ];

            var xhr;
            for (var i = 0; i < versions.length; i++) {
                try {
                    xhr = new ActiveXObject(versions[i]);
                    break;
                } catch (e) {}
            }
            return xhr;
        };

        ajax.send = function(url, callback, method, data, async) {
            var x = ajax.x();
            x.open(method, url, async);
            x.onreadystatechange = function() {
                if (x.readyState == 4) {
                    if (x.status == 200) {
                        callback(x.responseText)
                    } else {
                        //TODO
                    }
                }
            };
            if (method == 'POST') {
                x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            }
            x.send(data)
        };

        ajax.get = function(url, data, callback, async) {
            var query = [];
            for (var key in data) {
                query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
            }
            ajax.send(url + '?' + query.join('&'), callback, 'GET', null, async)
        };

        ajax.post = function(url, data, callback, async) {
            var query = [];
            for (var key in data) {
                query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
            }
            ajax.send(url, callback, 'POST', query.join('&'), async)
        };


                var count = 0;
        function sayHello(){
            ajax.get("http://localhost:8888", {}, sayHello, true); 
            var heading = document.getElementById("c");
            while (heading.firstChild) {
                heading.removeChild(heading.firstChild);
            }
            var countText = document.createTextNode(""+count++);
            heading.appendChild(countText);
        }

            </script>


    </head>
    <body>
        <h1 id="c"></h1>
        <script>        sayHello();</script>
    </body>
</html> 

节点现在使用的内存是 46.2 MB。它慢慢增加。每隔一段时间就会有一次跳跃,然后继续缓慢增加。这是节点在同时收到许多请求时的正常行为,还是泄漏?

编辑:似乎稳定在 46.4 MB。但我不知道它是否稳定,因为我发出的请求数量有限(因为我在网络浏览器中打开了多个选项卡),所以这可能只是我的笔记本电脑的限制。呵呵

编辑:即使我一次只发出一个请求(即仅在我的网络浏览器中打开一个选项卡),内存似乎也会增加。此外,即使关闭所有窗口后,使用的内存也不会减少(它保持在 46.4 MB)。

【问题讨论】:

    标签: javascript node.js memory-leaks


    【解决方案1】:

    当然,请求数量和内存使用量之间存在比例关系:每个请求都需要处理一些对象(例如:req、res、...),每个对象都占用内存。 在我的 nodejs 应用程序中,我注意到随着请求的增加,内存也会增加,但有时它会在非常高效的 Google V8 引擎垃圾收集器的作用下下降。 无论如何,内存泄漏已经过去了,但肯定不可能像您所说的那样谈论内存使用量约为 50 MB 的内存泄漏。

    【讨论】:

      【解决方案2】:

      很明显。您获得的请求越多,您的应用程序将使用更多内存来管理接受请求和响应的流程。

      我认为您是在询问可扩展性问题。 您应该设计代码而不将数据存储在内存中,而是使用单个逻辑数据库,以便同一应用程序的许多实例可以在不同的机器上运行。如果达到了一个服务器的内存限制,您只需在新机器上启动您的应用程序并在那里重定向过度流量。因为数据库是一个并且在各种实例之间共享。一些托管 nodejs 应用程序(openshift、heroku)的云提供商会自动执行此操作:您的代码在单个“墨盒”上运行,如果到达的流量过多,他们会在补充墨盒上启动您的应用程序并平衡各种墨盒之间的流量。这样它就不会因为过多的内存或 CPU 使用率而停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 2020-11-03
        • 2011-10-14
        • 1970-01-01
        • 2021-06-28
        相关资源
        最近更新 更多