【问题标题】:Cannot allocate memory: fork: Unable to fork new process on aws无法分配内存:fork:无法在 aws 上创建新进程
【发布时间】:2017-06-15 06:31:20
【问题描述】:

我的服务器日志文件中出现此错误。

[2017 年 1 月 29 日星期日 00:22:43.570300] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

[2017 年 1 月 29 日星期日 00:22:53.742820] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

[Sun Jan 29 00:23:03.771702 2017] [core:notice] [pid 1205] AH00051: child pid 22134 退出信号中止 (6),/etc/apache2 中可能的核心转储

[Sun Jan 29 00:23:03.876081 2017] [core:notice] [pid 1205] AH00051: child pid 22135 exit signal Aborted (6), /etc/apache2 中可能的核心转储

[2017 年 1 月 29 日星期日 00:23:04.899489] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

[2017 年 1 月 29 日星期日 00:23:14.931272] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

[2017 年 1 月 29 日星期日 00:23:24.965639] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

[2017 年 1 月 29 日星期日 00:23:35.031174] [mpm_prefork:error] [pid 1205] (12)不能 分配内存:AH00159:fork:无法 fork 新进程

帮助解决问题。

【问题讨论】:

标签: php amazon-web-services


【解决方案1】:

cannot allocate memory 错误通常指向内存不足 (OOM) 错误。

这种情况经常发生在较小的 EC2 实例上,例如如果您尚未调整应用程序可以从操作系统请求的最大内存。

您的应用程序(在本例中为 Apache)尝试分配一些内存(根据其配置,它希望它应该能够请求)并且操作系统根本没有足够的空间来分配它。

一些常见的解决方案:

更多内存

升级到更大的 EC2 实例,只需提供更多可用内存。这显然不能解决问题的根本原因,但是 - 考虑到足够低的流量 - 它甚至可能导致它完全停止出现。

当然,如果您的预算允许,这只是一种选择...

添加硬盘支持的内存(交换)

更准确地说:考虑添加 swpa

至于如何创建一个 4GB 的交换文件:

sudo dd if=/dev/zero of=/var/swapfile bs=1M count=4096
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile

警告词:swap,如果使用不当,很容易导致恶劣的情况,例如thrashing

明智地使用现有内存

你会想要阅读Apache Performance Tuning

希望这会有所帮助!

【讨论】:

  • 当您谈到 Memory 时,您是指 RAM 吗?我的实例也有同样的问题...
  • 比你。你能解释一下sudo dd if=/dev/zero of=/var/swapfile bs=1M count=4096 的作用吗?
  • 确定 - dd 创建一个文件(of - 输出文件),其中填充了 4096 个(计数)块的零(if - 从 /dev/zero 输入),每个大小为 1兆字节。 (即 4GB)。 sudo 用于写入/var 的权限
  • free 命令刚刚显示我的交换静态 100% 正在使用中。我没有找到比重启机器更快的方法来解决这个问题
【解决方案2】:

我在使用 ECS 集群上运行的 Docker 容器提供的 Wordpress 应用程序 (PHP v7.4) 上遇到了同样的问题。以下步骤帮助我解决了这个问题:

  1. 根据您的应用程序内存需求增加任务定义中的Task Memory (MiB)Task CPU (unit)
  2. 如果之前定义过,还要增加容器定义中的Hard/Soft memory limits (MiB)
  3. 更新 ECS 集群以指向新的任务定义。
  4. 杀死正在运行的任务以强制 ECS 服务根据新任务定义启动新任务。

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 2017-09-24
    • 2014-11-25
    • 2011-12-12
    • 2015-08-17
    • 1970-01-01
    • 2018-11-19
    • 2013-10-30
    相关资源
    最近更新 更多