MySQLOOM系统两OOM杀手

MySQLOOM系统两OOM杀手
这里有一个问题,谁是杀人者一般来说,对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的视角。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部