【问题标题】:Amazon EC2 Electric Fence Exiting: mprotect() failed: Cannot allocate memoryAmazon EC2 电子围栏退出:mprotect() 失败:无法分配内存
【发布时间】:2026-01-13 07:40:02
【问题描述】:

在 Amazon EC2 实例(t2.small,俄勒冈州,Ubuntu 16.04)中执行我的程序时,出现错误

ElectricFence Exiting: mprotect() failed: Cannot allocate memory

启动实例后我遵循的步骤是:

  1. 安装 build-essentials、pip 和 cmake

    sudo apt-get update && sudo apt-get install build-essential python-pip cmake

  2. 安装柯南包管理器

    pip install conan

  3. 克隆存储库

    git clone https://github.com/oyarsa/faptp.git

  4. cd 到 repo,创建 build 文件夹,安装依赖并运行 cmake

    mkdir build && cd build conan install .. -s compiler=gcc -s compiler.libcxx=libstdc++11 --build=missing cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release cmake --build .

  5. 编译后回到根目录尝试运行程序

    cd .. && ./build/bin/faptp

在执行此操作时,程序会执行一段时间,然后以以下输出退出:

SA-ILS

ElectricFence Exiting: mprotect() failed: Cannot allocate memory

SA-ILS 是我的程序的输出。 ElectricFence 的错误是问题所在。我以前从未听说过,这是我第一次在 EC2 中运行这个程序,所以我认为它与它有关。

如果有帮助,源代码位于https://github.com/oyarsa/faptp

【问题讨论】:

    标签: amazon-web-services ubuntu amazon-ec2 electric-fence


    【解决方案1】:

    您确定错误不是因为它无法分配更多内存吗?

    t2.small 实例有 2GB 的 RAM,默认情况下不启用交换。因此,如果您需要更多,您将看到该错误。

    有一种简单的方法可以确定这是否是操作系统的问题,或者您是否真的内存不足:停止实例,将其更改为更大的实例类型,然后重新启动它。一个 t2.large 有 8GB 的​​ RAM,如果你不让它运行超过一个错误,启动一个并测试它会花费你 0.094 美元。如果可行,请尝试 t2.medium,试用费用为 0.047 美元。 (或者,如果浪费一毛钱太贵,你可以尝试从 t2.medium 开始)

    【讨论】:

    • 我试过了,问题依旧。这个电子围栏库是 OpenSSL 的一个依赖项(它是 libcurl 的一个依赖项,它是 cpr 的一个依赖项),虽然有一种方法可以禁用它,但我不知道如何在这个依赖链中做到这一点。我最初认为这是因为 AWS 内部的一些限制,但我只是在 VM 上测试了它,结果是一样的。我将删除 CPR 依赖项(这样做应该很简单),然后重试。
    • 移除心肺复苏术(以及电子围栏),它工作正常。不过,我想了解为什么会遇到这些问题...