【问题标题】:Linux kill my process for out of memory, how to see how much I use?Linux因为内存不足而杀死我的进程,如何查看我使用了多少?
【发布时间】: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


    【解决方案1】:

    首先,您需要确定操作系统杀死了哪些系统进程。 然后我会启用.core 倾倒并分析它。请检查ulimit -c 命令和 适当的配置来获得这个。当然,您需要为您的程序启用调试符号才能获得大部分功能。

    如果您无法转储(没有足够的空间或任何其他限制),请考虑在客户端使用调试版本的进程进行远程调试。我认为您应该能够为此使用“远程 GDB 调试”之类的东西。

    很可能你的进程在某些内存分配上失败了,这很有可能解释你在哪里“吃”了内存,谁有罪,可能该怎么办。

    希望这会有所帮助。

    【讨论】:

    • 被杀死的进程是 node.js,我在启动我的应用程序时启动它。 ulimit -c 给我 0,因为我的应用程序没有在任何浏览器中启动也没有被编译,我找不到任何方法来查看调试符号。由于我自己不做任何内存分配,我假设 http.get 做了一些,但我仍然不明白为什么进程在应该吃更少的内存时被更快地杀死。我正在寻找如何转储核心,因为我从来没有这样做过,在 *nix 系统上也没有很多经验。当我能得到一些时,我会提供更多细节。
    【解决方案2】:

    您还可以使用/proc/ 文件系统(尤其是/proc/self/statm/proc/$PID/statm 等...),请参阅proc(5) 来获取内存状态。

    /proc/ 中还有其他有趣的伪文件,尤其是 /proc/meminfo/proc/$PID/maps 等...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2018-09-30
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多