我有一个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:
当有人下载一个大文件时,它会被加载到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);
});