Linux杀掉我的进程内存不足,怎么看我用了多less?

继我以前的问题( 防止我的node.js应用程序被操作系统杀死 ),我已经重写了我如何下载文件的gestion。

为了使它简短,我需要下载一些video文件(testing文件是3video,MP4,〜3分钟),我一次全部下载,过程中被杀死,dmesg说(2下载完成后):

Out of memory: kill process (node) score 824 or sacrifice child Killed process (node)... 

所以我通过下载video一个又一个地重试,但在第二次下载,我得到完全相同的消息,我的程序被杀害。

有什么方法可以看到我的代码的哪一部分出错了,或防止Linux杀死我的进程?

顺便说一句,不是三个同时下载比一个吃了更多的内存? 那么,为什么我会一个接一个地杀人呢?

该应用程序运行在树莓派,没有GUI,raspbian,我相信是唯一的应用程序正在运行(除了系统进程)

编辑:关于function的一些细节,以及我认为现在如何工作:应用程序是在节点启动,而不是在任何浏览器。 由于一个接一个下载video,我以为会less吃点内存,但是因为我一下子下载了更多的数据,似乎是错误的,原因是停止似乎是一样的。

这里的下载function,以防万一它可以帮助:

file_url的types是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是可行的,因为我成功地下载了一些文件。

在这里,我如何做下载:(这个function可能不完全正确,我不要求debugging,我永远不会结束它。)

 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:

由于我还没有find一种方法来核心转储或罗曼提出的另一种解决scheme,我使用process.memoryUsage下载时打印它。

堆总数在整个过程中一直在缓慢增加,在2000万到2500万之间,有一些下降。 使用量迅速增加,在超过600万的时候,规模就降到了200万,有的达到了1200万。

当这个过程被杀害,最后一个打印是:rss:428 707 840,heapTotal:23 842 176,heapUsed:5 854 164

我注意到如何读取它,但在我看来,这个过程远没有吃掉所有的记忆。

我仍然在阅读关于核心倾销和/ proc /

EDIT3:

我的技术总监build议下载可能caching然后写在磁盘上的整个文件,这可以解释内存使用情况。 由于我可以结束下载2个video并在第三个结束时被杀死,所以它不会真正坚持一次性的情况,但我现在也在寻找

EDIT4:

没有最后编辑,我已经写了大块,给了我们关于为什么记忆起来的问题

首先,您需要确定哪些系统进程被操作系统杀死。 然后我会启用.core倾倒和分析。 请检查ulimit -c命令和适当的configuration来获得这个。 当然,你需要为你的程序启用debugging符号来获取大部分内容。

如果无法转储(没有足够的空间或其他限制),请考虑在客户端使用debugging版进程进行远程debugging。 我想你应该可以使用像'远程GDBdebugging'这样的东西。

很可能你的程序在内存分配上失败了,这很有可能解释你在哪里“吃”记忆,谁是有罪的,可能是怎么做的。

希望这会有所帮助。

你也可以使用/proc/ file系统(特别是/proc/self/statm/proc/$PID/statm等等),参见proc(5)获取内存状态。

/proc/ notably /proc/meminfo/proc/$PID/maps等中还有其他有趣的伪文件。