使用/ var / log / messages调试内存不足


42

我的消息日志中将引发以下报告:

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

不管这个问题是针对还是无关紧要httpd,但我很好奇如何继续调试该问题。mysqldpostfix

我如何获得有关为什么PID 9163被杀死的更多信息,并且我不确定Linux是否将终止的PID的历史记录保存在某处。

如果您的消息日志文件中出现这种情况,您将如何逐步解决此问题?

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`

有关该问题的所有消息都显示在dmesg什么位置?
— Stark07年

有关OOM的有用详细信息-linux-mm.org/OOM_Killer。
— slm

Answers:


57

在此之前,内核会记录很多东西,但是大多数情况可能不会记录在内核中/var/log/messages,具体取决于您(r)syslogd的配置方式。尝试:

grep oom /var/log/*
grep total_vm /var/log/*

前者应该出现很多次,而后者则只能出现一两个地方。那就是您要查看的文件。

在还包含的文件之一中找到原始的“内存不足”行total_vm。在该行之前的三十秒到一分钟(可能更多,可能更少)中,您会发现:

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

您还应该在该行和“ Out of memory”行之间的某处找到一个表,其标题如下:

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

这可能不会告诉您比您已经知道的更多的信息,但是这些字段是:

  • pid进程ID。
  • uid用户ID。
  • tgid线程组ID。
  • total_vm虚拟内存使用情况(以4 kB页计)
  • rss常驻内存使用(每4 kB页)
  • nr_ptes页表条目
  • swapents掉期项
  • oom_score_adj通常为0;较小的数字表示调用OOM杀手时该进程不太可能死。

您几乎可以忽略nr_ptes,swapents尽管我相信这些是确定谁被杀的因素。这不一定是使用最多内存的过程,但很有可能是这样。有关选择过程的更多信息,请参见此处。基本上,以最高oom得分结束的过程被杀死了-这就是“内存不足”行中报告的“得分”;不幸的是,没有其他分数的报告,但是该表提供了一些有关因素的线索。

再说一次,这可能只不过说明了显而易见的事情:系统内存不足并mysqld选择了消亡,因为杀死它会释放最多的资源。这并不一定意味着mysqld做错了什么。您可以查看表以查看当时是否有其他任何异常,但是可能没有明确的罪魁祸首:系统可能由于错误判断或错误配置了正在运行的进程而耗尽了内存。


5
dmesg这是保证的地方。仅在/var/logsyslog守护程序从中读取/dev/kmsg(通常这样做)时,它才会进入。
— 帕特里克

2
@Patrick取决于您何时去看。如果将其记录在其中一个正常的文件日志中(应该是,或者您对记录器做过一些愚蠢的事情),它将存在很长时间,而此时,如果OP想要诊断发生的问题昨天或前一天等,dmesg即使系统处于运行状态,该记录也可能不再存在。
— goldilocks

6

关键在于消息本身- 内存不足。当Linux内核缺少虚拟内存(物理RAM和交换空间)时,它将开始杀死进程,而这正是这里发生的情况。似乎mysqld正在使用超过2GB的虚拟内存。

系统有多少RAM和交换空间?我会考虑添加额外的RAM,或者如果不可能的话,添加额外的交换。作为至少可以防止进程终止的快速解决方案,您可以添加交换文件。

更新:查看您拥有的RAM数量,您可以立即发现问题。您拥有约1.6GB的RAM和100MB的交换空间,但MySQL使用的RAM远远超过此数量。这就解释了为什么您看到进程被终止。


total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103 这是进程被杀死的同时的内存输出
— ibedelovski

您可以将其粘贴在原始邮件中,并保留格式吗?会更容易阅读。
— mjturner 2014年

我的格式真的不是很好...但是已经将其粘贴到原始消息中
— ibedelovski 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.