相关疑难解决方法(0)

如何防止node.js中的内存泄漏?

我们知道node.js为我们提供了强大的力量,但强大的力量带来了巨大的责任.

据我所知,V8引擎不做任何垃圾收集.那么我们应该避免哪些最常见的错误,以确保没有内存从我的节点服务器泄漏.

编辑: 对不起我的无知,V8确实有一个强大的垃圾收集器.

memory-leaks node.js

45
推荐指数
3
解决办法
4万
查看次数

没有v8-profiler的Node.js内存泄漏

我正在尝试跟踪Node.js应用程序中的内存泄漏.我已经尝试过安装v8-profiler但它不会编译......它看起来像一个很多人正在尝试使用的死项目但却遇到了同样的问题 - 非常多来自节点0.3.2所以很长一段时间前.

有没有人知道如何在不使用v8-profiler的情况下搜寻Node.js应用程序中的内存泄漏?我让Eclipse运行V8远程调试工作,但无法找到方法来查看内存使用/堆等.

javascript memory profiler memory-leaks node.js

14
推荐指数
1
解决办法
6907
查看次数

Node.js + Express随机丢弃请求,导致网关超时

编辑

经过大量的讨论,我终于找到了一些似乎可能是一个坚实的领导:

快递库当前正在使用Node + OAuth模块执行多个出站请求(例如,Facebook,Twitter等)时,无法接受传入请求.我能够通过在我的代码中放置大量日志来确定这一点,在那里我发现在出站请求中间没有触发"开始请求"日志(如下所述).

我已经能够证明,当Node + OAuth模块发出一些出站请求时,对我的API的入站请求(通过浏览器窗口)将挂起,直到其中一个出站OAuth请求完成后才会收到.

当然,我已经完成了:

require('http').globalAgent.maxSockets = 999;
Run Code Online (Sandbox Code Playgroud)

根据IRC的建议,我补充道

console.log(require('http').globalAgent.requests);
Run Code Online (Sandbox Code Playgroud)

但这似乎总是=== {},暗示没有待处理的入站请求AFAIK.

因此,我得出结论,由于某些原因,node.js或express选择阻止由于出站请求而传入的请求,即使应该有足够的套接字可用...

任何人都有任何关于如何解决这个问题的提示?


我在node.js中使用部署在Amazon Cloud上的Express,Mongoose等创建了一个API,它在99%的时间内运行得非常快速.

除了,偶尔,请求似乎以某种方式被丢弃或以其他方式被忽略.我说的是通常在几毫秒内完成的请求随机无响应而没有明确的原因.

连接到API端点时,症状是一个简单的"网关超时".在同一个客户端使用相同的参数进行相同的请求,只需要在之前或之后,就可以正常工作.

当然,我的第一个想法是"呃,服务器超载!" 所以我花了很多时间来优化我的请求,monogoDB等.最后我得到了全面的CPU /磁盘/ RAM使用率(在Node.js服务器和Mongo服务器中)非常低.我使用Scout和RightScale实时跟踪我的服务器,并记录任何超过100毫秒的请求或查询.我的节点服务器目前有5GB的免费内存,70%的免费CPU(在第一个内核上),等等.所以我99.99%肯定它不是性能问题.

最后,我再次陷入绝望的尝试:我随机编号附加了我的客户提出的所有请求.然后,在node.js应用程序中,我在第一次收到请求时以及完成请求时执行console.log().例如,这是我在express中使用的中间件:

var configureAPI = function() {
    return function(req, res, next) {
        if(req.body.ruid)
            console.log(req.body.ruid);

        // more middleware stuff...
    };
}
server.configure(function(){

    server.use(express.bodyParser());
    server.use(configureAPI());
    server.use(onError);

    // ...  more config stuff
}
Run Code Online (Sandbox Code Playgroud)

我发现震惊了我:显然,node.js应用程序甚至没有收到有问题的请求.我有一个Javascript webapp,我将随请求发送的"ruid"打印到控制台.只要请求成功,node.js控制台中就会打印出相应的"ruid".每当它超时,就没有.


编辑:更多调试和信息.

我的应用服务器实际上已启动(并继续)也为PHP提供服务(因此,他们安装了Apache等).我需要http://streamified.me来服务我的网站(PHP)和http://api.streamified.me来提供我的API(node.js)...所以我的httpd.conf文件中有一行代码导致请求api.streamified.me(而不是streamified.me)通过端口8888转到node.js:

RewriteCond %{HTTP_HOST} ^api.streamified.me
RewriteRule ^(.*) http://localhost:8888$1 [P]
Run Code Online (Sandbox Code Playgroud)

因此,在同一个httpd.conf文件中,我启用了RewriteLogLevel 5,然后在我的localhost上创建了一个简单的PHP + CURL脚本,用随机URL命中我的api.streamified.me(这会导致node.js触发一个简单的"未找到"响应)直到导致网关超时.在这里,您可以看到它已经发生 …

node.js

9
推荐指数
1
解决办法
2698
查看次数

读取Node.js堆快照(通过Nodetime创建) - 为什么我的对象不是GC?

我的Nodetime堆快照中有一些令人惊讶的结果:

在此输入图像描述

我是否正确地读到我的堆中有1706个"用户"实例?这看起来非常高,我甚至不确定如何分配这么多.在任何情况下,是否有任何提示/技巧/提示,以找出为什么这些悬挂?我已经在我的代码上使用了JSHint来确保没有分配自由全局变量.所有内容都应该包含在请求的封闭范围内......那么为什么在请求完成时不会对用户,帖子等进行垃圾回收?这里有一些(编辑过的)代码来展示我是如何做事的......

令人惊讶的是,在最后一次API调用完成后,我将上述堆快照大约10米.因此,在触发分配的请求完成后,这些对象都会闲置很久!

码:

var User = require('./user').User,
    Q = require('q');

// this function is called via express' router, eg when the client visits myapi.com/users/zane
function getUser(req, res, next)
{
   var user = extend({},User).initialize();

   Q.ncall(user.model.find, user.model, {'username': req.arguments[0]})
   .then(function(data){
       res.writeHead(200, {});
       res.end(JSON.stringify(data));
   })
   .fail(next).end();
}
Run Code Online (Sandbox Code Playgroud)

而"用户"模块看起来像这样:

exports.User = extend({}, {
    initialize: function() {
        var Schema = api.mongoose.Schema;
        this.schema = new Schema({
            'username': {'type':String, 'index':true}
        });
        this.model = api.db.model('users', this.schema);
    }

    // ... some other helper functions …
Run Code Online (Sandbox Code Playgroud)

node.js

5
推荐指数
1
解决办法
1032
查看次数

标签 统计

node.js ×4

memory-leaks ×2

javascript ×1

memory ×1

profiler ×1