NodeJS有时会被丢失,因为流式传输/管道文件时内存不足

时间:2015-02-21 21:06:14

标签: node.js memory streaming node-request

问题

我有一个request module的NodeJS服务器。 我使用requests pipe()来提供文件。

有时,应用程序会抛出异常,所有下载都会取消,我必须重新启动应用程序:

  

记忆力不足:杀死进程9342(nodejs)得分793或牺牲孩子
  被杀死的进程9342(nodejs)total-vm:1333552kB,anon-rss:410648kB,file-rss:0kB

我写了另一个脚本,当它意外结束时会自动重启服务器(使用childprocess& fork),这有时会引发这个错误:

  

致命错误:CALL_AND_RETRY_2分配失败 - 处理内存不足


服务器数据
内存:500MB(我知道这并不多,但它很便宜) Ubuntu 12.04.5 LTS

NodeJS版本:v0.10.36

假设

  1. 并行下载太多
  2. 与RAM相关的管道有问题
  3. 关于1:
    当有人下载​​一个大文件时,它会被加载到RAM中(我对此一无所知,一次说20MB,如果我错了,请纠正我)。当400MB可用且20个当前下载速度相同时,服务器崩溃,因为他无法在RAM中同时加载超过400MB。

    关于2:
    pipe()之外,我还使用以下代码来跟踪当前和&取消下载:

    req.on("close", function() { 
        currentDownloads--;
    });
    

    pipe()没有正确关闭,而且它使用的RAM也没有被清除。

    问题

    如果我的任何假设应该是正确的,我该如何解决? 如果没有,它可能是什么,或者更确切地说可能是原因(是NodeJS /请求模块/我的代码是错还是坏,是否有更好的方法)?

    完整代码

    var currentDownloads = 0;
    app.post("/", function (req, res) {
        var open = false;
    
        req.on("close", function () {
            if (open) {
                currentDownloads--;
                open = false;
            }
        });
    
        request.get(url)
        .on("error", function (err) {
            log("err " + err);
            if (open) {
                currentDownloads--;
                open = false;
            }
        })
        .on("response", function () {
            open = true;
            currentDownloads++;
        })
        .pipe(res);
    });
    

0 个答案:

没有答案