如何诊断 Web 服务器内存峰值?

如何诊断 Web 服务器内存峰值?

我的 Web 服务器偶尔会出现莫名其妙的内存峰值(最终崩溃),我不知道是什么原因造成的,也不知道该如何解决。我花了一上午的时间查看错误和访问日志,但没发现任何异常。

我有 3 张图片:

  1. 服务器状态图:
    https://i.stack.imgur.com/6QnsQ.png

  2. 顶部:
    https://i.stack.imgur.com/ZYY1P.png

  3. ps aux:(编辑 - 因为我太新了,所以网站不允许我发布第三篇)

任何有助于解决这个谜团的帮助都将不胜感激。

答案1

您能否将/proc/meminfo输出粘贴到 pastebin 中。

另外,我不知道您何时拍摄了 top 的快照,但我看到您没有使用任何缓存内存。您知道为什么会这样吗?或者您之前注意到过吗?

/var/log/messages除此之外,您能否提供事故发生前的相关细节?

顺便说一句,一个 httpd 进程处于 Z 状态,但这不会导致问题。

另外,查看 sar 日志以查看是否可以识别任何内存使用模式。

答案2

您有 2G 的 RAM,并且正在运行 MySQL、Apache 的 HTTPd、qmail、spamd……所有这些都需要内存,因此您需要增加内存并在系统上设置 SWAP。

答案3

找出导致实时服务器内存峰值的原因并非易事。由于您拥有一系列服务,其中任何一个都可能是罪魁祸首,因此这将更加棘手。

为了偷懒,我让 top 在按内存使用情况排序的终端中运行。这样,当服务器崩溃时,它会让我的终端停留在最后一个 top 屏幕,这至少可以告诉我哪个进程可能是罪魁祸首。

然后它与该服务合作,试图找出罪魁祸首。

在我们的案例中,这是由于 PHP 的最大内存设置得太高造成的。

导致问题的原因是,一旦子进程使用了​​一定量的内存,apache 就不会清除内存,直到该子进程被回收,而这可能在很长时间内都不会发生。

这会积累并最终消耗掉所有的记忆。

我没有使用过 qmail,所以无法评论它的内存使用情况,但 mysql 的默认设置往往使用大约 50m,如您上面所示。

祝你好运

相关内容