理解和配置Linux下的OOMKiller

理解和配置Linux下的OOMKiller

ID:41389398

大小:67.24 KB

页数:5页

时间:2019-08-23

理解和配置Linux下的OOMKiller_第1页
理解和配置Linux下的OOMKiller_第2页
理解和配置Linux下的OOMKiller_第3页
理解和配置Linux下的OOMKiller_第4页
理解和配置Linux下的OOMKiller_第5页
资源描述:

《理解和配置Linux下的OOMKiller》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、这儿天用C++11写了个游戏服务器,跑在Windows/FreeBSD/Linux上都没问题,结果在Linux做压力测试的时候经常会挂掉,运行30分钟后系统提示Killed-这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发Linux内核里的OutofMemory(OOM)killer,OOMkiller会杀掉某个进程以腾出内存留给系统用,不致于让系统挂掉。如果检查相关的日志文件(/var/log/messages)就会看到下血类似的Outofmemory:Killprocess信息:Apr1609:45:53d

2、ebiankernel:[76149.969715]Outofmemory:Killprocess8487(TCPServer)score28orsacrificechildApr1609:45:53debiankernel:[76149.970289]K订ledprocess8487(TCPServer)total-vm:162584kB,anon-rss:28912kB,filerss:OkBLinux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分

3、内存是属于每个进程的,内核直接冋收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commitmemory)的办法来间接利用这部分“空闲”的内存,提高整体内存的使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括swap)的容量,内核(OOMkiller)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子來讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的

4、时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oomkill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个“bad”进程杀掉,如何判断和选择一个“bad”进程呢,总不能随机选吧?挑选的过程由oom_badness()决定,挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。longpoints;longadj;if(oomunki1lablet

5、ask(p,menicg,nodemask))return0;p=findlocktaskmm(p);if(!p)return0;adj-(1ong)p->signa1->oomscoreadj;if(adj==OOMSCOREADJMIN){taskunlock(p);return0;}*ThebasciincforthebadnossscoreistheproportionofRAMthateach*task'srss,pagetableandswapspaceuse・*/points=getmmrss(p->mm)+p->mm-p

6、ies+gct_mm_counter(p->mm,MM_SWAPENTS);task_unlock(p);/**Rootprocessesget3%bonus,justlikethevmenoughmemory()*imp1emcntationusedbyLSMs・*/if(has_capability_noaudit(p,CAP_SYS_AI)MIN))adj-=30;/*Normalizetooomscoreadjunits*/adj*=totalpages/1000;points+-adj;/**Neverreturn0foran

7、eligibletaskregardlessoftherootbonusand*oomscoreadj(oomscoreadjcan'tbeOOMSCOREADJMINhere)・*/returnpoints>0?points:1;上面代码里的注释写的很明白,理解了这个算法我们就理解了为啥MySQL躺着也能屮枪了,因为它的体积总是最大(一般来说它在系统上占用内存最多),所以如果OutofMemeory(00M)的话总是不幸第一个被Mil掉。解决这个问题最简单的办法就是增加内存,或者想办法优化MySQL使其占用更少的内存,除了优化MySQ

8、L外还可以优化系统,让系统尽可能使用少的内存以便应用程序(如MySQL)能使用更多的内存,还有一个临时的办法就是调整内核参数,让MySQL进程不容易被OOMkiller发现。配置OOMkiller我们可以通

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。