我运行了我的服务器应用程序,用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
由于
答案 0 :(得分:1)
是否由于我的物理服务器内存不足?
是。这可能是由于内存泄漏,或者仅仅因为有这么多并发用户需要更多RAM(--max_old_space_size=<size>
)或更优化的代码来处理所有这些。
可以安全地假设它是一个内存泄漏,所以把NodeJS想象成一个敌人,作为一个不会友好地告诉你你的错误在哪里的人。你需要学习调试,编写测试,运行它们......我的朋友,如果你认为到目前为止一直很困难,我恐怕会告诉你最坏的情况还未到来。
答案 1 :(得分:0)
我假设(根据日志)你的代码中的某个地方经常将事件监听器附加到同一个事件emmiter,这会产生内存泄漏,因为每个监听器需要更多的内存。它可能是一个错误,并且不需要附加所有这些重复的事件监听器。
NodeJS有一个内存限制,但它是一个单独的非常复杂的问题,我不认为这是你的情况。
答案 2 :(得分:0)
我在服务器中发现了2个主要错误导致了这个致命的错误:
为了增强错误修复功能,我还设置了之前未设置的交换内存,如here所述。
盲目增加max-old-size
不是一个好主意,直到您确认您的代码是“无泄漏”并且您的服务器应用程序经常到达顶级内存(不是我的应用程序中的情况,通常大约40MB和我的服务器还有~150-200MB免费)。
在我们修复错误后的几周内监控服务器,服务器运行良好,没有任何警告或奇怪的行为。
干杯,