这里有一个问题,谁是杀人者一般来说,对Linux内核的第一
反应有点了解是谁使用,谁败杀。这当然是在Linux内核中的一个重要因素是首先要考虑的,但这是不完全的,我们查了一些关于Linux内核的信息,可以知道杀谁的/过程 / / oom_score确定,每个过程的价值,是由Linux内核oom_badness()
函数的计算,然后让我们读恶()函数仔细。
在
错误()函数的注释中,描述了错误()函数的
处理思想。
1)我们失去了完成的最低
工作量。
2)我们
恢复了大量的
内存。
3)我们不会杀死任何无辜地吃掉大量记忆的东西。
4)我们想杀死最小数量的
进程(一)
5)我们试图杀死
用户期望我们的过程,也称为侯。
一般来说,获得最大内存量的过程是杀死最小数量的过程,这与我们的捕获占用最大内存的过程是一致的。
*
*进程的内存大小是坏结果的基础。
* /
点= P -> -> total_vm毫米;
起动过程对内存的实际使用率,注意这里不包括掉期,OOM Killer只会物理内存和交换的实际过程,也不要紧,我们可以看到更多的物理内存的实际使用过程中,得分越高,得分越高更可能被牺牲。
*
*有许多子进程的进程很可能是
* OD选择。我们把孩子vmsize如果他们
*拥有自己的MM。这可以防止分叉
服务器洪水
*有无数孩子的机器
* /
…
如果(CHLD ->毫米!= P>毫米CHLD ->毫米)
点= CHLD -> -> total_vm毫米;
本节表明,子进程占用的内存会在父进程计算。
S = int_sqrt(cpu_time);
如果(s)
点;
S = int_sqrt(int_sqrt(run_time));
如果(s)
点;
这表明CPU在进程中占用的时间越长,进程
运行的时间越长,得分越低,越容易被杀死。
*
* niced过程是最有可能不太重要,所以双
*他们的缺点。
* /
如果(task_nice(P)>0)
点* 2;
如果进程优先级较低(好值,正值为低优先级,负值为高优先级),则该点加倍。
*
*超级用户进程通常是更重要的,所以我们把它
*我们不太可能杀了那些人。
* /
如果(cap_t(P>cap_effective)cap_to_mask(cap_sys_admin)| |
P > UID = = 0 = = 0)| | P > euid
点4;
超级用户的进程优先级较低。
*
*我们不想用直接
硬件访问杀死进程。
*这不仅会搞乱硬件,而且通常会
影响用户。
*倾向于只有这个标志
设置在
应用程序,他们认为
*重要的。
* /
如果(cap_t(P>cap_effective)cap_to_mask(cap_sys_rawio))
点4;
直接访问原始设备的进程具有更高的优先级。
*
* oomkilladj
调整评分。
* /
如果(P>oomkilladj){
如果(P>oomkilladj > 0)
点oomkilladj;
其他的
点= -(P>oomkilladj);
}
每个进程有一个进程被杀死oomkilladj可以设置这个
参数的优先级似乎还是比较大的,oomkilladj最大15,最小是17,更容易被杀,这个值是由于移位
操作,因此影响相对较大。
现在我写一个小程序来实验。
#定义兆1024 * 1024 * 1024
#包括
#包括
#包括
int main(int argc、argv char * { })
{
void *泮佛罗宁= null;
泮佛罗宁=(void *)malloc(兆字节);
printf(目前分配1GB ;
睡眠(1);
int计数= 0;
同时(计数< 10)
{
memset(泮佛罗宁,1100×1024×1024);
泮佛罗宁= 1024 * 1024 + 100 *泮佛罗宁;
计数+;
printf(目前分配% D00 MB
睡眠(10);
}
出口(0);
}
上述程序首先应用于1G内存
空间,然后100M是一个填充内存空间的单元。在2G内存中运行3个进程,4亿字节交换空间。让我们看看操作结果。
test1,test2,test3申请和1G的虚拟内存空间(虚拟),然后每10s,实际占用的RAM空间增加100m(RES)。
当物理内存空间不足时,OS开始交换,可用交换空间开始减少。
当记忆是不可转让的空间,test1的过程是被操作
系统杀死。Dmesg,我们可以看到,测试过程是下降了OS杀死,并oom_score 1000。
这3个过程的oom_adj是
默认值0。让我们随着oom_adj.reboot 3过程的影响的实验中,我们看到,一个PID 12640
让我们运行以下语句
回声15 > / proc / 12640 / oom_adj
过了一会儿,我们看到交换空间急剧减少,基本的
操作系统oom_killer正要开始。
当然,毫不奇怪,12640个过程被杀死了。
所以为了避免你所需要的过程是顺便杀死,它可以通过设置过程的oom_adj实现。当然,有些人会说,这些
都是造成超售。由于Linux提供了overcommit_memory,过量使用可以被禁用。为什么不呢它既有优点和缺点,一旦停用过量使用,意味着MySQL不能申请超过实际内存空间,而在MySQL,有很多的动态内存,如果应用程序没有,MySQL将崩溃,这大大增加了MySQL的风险降低,这也是为什么Linux是过量使用。
结合上述分析,我们可以看到,如果oom_adj并不成立,MySQL通常会成为oom_killer的首选对象,因为MySQL通常是内存的最大用户,MySQL,我们怎样才能避免被杀的危险,下一章我们将重点放在如何避免OOM从MySQL的视角。