大量的发布请求使Nodejs服务器的堆内存不足

时间:2019-05-07 22:17:08

标签: node.js post upload heap-memory

我正在运行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

我首先认为有一个导致错误的代码,占用了大量堆空间。但是,即使没有到达我的第一个代码,它也会显示错误。收到发布请求后,它似乎坏了。

1 个答案:

答案 0 :(得分:0)

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