无法分配内存:fork:无法 fork 新进程?

Posted

技术标签:

【中文标题】无法分配内存:fork:无法 fork 新进程?【英文标题】:Cannot allocate memory: fork: Unable to fork new process? 【发布时间】:2015-04-27 05:48:07 【问题描述】:

我们在aws 进行托管。最近在将我们的博客从wordpress 移动到aws 之后,我们的服务器响应时间出现了明显的延迟。主要是在访问博客时。以下是来自error_log 文件的日志,

[Wed Feb 25 06:10:10 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Wed Feb 25 06:12:22 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Wed Feb 25 06:12:36 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Wed Feb 25 06:12:50 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Wed Feb 25 06:13:35 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[error] (12)Cannot allocate memory: fork: Unable to fork new process
[Wed Feb 25 06:27:14 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process

我们将php.ini 文件中的内存大小从 256 增加到 512 mb。但是,问题仍然存在。

我们还将 KeepAlive 更改为 On。仍然没有解决。任何建议/解决方案都会有很大帮助。

【问题讨论】:

这通常是由于交换文件空间不足造成的。没有它,即使系统有足够的空闲 RAM,系统也必须拒绝 fork 操作。 Muruga,在发生这种情况以及机器处于健康状态时发布“free -m”的值。 【参考方案1】:

我在 AWS 的虚拟机上的 ubuntu 上使用 jenkins、mysql 和 tomcat 托管 java 应用程序时遇到了这个问题。

我用来解决重启虚拟机问题的第一步。

默认情况下,AWS 不会在硬盘驱动器上提供交换内存,因此您最好亲手制作。如何做到这一点你可以找到here。需要提一下:交换区的解决方案(不知道为什么)对我不起作用,我必须创建一个交换文件。

祝你好运!

【讨论】:

是的,我发现非常非常偶然的事情会触发我的 apache 服务器(运行 WP)刚好超过其内存使用量。通常它会是一些抓取机器人或 DDOS 附加。这可能每周发生一次,可能不会持续 6 周。分配 1GB 交换驱动器(在 2GB 内存 T2.small 实例上)的解决方案非常有效,因为它就像一个旧的大型安全网,这意味着即使该交换驱动器不用于 99.9,您也不会耗尽内存% 的时间。 这个答案如何获得最多的支持? Wordpress 是用 php 编写的,通常与 Apache 一起运行。虽然它确实使用了 mysql,但它是一个 java 应用程序,jenkins 和 tomcat 与 wordpress 内存错误无关。重启实例实际上并不能解决问题,而是推迟了它。【参考方案2】:

我有同样的问题来解决它,有 2 个选项:

1- 从微型实例转移到小型实例,这是解决问题的改变(亚马逊上的微型实例往往有大量 CPU 窃取时间)

2- 调整 mysql 数据库服务器配置和我的 apache 配置以使用更少的内存。

内存不足情况的调优指南,例如:http://www.narga.net/optimizing-apachephpmysql-low-memory-server/ (但不要使用 MyISAM 表的建议 - 太可怕了......)

这 2 个选项将使问题的发生少得多.. 我仍在寻找更好的解决方案来关闭已完成的进程并杀死那些挂在那里的进程。

【讨论】:

我在 m4 large 和 t2 large 上得到这个:/【参考方案3】:

将 Apache 的 prefork MPM 更改为 httpd.conf 这些是我最终使用的值:

StartServers 1

MinSpareServers 1

MaxSpareServers 5

ServerLimit 16

MaxClients 16

MaxRequestsPerChild 0

听积压 100

然后,尝试停用一些模块 php sudo a2dismod name_of_module

【讨论】:

以上是关于无法分配内存:fork:无法 fork 新进程?的主要内容,如果未能解决你的问题,请参考以下文章

5进程创建FORK

明明还有大量内存,为啥报错“无法分配内存”?

明明还有大量内存,为啥报错“无法分配内存”?

明明还有大量内存,为啥报错“无法分配内存”?

将新任务分配给 forked() 进程

fork与vfork的用法与区别