如何知道Linux上的一个OOM错误的原因

我有一个testingnetworking服务器。

有一次服务器如此反应迟钝,我不得不重新启动它。

查看日志我可以看到,如果内存和OOM杀手杀死mysqld服务器已经结束。

但是阅读一些关于OOM杀手的文档,我知道mysqld不一定(但也许是)是内存不足的原因。

因此,只有使用日志文件,我才能知道哪些进程导致了oom状况?

你如何定义OOM情况的“原因”? 这是使用最多内存的过程吗? 也许你有一个DB总是需要3GB的内存来运行,因此使用机器上的内存最多。 这是问题的“原因”吗? 可能不会。

最终导致问题的原因是“一个意外的情况,可能是也可能不是系统pipe理员的错误”。

有时你可以知道; 例如,如果你有进程记账设置(+1给@JamesHannah) ,你看到了3000个httpd或sshd进程(这很不寻常),你可能会责怪这个守护进程。

考虑到这一点,我提出来源:

/* * oom_badness - calculate a numeric value for how bad this task has been * @p: task struct of which task we should calculate * @p: current uptime in seconds * * The formula used is relatively simple and documented inline in the * function. The main rationale is that we want to select a good task * to kill when we run out of memory. * * Good in this context means that: * 1) we lose the minimum amount of work done * 2) we recover a large amount of memory * 3) we don't kill anything innocent of eating tons of memory * 4) we want to kill the minimum amount of processes (one) * 5) we try to kill the process the user expects us to kill, this * algorithm has been meticulously tuned to meet the principle * of least surprise ... (be careful when you change it) */ 

“因此,清算的理想人选是一个最近开始的,非特权的过程,与子女一起使用大量的记忆,已经很好,并且没有原始的I / O,就像一个nohup的并行内核构build并不是一个错误的select,因为所有的结果都保存在磁盘上,当“结束”时,很less有工作会丢失)。

来自http://linux-mm.org/OOM_Killer的评论块和引用无耻的被盗

你可以看到哪些进程(与pid)被OOM杀手所考虑,哪些进程通过运行dmesg而被杀死。 但我不知道如何去做一个日志文件。

只有在事件发生之前安装了某种取证软件才有可能,比如sysstat,psacct或类似软件。 否则,你是在黑暗中。

正如之前所暗示的,像psacct这样的东西,对于这种情况来说是完美的,只需很less的开销。 我使用顶上,我让日志坚持至less一年。 这并不意味着太多的数据,并允许您追溯事后发生的各种有趣的事情。 http://www.atcomputing.nl/Tools/atop/

默认情况下是5分钟的时间片,这可以很好地回溯到服务器为什么耗尽内存。 关于这一点的好处是,通常情况下,您可以回溯到进程首次在内存中增长的时间,然后查看日志中可能暗示该特定应用程序正在发生的事情的点。

我们刚刚在VMware上运行RHEL客户机时遇到了这个问题。 如果您的情况相同,请查看VMware的以下知识库文章: http : //kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&externalId=1002704

顺便说一下,如果这是一个反复出现的问题,并且您希望能够在将来诊断原因,那么我们以前使用的技术是使用以下方法创build更大的交换文件:

http://www.anchor.com.au/hosting/dedicated/UsingSwapfilesInLinux

很明显,这不会解决问题,但它应该给你足够的时间来进入和诊断的原因,机器内存不足和龙骨结束之前。