【发布时间】:2013-09-03 14:11:37
【问题描述】:
在我之前的问题 (Prevent my node.js app to be killed by the OS) 之后,我重新制作了我下载文件的方式。
简而言之,我需要下载一些视频文件(测试文件是 3 个视频,mp4,~3min),我一次下载它们,进程被杀死并且 dmesg 说(在 2 个下载完成后):
Out of memory: kill process (node) score 824 or sacrifice child
Killed process (node)...
所以我通过一个接一个地下载视频来重试,但在第二次下载时,我得到了完全相同的消息,我的程序被杀死了。
有什么方法可以查看我的代码的哪一部分出错,或者防止 linux 杀死我的进程?
顺便说一句,三个同时下载不是比一个消耗更多的内存吗?那为什么我一个接一个地被杀得更快呢?
该应用程序在树莓派上运行,没有 GUI,raspbian,我相信它是唯一运行的应用程序(系统进程除外)
编辑: 关于该功能的一些细节以及我认为它现在如何工作: 该应用程序在节点中启动,而不是在任何浏览器中。 由于它是一个接一个地下载视频,我以为它会消耗更少的内存,但似乎是错误的,因为我一次发射时下载了更多的数据,原因似乎是一样的。
这里是下载功能,以防万一:
file_url 的类型为http://adress.com/rpi/test.mp4
function download (file_url, callback){
var option={host:url.parse(file_url).host, port:80, path:url.parse(file_url).pathname};
var file_name=url.parse(file_url).pathname.split('/').pop();
var file=fs.createWriteStream(DOWNLOAD_DIR+file_name);
//Seems to crash while here:
http.get(options, function(res){
res.on('data', function(data){
file.write(data);
}).on('end'), function(){
file.end();
callback(DOWNLOAD_DIR+file_name);
});
});
};
我确信这个功能确实有效,因为我确实使用它成功下载了一些文件。
我的下载方式如下: ( 此功能可能无法完全正常工作,我不要求调试,我永远无法结束它。)
function download_all (list, callback){
var i=0;
function follow(){
i=i+1;
if (i<list.length){
download(DOWNLOAD_ADD+list[i], follow);
}
}
download(DOWNLOAD_ADD+list[0], follow);
}
EDIT2:
由于我仍然没有找到核心转储的方法或Roman提出的其他解决方案,我使用process.memoryUsage在下载时打印它。
heapTotal 在整个过程中缓慢增加,介于 20 000 000 和 25 000 000 之间,但有一些下降。 heapUsed 正在迅速增加,当超过 6 000 000 时会定期下降到 ~2 000 000,在 ~12 000 000 时会出现一些峰值。
当进程被杀死时,最后一次打印是: RSS:428 707 840,heapTotal:23 842 176,heapUsed:5 854 164
我知道如何阅读它,但在我看来,这个过程远没有吃掉所有的记忆......
我仍在阅读有关核心转储和 /proc/ 的文档
EDIT3:
我的技术主管建议下载可能会被缓存,然后将整个文件写入磁盘,这可以解释内存使用情况。它并没有真正坚持一次性的情况,因为我可以结束 2 个视频的下载并在它结束第三个视频时被杀死,但我现在也在搜索它
EDIT4:
没关系最后一次编辑,我已经在逐块写了,这给我们一个关于为什么内存被吃掉的问题
【问题讨论】:
标签: javascript linux node.js raspberry-pi raspbian