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 个导致这个致命错误的主要错误:
- 我的一位同事创建了一个脚本,该脚本在某个时刻反复查询数据库。这确实"eats"服务器上的大量内存
- 我的代码确实有漏洞,正如这篇great post中所描述的那样。
为了加强错误修复,我还设置了交换内存,之前没有设置过,如here所述。
盲目增加 max-old-size
不是一个好主意,直到你确认你的代码是 "leak-free" 并且你的服务器应用程序确实经常到达顶部内存(在我的应用程序中不是这种情况,它通常在40MB,而我的服务器仍有约 150-200MB 的空闲空间。
在我们修复错误后对服务器进行了数周的监控,服务器运行良好,没有任何警告或异常行为。
干杯,
我有 运行 我的服务器应用程序,用 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 个导致这个致命错误的主要错误:
- 我的一位同事创建了一个脚本,该脚本在某个时刻反复查询数据库。这确实"eats"服务器上的大量内存
- 我的代码确实有漏洞,正如这篇great post中所描述的那样。
为了加强错误修复,我还设置了交换内存,之前没有设置过,如here所述。
盲目增加 max-old-size
不是一个好主意,直到你确认你的代码是 "leak-free" 并且你的服务器应用程序确实经常到达顶部内存(在我的应用程序中不是这种情况,它通常在40MB,而我的服务器仍有约 150-200MB 的空闲空间。
在我们修复错误后对服务器进行了数周的监控,服务器运行良好,没有任何警告或异常行为。
干杯,