Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2304128
  • 博文数量: 318
  • 博客积分: 8752
  • 博客等级: 中将
  • 技术积分: 4944
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 07:56
文章分类

全部博文(318)

文章存档

2019年(1)

2017年(2)

2016年(12)

2015年(2)

2014年(1)

2013年(17)

2012年(22)

2011年(9)

2010年(37)

2009年(33)

2008年(44)

2007年(43)

2006年(95)

分类: LINUX

2016-02-02 10:29:29

当内存严重不足时,内核有两种选择:1.直接panic 2.杀掉部分进程,释放一些内核。通过/proc/sys/vm/panic_on_oom可以控制,当panic_on_oom为1时,直接 panic,当panic_on_oom为0时内核将通过oom(Out Of Memory)killer杀掉部分进程。
     对于每个进程都有一个oom_score的属性(/proc/PID/oom_score),oom killer会杀死oom_score较大的进程,当oom_score为0时禁止内核杀死该进程。对过设置/proc/PID/oom_adj可以改变 oom_score,oom_adj的范围为【-17,15】,当oom_adj=-17时,oom_score将变为0。
     综上,可以通过命令 echo 0 > /proc/PID/oom_adj 来防止进程被oom_killer杀死。


参考:

Out of Memory (OOM)

Out of Memory (OOM) refers to a computing state where all available memory, including swap space, has been allocated. Normally this will cause the system to panic and stop functioning as expected. There is a switch that controls OOM behavior in /proc/sys/vm/panic_on_oom. When set to 1 the kernel will panic on OOM.A setting of 0instructs the kernel to call a function named oom_killer on an OOM. Usually, oom_killer can kill rogue processes and the system will survive.

1.     The easiest way to change this is to echo the new value to /proc/sys/vm/panic_on_oom.

2.  # cat /proc/sys/vm/panic_on_oom

3.  1

4.   

5.  #  echo 0 > /proc/sys/vm/panic_on_oom

6.   

7.  # cat /proc/sys/vm/panic_on_oom

8.  0

9.     It is also possible to prioritize which processes get killed by adjusting the oom_killer score. In /proc/PID/there are two tools labelled oom_adj and oom_score. Valid scores for oom_adj are in the range -16 to +15. This value is used to calculate the 'badness' of the process using an algorithm that also takes into account how long the process has been running, amongst other factors. To see the current oom_killer score, view theoom_score for the process. oom_killer will kill processes with the highest scores first.

This example adjusts the oom_score of a process with a PID of 12465 to make it less likely that oom_killerwill kill it.

# cat /proc/12465/oom_score

79872

 

# echo -5 > /proc/12465/oom_adj

 

# cat /proc/12465/oom_score

78

10.   There is also a special value of -17, which disables oom_killer for that process. In the example below,oom_score returns a value of O, indicating that this process would not be killed.

11. # cat /proc/12465/oom_score

12. 78

13.  

14. # echo -17 > /proc/12465/oom_adj

15.  

16. # cat /proc/12465/oom_score

0

 

 

oom_dump_tasks

Submitted by  on Tue, 2009-12-01 03:57 

Enables a system-wide task dump (excluding kernel threads) to be produced when the kernel performs an OOM-killing and includes such information as pid, uid, tgid, vm size, rss, cpu, oom_adj score, and name. This is helpful to determine why the OOM killer was invoked and to identify the rogue task that caused it.

If this is set to zero, this information is suppressed. On very large systems with thousands of tasks it may not be feasible to dump the memory state information for each one. Such systems should not be forced to incur a performance penalty in OOM conditions when the information may not be desired.

If this is set to non-zero, this information is shown whenever the OOM killer actually kills a memory-hogging task.

The default value is 0.

oom_kill_allocating_task

Submitted by  on Tue, 2009-12-01 03:59 

This enables or disables killing the OOM-triggering task in out-of-memory situations.

If this is set to zero, the OOM killer will scan through the entire tasklist and select a task based on heuristics to kill. This normally selects a rogue memory-hogging task that frees up a large amount of memory when killed.

If this is set to non-zero, the OOM killer simply kills the task that triggered the out-of-memory condition. This avoids the expensive tasklist scan.

If panic_on_oom is selected, it takes precedence over whatever value is used in oom_kill_allocating_task.

The default value is 0.
阅读(1515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~