我有一台 Ubuntu 机器,大部分时间运行正常,但每隔几天就会发生以下两种情况之一:
- 我将登录到计算机,并且每次尝试运行任何命令时都会收到“无法分配内存”消息
- 我将尝试通过 SSH 连接到计算机,但会收到一条错误消息,提示“远程主机已关闭连接”
如果我登录到我的主机的 Web 界面并重新启动服务器,问题将完全消失,但它总会再次出现。
我不知道如何解决此问题。每次我这样做时top
它看起来都很正常。有什么建议吗?
编辑:这是我的top
输出(几天内,按内存使用情况排序):http://pastebin.com/x1CbFLrA
答案1
我同意 sybreon 的观点,这听起来像是内存泄漏。如果一台机器运行一段时间后,最终变得无法使用,并在重新启动后立即恢复正常,那么这几乎肯定是内存泄漏。
您发布的有关“无法分配内存”的错误消息也证实了这一点。
top 命令默认按 CPU 使用率对输出进行排序。在 top 中,点击米按钮将按内存使用情况对输出进行排序。然后,留意 %MEM 列。如果您有一个进程泄漏内存,那么它最终会上升到顶部。
我还会留意“Mem:”行中的第 3 列,其中列出了机器上的可用内存。
答案2
听起来像是负载问题。服务器的规格是什么?负载是多少?
安装 Ganglia:http://ganglia.sourceforge.net/。这是我首选的负载故障排除工具。您一定会喜欢它。
启用并查看日志以获取更多线索。
答案3
那是一个非常小的盒子;它可能是 VPS 吗?如果是这样,那么这个盒子可能超额认购,即使你的机器认为还有可用内存,你也无法分配 RAM。
或者,基于:
在我检查了几分钟后
top
,发现占用内存最多的进程只使用了 8.4%,然后我又开始收到常规错误:-bash: fork: Cannot allocate memory
您可能MaxClients
在 Apache 配置中设置得太高了。我在输出中看到的最大值top
为 32M 左右;在 1GB VPS 上,这意味着 MaxClients 为 32 或更高可能会不安全*。
*:是的,在某些情况下,这种说法非常不准确。但这仍然是一个很好的经验法则。