首页 > 解决方案 > 大的post请求使Nodejs服务器堆内存不足

问题描述

我正在运行一个 NodeJS 服务器,当它需要一个大的发布请求(> 100mb)时,它由于内存不足而失败。

我尝试设置 --max-old-space-size=8000,但即使我正确设置并检查它是否设置为 8GB,它也根本不起作用。

<--- Last few GCs --->
GC[20429:0x3851890]    12498 ms: Mark-sweep 400.5 (420.8) -> 316.5 (336.7) MB, 7.3 / 0.0 ms  (+ 5.3 ms in 1 steps since start of marking, biggest step 5.3 ms, walltime since start of marking 1796 ms) (average mu = 0.991, current mu = 0.994) allocation failu[20429:0x3851890]    15081 ms: Mark-sweep 700.5 (720.8) -> 412.5 (432.7) MB, 114.6 / 0.0 ms  (+ 0.0 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 2583 ms) (average mu = 0.967, current mu = 0.956) allocation fai

<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x3ac05b24fc5d]
Security context: 0x3661c71546f1 <JSObject>
    1: slice [0x3661c71409e9](this=0x0287971abf39 <Uint8Array map = 0x382c0352a4d1>,0)
    2: md5 [0x14615e91adb1] [/home/minjae/Dev/mednick_minjae/mednick_api_minjae/node_modules/md5/md5.js:16] [bytecode=0x16b93054ad39 offset=106](this=0x1dac4a782371 <JSGlobal Object>,0x0287971abf39 <Uint8Array map = 0x382c0352a4d1>,0x2eaf18e825b1 <undefined>)
    3: /* ano...

FATAL ERROR: invalid table size Allocation failed - JavaScript heap out of memory
 1: 0x95bd00 node::Abort() [/usr/bin/node]
 2: 0x95cc46 node::OnFatalError(char const*, char const*) [/usr/bin/node]
 3: 0xb3dbde v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/bin/node]
 4: 0xb3de14 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/bin/node]
 5: 0xf3ce52  [/usr/bin/node]
 6: 0x105f567 v8::internal::HashTable<v8::internal::NumberDictionary, v8::internal::NumberDictionaryShape>::New(v8::internal::Isolate*, int, v8::internal::PretenureFlag, v8::internal::MinimumCapacity) [/usr/bin/node]
 7: 0x105fdcd v8::internal::HashTable<v8::internal::NumberDictionary, v8::internal::NumberDictionaryShape>::EnsureCapacity(v8::internal::Isolate*, v8::internal::Handle<v8::internal::NumberDictionary>, int, v8::internal::PretenureFlag) [/usr/bin/node]
 8: 0x10607fb v8::internal::Dictionary<v8::internal::NumberDictionary, v8::internal::NumberDictionaryShape>::Add(v8::internal::Isolate*, v8::internal::Handle<v8::internal::NumberDictionary>, unsigned int, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyDetails, int*) [/usr/bin/node]
 9: 0xec2cee  [/usr/bin/node]
10: 0x105a3d4 v8::internal::JSObject::AddDataElement(v8::internal::Handle<v8::internal::JSObject>, unsigned int, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes) [/usr/bin/node]
11: 0x10738bb v8::internal::Object::AddDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::ShouldThrow, v8::internal::Object::StoreFromKeyed) [/usr/bin/node]
12: 0x107aec0 v8::internal::JSObject::DefineOwnPropertyIgnoreAttributes(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::ShouldThrow, v8::internal::JSObject::AccessorInfoHandling) [/usr/bin/node]
13: 0x107e3f5 v8::internal::JSObject::CreateDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::ShouldThrow) [/usr/bin/node]
14: 0x108ff18 v8::internal::JSReceiver::CreateDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::ShouldThrow) [/usr/bin/node]
15: 0x11f6770 v8::internal::Runtime_CreateDataProperty(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
16: 0x3ac05b24fc5d 
Aborted

我首先认为有一个代码导致错误,占用了很多堆空间。但是,当它甚至没有到达我的第一个代码时,它就会打印错误。它在收到 post 请求时似乎中断了。

标签: node.jspostuploadheap-memory

解决方案


您可以使用流以块(较小的部分)发送请求数据。一个很好的例子是here。该示例适用于文件。但是,如果它是非文件数据(例如文本、JSON、XML),您可以将其写入临时文件,将该文件分块发送到您的服务器,然后让服务器读取该文件,以检索您发送的数据,一次收到所有块。


推荐阅读