网站大量收购独家精品文档,联系QQ:2885784924

理解和配置 Linux 下的 OOM Killer.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
理解和配置 Linux 下的 OOM Killer

这几天用C++11写了个游戏服务器,跑在Windows/FreeBSD/Linux上都没问题,结果在Linux做压力测试的时候经常会挂掉,运行30分钟后系统提示Killed。这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统挂掉。如果检查相关的日志文件(/var/log/messages)就会看到下面类似的 Out of memory: Kill process 信息:...Apr1609:45:53 debian kernel:[76149.969715]Out of memory:Kill process 8487(TCPServer) score 28or sacrifice childApr1609:45:53 debian kernel:[76149.970289]Killed process 8487(TCPServer) total-vm:162584kB, anon-rss:28912kB, file-rss:0kB...Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于每个进程的,内核直接回收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commit memory)的办法来间接利用这部分 “空闲” 的内存,提高整体内存的使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括 swap)的容量,内核(OOM killer)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子来讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码?linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory() 被触发,然后调用 select_bad_process() 选择一个 “bad” 进程杀掉,如何判断和选择一个 “bad” 进程呢,总不能随机选吧?挑选的过程由 oom_badness() 决定,挑选的算法和想法都很简单很朴实:最 bad 的那个进程就是那个最占用内存的进程。/*** oom_badness - heuristic function to determine which candidate task to kill* @p: task struct of which task we should calculate* @totalpages: total present RAM allowed for page allocation** The heuristic for determining which task to kill is made to be as simple and* predictable as possible. ?The goal is to return the highest value for the* task consuming the most memory to avoid subsequent oom failures.*/unsignedlong oom_badness(struct task_struct *p,struct mem_cgroup *memcg,? ? ? ? ? ? ? ? ? ? ? ? ? const nodemask_t *nodemask,unsignedlong totalpages){? ? ? ? long points;? ? ? ? long adj;? ? ? ? if(oom_unkillable_task(p, memcg, nodemask))? ? ? ? ? ? ? ? return0;? ? ? ? p = find_lock_task_mm(p);? ? ? ? if(!p)? ? ? ? ? ? ? ? return0;? ? ? ? adj =(long)p-signal-oom_score_adj;? ? ? ? if(adj == OOM_SCORE_ADJ_MIN){? ? ? ? ? ? ? ? task_unlock(p);? ? ? ? ? ? ? ? return0;? ? ? ? }? ? ?

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档