NodeJS - 可能是内存不足?

时间:2017-06-15 11:13:51

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

我运行了我的服务器应用程序,用NodeJS编写了大约15天。然后突然~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

由于

3 个答案:

答案 0 :(得分:1)

  

是否由于我的物理服务器内存不足?

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

可以安全地假设它是一个内存泄漏,所以把NodeJS想象成一个敌人,作为一个不会友好地告诉你你的错误在哪里的人。你需要学习调试,编写测试,运行它们......我的朋友,如果你认为到目前为止一直很困难,我恐怕会告诉你最坏的情况还未到来。

答案 1 :(得分:0)

我假设(根据日志)你的代码中的某个地方经常将事件监听器附加到同一个事件emmiter,这会产生内存泄漏,因为每个监听器需要更多的内存。它可能是一个错误,并且不需要附加所有这些重复的事件监听器。

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

答案 2 :(得分:0)

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

  1. 我的一位同事创建了一个脚本,该脚本在某个时刻反复查询数据库。这真的“吃掉了”服务器上的大量内存
  2. 我的代码确实存在泄漏,正如本great post中所述。
  3. 为了增强错误修复功能,我还设置了之前未设置的交换内存,如here所述。

    盲目增加max-old-size不是一个好主意,直​​到您确认您的代码是“无泄漏”并且您的服务器应用程序经常到达顶级内存(不是我的应用程序中的情况,通常大约40MB和我的服务器还有~150-200MB免费)。

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

    干杯,