NodeJS - 可能内存不足?

NodeJS - Possibly memory lack?

我有 运行 我的服务器应用程序,用 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

谢谢

Is it due to my physical server is running out of memory?

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

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

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

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

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

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

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

盲目增加 max-old-size 不是一个好主意,直​​到你确认你的代码是 "leak-free" 并且你的服务器应用程序确实经常到达顶部内存(在我的应用程序中不是这种情况,它通常在40MB,而我的服务器仍有约 150-200MB 的空闲空间。

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

干杯,