node.js - 大的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 请求时似乎中断了。
解决方案
您可以使用流以块(较小的部分)发送请求数据。一个很好的例子是here。该示例适用于文件。但是,如果它是非文件数据(例如文本、JSON、XML),您可以将其写入临时文件,将该文件分块发送到您的服务器,然后让服务器读取该文件,以检索您发送的数据,一次收到所有块。
推荐阅读
- gradle - React Native 项目 Android Gradle 失败(React-Native-Reanimated Fail)
- javascript - 基于 clientHeight 的 Intersection Observer 更改类
- css - 这应该有效吗?即使父元素的高度未定义,顶部和底部属性也接受 % 值
- android - ViewPager 为空
- javascript - React - UseEffect 钩子与 Redux 存储在依赖数组中,更新状态以无限循环结束
- c# - 简单方法仅适用于消息框
- python - Python Selenium 悬停动作在内存中连接
- css - 背景图像在 Django 中无法正确呈现
- laravel-mix - 使用 Laravel Mix 动态导入 React 脚本
- django - 如何在 NGINX 上托管两台服务器?(Django 和 Angular PWA)