【问题标题】:Under what condition does Linux Kernel kills a process leaking memory?Linux Kernel 在什么情况下会杀死泄漏内存的进程?
【发布时间】:2016-02-18 07:24:34
【问题描述】:

在一台Linux服务器上检测到我的服务进程内存泄露,占用了1.2G的物理内存,而且消耗越来越大。

当我查看内存泄漏的代码时,我注意到进程已重新启动(如果此进程由 supervisord 管理,则如果被终止,它将重新启动)。进程的日志中没有错误日志或恐慌。所以我的猜测是它被内核杀死了。

内核何时终止一个正在泄漏内存的进程?什么时候消耗太多内存?还是分配内存太快?

【问题讨论】:

  • 投票结束这个问题的人,愿意给出一个理由吗?或者你只是“关闭”巨魔

标签: linux memory memory-leaks kernel


【解决方案1】:

内存泄漏会导致系统内存不足。如果内存变得非常低,OOM(Out Of Memory)杀手将被调用以尝试从低内存状态中恢复。 OOM Killer 将终止一个或多个消耗更多内存且最不重要(低优先级)的进程。通常,如果没有可用的用户地址空间或没有可用的页面,将调用 OOM 杀手。

OOM Killer 使用 select_bad_process(),badness() 来确定并杀死进程。这些函数通过根据各种因素为所有进程分配分数/分数来确定进程,例如进程的 VM 大小、子进程的 VM 大小、正常运行时间、优先级、是否进行任何硬件访问、是否是交换器或初始化或内核线。具有最高分/得分(坏)的进程被终止/杀死。

另外,检查内核的过度使用行为(/proc/sys/vm/overcommit_memory、/proc/sys/vm/overcommit_ratio)和进程的地址空间限制是否合适。

Valgrind 是在这种情况下识别内存泄漏的非常方便的工具。

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 2015-04-11
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多