OOM Killer机制

oom killer

概念

oom killer是内核设计的一种机制,在内存不足时选择一个占用内存较大的进程把他杀死,释放这一部分内存来满足内存请求的的需求。

oom(out of memory)

OOM(Out of Memory)指Linux在无可用内存时的一个最后策略。当系统中可用内存过少时,OOM killer会选择kill某些进程,来释放这些进程所占用的内存。

void out_of_memory(int gfp_mask)
{
   
	struct mm_struct *mm = NULL;
	task_t * p;

read_lock(&tasklist_lock);

retry:
	p = select_bad_process();//挑选合适的进程,大页框,少损失,低静态优先级,非root权限,不能是特殊进程

if (PTR_ERR(p) == -1UL)
	goto out;

/* Found nothing?!?! Either we hang forever, or we panic. */
if (!p) {
   //如果没有合适的进程
	read_unlock(&tasklist_lock);
	show_free_areas();
	panic("Out of memory and no killable processes...\n");
}

printk("oom-killer: gfp_mask=0x%x\n", gfp_mask);
show_free_areas();
mm = oom_kill_process(p);//调用oom_kill_process删除进程p
if (!mm)
	goto retry;

 out:
	read_unlock(&tasklist_lock);
	if (mm)
		mmput(mm);

/*

 * Give "p" a good chance of killing itself before we
 * retry to allocate memory.
   */
   __set_current_state(TASK_INTERRUPTIBLE);
   schedule_timeout(1);

}

触发时机

现代内核通常在分配内存时,允许申请的内存量超过实际可分配的free内存,这种技术称为Overcommit,可以认为是一种内存超卖的策略。开启了Overcommit,其实是基于一个普遍的规律——大部分应用并不会将其申请的内存全部用满——来尽量提升内存的利用率,可以允许系统分配出的内存总和超过系统能提供之和(物理内存+Swap空间),但是这种做法也导致OOM的风险。

​ overcommit的策略。

通过内核参数vm.overcommit_memory来进行控制,取值如下

  • 0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

  • Overcommit的内存过大将会失败,轻微的Overcommit将被允许。(如何区分?)

  • 1 永远允许Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。

  • 2 永远禁止Overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。

事实上,如果选择2的话,在某些情况下内存得不到申请,又没办法释放内存,会导致系统死机。

可以查看本机上的overcommit

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值