【问题标题】:NodeJS - Possibly memory lack?NodeJS - 可能内存不足?
【发布时间】:2017-06-29 17:18:31
【问题描述】:

我已经运行了大约 15 天的用 NodeJS 编写的服务器应用程序。然后突然〜4小时前,它崩溃并重新启动。感谢forever 脚本,我发现了以下错误:

(node:30317) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 completed listeners added. Use emitter.setMaxListeners() to increase limit
(node:30317) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 completed listeners added. Use emitter.setMaxListeners() to increase limit
FATAL ERROR: Committing semi space failed. Allocation failed - process out of memory
 1: node::Abort() [MyServerApp]
 2: 0x126264c [MyServerApp]
 3: v8::Utils::ReportOOMFailure(char const*, bool) [MyServerApp]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [MyServerApp]
 5: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [MyServerApp]
 6: v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, char const*, char const*, v8::GCCallbackFlags) [MyServerApp]
 7: v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [MyServerApp]
 8: v8::internal::Runtime_AllocateInTargetSpace(int, v8::internal::Object**, v8::internal::Isolate*) [MyServerApp]
 9: 0xccdc6808506
(node:14681) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 completed listeners added. Use emitter.setMaxListeners() to increase limit
(node:14681) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 completed listeners added. Use emitter.setMaxListeners() to increase limit

这可能是什么错误?是不是因为我的物理服务器内存不足?

我的物理服务器是AWS t2 micro实例,内存压力在:78x/992MB左右

以下是我的服务器应用程序的信息,由htop 打印:

VIRT: 1181M
RES: 32816
SHR: 9452
CPU%: 0
MEM%: 3.3

谢谢

【问题讨论】:

  • 这通常意味着您正在创建新对象而不取消引用旧对象。所以,垃圾收集器不会删除它们。遗憾的是,一些内存泄漏很难追踪。

标签: node.js amazon-web-services out-of-memory


【解决方案1】:

是不是因为我的物理服务器内存不足?

是的。这可能是由于内存泄漏,或者只是因为有太多并发用户,您需要更多 RAM (--max_old_space_size=<size>) 或更优化的代码来处理所有这些。

假设它是内存泄漏是安全的,因此将 NodeJS 视为一个敌人,一个不会友好地告诉你错误在哪里的人。你需要学习调试、编写测试、运行它们......我的朋友,如果你认为到目前为止还很艰难,我恐怕告诉你最坏的情况还没有到来。

【讨论】:

    【解决方案2】:

    我假设(根据日志)在您的代码中的某处,您经常将事件侦听器附加到同一个事件发射器,这会造成内存泄漏,因为每个侦听器都需要更多内存。这很可能是一个错误,不需要附加所有那些重复的事件侦听器。

    NodeJS 有内存限制,但这是一个单独的非常复杂的问题,我不认为这是你的情况。

    【讨论】:

      【解决方案3】:

      我在我的服务器中发现了两个导致此致命错误的主要错误:

      1. 我的一位同事创建了一个脚本,该脚本在某个时刻重复查询数据库。这确实“吃掉”了服务器上的大量内存
      2. 我的代码确实存在泄漏,正如great post 中所描述的那样。

      为了加强错误修复,我还设置了之前未设置的交换内存,如 here 所述。

      在您确认您的代码“无泄漏”并且您的服务器应用程序确实经常达到顶部内存之前,盲目增加max-old-size 不是一个好主意(在我的应用程序中不是这种情况,通常在 40MB 左右,而我的服务器仍有约 150-200MB 可用空间)。

      在我们修复错误后对服务器进行了数周的监控,服务器运行良好,没有任何警告或奇怪的行为。

      干杯,

      【讨论】:

        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多