今天我运行我的文件系统索引脚本以刷新 RAID 文件索引,4 小时后它崩溃并出现以下错误:
[md5:] 241613/241627 97.5%
[md5:] 241614/241627 97.5%
[md5:] 241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)
<--- Last few GCs --->
11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: node::Abort() [/usr/bin/node]
2: 0xe2c5fc [/usr/bin/node]
3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
7: 0x3629ef50961b
服务器配备 16gb RAM 和 24gb SSD 交换。我非常怀疑我的脚本超过了 36gb 的内存。至少不应该
脚本使用文件元数据(修改日期、权限等,无大数据)创建存储为对象数组的文件索引
这是完整的脚本代码:http://pastebin.com/mjaD76c3
我过去已经用这个脚本经历过奇怪的节点问题,这迫使我例如。将索引拆分为多个文件,因为节点在处理像 String 这样的大文件时出现故障。有什么方法可以通过庞大的数据集改善 nodejs 内存管理?
set NODE_OPTIONS=--max-old-space-size=8192
如果我没记错的话,V8 中的内存使用量有一个严格的标准限制,大约是 1.7 GB,如果你不手动增加它的话。
在我们的一个产品中,我们在部署脚本中遵循了这个解决方案:
node --max-old-space-size=4096 yourFile.js
还会有一个新的空间命令,但正如我在这里读到的:a-tour-of-v8-garbage-collection 新空间只收集新创建的短期数据,旧空间包含所有引用的数据结构,这在您的情况下应该是最佳选择。
如果你想全局增加节点的内存使用——不仅仅是单个脚本,你可以导出环境变量,像这样:
export NODE_OPTIONS=--max_old_space_size=4096
这样您在运行 npm run build
之类的构建时就不需要玩文件了。
NODE_OPTIONS
设置为 4096 或更高,我也会遇到同样的错误。当我运行命令 npm run build
时,我看到一些进程使用 usr/bin/node --max_old_space_size=2048
之类的命令运行。可能是什么原因?
max_old_space_size
参数,它会覆盖导出的 env 变量。
以防万一有人在无法直接设置节点属性的环境中遇到此问题(在我的情况下是构建工具):
NODE_OPTIONS="--max-old-space-size=4096" node ...
如果无法在命令行上传递节点选项,则可以使用环境变量设置它们。
以下是一些标志值,用于添加一些关于如何在启动节点服务器时允许更多内存的附加信息。
1GB - 8GB
#increase to 1gb
node --max-old-space-size=1024 index.js
#increase to 2gb
node --max-old-space-size=2048 index.js
#increase to 3gb
node --max-old-space-size=3072 index.js
#increase to 4gb
node --max-old-space-size=4096 index.js
#increase to 5gb
node --max-old-space-size=5120 index.js
#increase to 6gb
node --max-old-space-size=6144 index.js
#increase to 7gb
node --max-old-space-size=7168 index.js
#increase to 8gb
node --max-old-space-size=8192 index.js
我的 EC2 实例 t2.micro 具有 1 GB 内存,我刚刚遇到了同样的问题。
我通过使用 this url 创建交换文件并设置以下环境变量来解决问题。
export NODE_OPTIONS=--max_old_space_size=4096
终于问题解决了。
我希望这对未来有帮助。
即使在设置了 --max-old-space-size 之后,我也一直在努力解决这个问题。
然后我意识到需要在业力脚本之前放置选项 --max-old-space-size 。
最好同时指定语法 --max-old-space-size 和 --max_old_space_size 我的脚本 karma :
node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192 --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192 --prod --aot
参考https://github.com/angular/angular-cli/issues/1652
--max-old-space-size=8192 --optimize-for-size --max_old_space_size=8192 --optimize_for_size
并且它有效
optimize-for-size
终于让我的构建成功了。
我在尝试使用 VSCode 进行调试时遇到了这个问题,所以只想添加这就是如何将参数添加到调试设置中。
您可以将其添加到 launch.json
中配置的 runtimeArgs
属性中。
请参见下面的示例。
{
"version": "0.2.0",
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}\\server.js"
},
{
"type": "node",
"request": "launch",
"name": "Launch Training Script",
"program": "${workspaceRoot}\\training-script.js",
"runtimeArgs": [
"--max-old-space-size=4096"
]
}
]}
launch.json
是专门用于从 VS Code 运行应用程序的配置文件。
我在进行 AOT 角度构建时遇到了类似的问题。以下命令帮助了我。
npm install -g increase-memory-limit
increase-memory-limit
来源:https://geeklearning.io/angular-aot-webpack-memory-trick/
sudo npm -g install increase-memory-limit --unsafe-perm
npm run dev
并停在那里。在此行 > webpack-dev-server --config ./webpack.dev.config.js
之后,它没有显示任何进度,也没有给出任何错误。它正在玩雕像,所以项目无法运行。
我最近遇到了同样的问题并遇到了这个线程,但我的问题是 React
App.以下节点启动命令的更改解决了我的问题。
句法
node --max-old-space-size=<size> path-to/fileName.js
例子
node --max-old-space-size=16000 scripts/build.js
为什么 max-old-space-size 的大小为 16000?
基本上,它取决于分配给该线程的内存和您的节点设置。
如何验证并给出正确的尺寸?
这基本上是留在我们的引擎 v8
中。下面的代码可帮助您了解本地节点 v8 引擎的堆大小。
const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
我只是想在某些系统中添加它,即使使用 --max-old-space-size
增加节点内存限制,这还不够,并且存在如下操作系统错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
在这种情况下,可能是因为您达到了每个进程的最大 mmap。
您可以通过运行检查 max_map_count
sysctl vm.max_map_count
并通过运行增加它
sysctl -w vm.max_map_count=655300
并通过添加此行将其修复为在重新启动后不重置
vm.max_map_count=655300
在 /etc/sysctl.conf
文件中。
查看 here 了解更多信息。
分析错误的一个好方法是使用 strace
运行进程
strace node --max-old-space-size=128000 my_memory_consuming_process.js
strace
yourself。
strace
会产生 ton 的输出行,这会妨碍您查看常规日志行(除非您对输出进行了某种过滤)。有什么方法可以减少这种噪音以仅显示与 std::bad_alloc
错误相关的事件?
解决此问题的步骤(在 Windows 中)-
打开命令提示符并键入 %appdata% 按 Enter 导航到 %appdata% > npm 文件夹 在您喜欢的编辑器中打开或编辑 ng.cmd 将 --max_old_space_size=8192 添加到 IF 和 ELSE 块
更改后您的 node.cmd
文件如下所示:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
最近,在我的一个项目中遇到了同样的问题。尝试了几件事,任何人都可以尝试作为调试来确定根本原因:
正如大家所建议的那样,通过添加以下命令来增加节点中的内存限制: { "scripts":{ "server":"node --max-old-space-size={size-value} server/index.js" } }
这里我为我的应用程序定义的 size-value
是 1536(因为我的 kubernetes pod 内存限制为 2 GB,请求 1.5 GB)
因此,请始终根据您的前端基础架构/架构限制(略小于限制)定义 size-value
在上面的命令中有一个严格的标注,在 node
命令之后使用 --max-old-space-size
而不是在文件名 server/index.js
之后。
如果您有 ngnix 配置文件,请检查以下内容:worker_connections:16384(对于重型前端应用程序)[nginx 默认为每个 worker 512 个连接,这对于现代应用程序来说太低了] 使用:epoll(高效方法)[nginx 支持多种连接处理方法] http:添加以下内容以使您的工作人员免于忙于处理一些不需要的任务。 (client_body_timeout、reset_timeout_connection、client_header_timeout、keepalive_timeout、send_timeout)。删除所有日志记录/跟踪工具,如 APM、Kafka、UTM 跟踪、Prerender (SEO) 等中间件或关闭。现在代码级调试:在您的主服务器文件中,删除不需要的 console.log,它只是打印一条消息。现在检查每个服务器路由,即 app.get() , app.post() ... 以下场景:
data => if(data) res.send(data) // 你真的需要等待数据还是那个api返回一些我必须等待的响应? , 如果没有,那么修改如下:
data => res.send(data) // this will not block your thread, apply everywhere where it's needed
其他部分:如果没有错误出现,那么只需返回 res.send({}) ,这里没有 console.log。
错误部分:有些人将其定义为错误或错误,这会造成混乱和错误。像这样: `error => { next(err) } // 这里的 err 是未定义的` `err => {next(error) } // 这里的错误是未定义的` `app.get(API , (re,res) = >{ error => next(error) // 这里没有定义 next })`
使用 npx depcheck 命令删除 winston 、 elastic-epm-node 其他未使用的库。
在 axios 服务文件中,检查方法和日志记录是否正确: if(successCB) console.log("success") successCB(response.data) // 这是错误的语句,因为成功时您只是在记录,然后`successCB` 在失败情况下返回的 if 块外发送。
避免在可访问的大型数据集上使用 stringify 、 parse 等。 (我也可以在上面显示的日志中看到。
最后但并非最不重要的一点是,每次当您的应用程序崩溃或 Pod 重新启动时,请检查日志。在日志中专门查找此部分: 安全上下文 这将为您提供崩溃背后的罪魁祸首、原因和地点。
我将提到两种解决方案。
我的解决方案:在我的情况下,我将它添加到我的环境变量中:
export NODE_OPTIONS=--max_old_space_size=20480
但是即使我重新启动计算机,它仍然无法正常工作。我的项目文件夹位于 d:\ 磁盘中。所以我将我的项目删除到 c:\ 磁盘并且它有效。
我的队友的解决方案:package.json 配置也有效。
"start": "rimraf ./build && react-scripts --expose-gc --max_old_space_size=4096 start",
"build": "react-scripts --expose-gc --max_old_space_size=4096 build",
对于像我这样没有找到任何适合此错误解决方案的其他初学者,请检查安装的节点版本(x32、x64、x86)。我有一个 64 位 CPU 并且我安装了 x86 节点版本,这导致了 CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
错误。
如果要全局更改节点(Windows)的内存,请转到高级系统设置-> 环境变量-> 新用户变量
variable name = NODE_OPTIONS
variable value = --max-old-space-size=4096
您还可以使用以下方法更改 Window 的环境变量:
$env:NODE_OPTIONS="--max-old-space-size=8192"
就我而言,我将 node.js 版本升级到最新版本(版本 12.8.0),它就像一个魅力。
使用选项 --optimize-for-size
。它将专注于使用更少的内存。
我在 AWS Elastic Beanstalk 上遇到此错误,将实例类型从 t3.micro(免费套餐)升级到 t3.small 修复了错误
https://i.stack.imgur.com/k4JEh.png
Unix (Mac 操作系统)
打开一个终端并使用 nano 像这样打开我们的 .zshrc 文件(如果不存在,这将创建一个): nano ~/.zshrc 通过将以下行添加到我们当前打开的 .zshrc 文件中来更新我们的 NODE_OPTIONS 环境变量: export NODE_OPTIONS=--max-old-space-size=8192 #增加节点内存限制
请注意,如果我们的系统有足够的内存,我们可以将传入的兆字节数设置为任意值(这里我们传入 8192 兆字节,大约为 8 GB)。
按 ctrl + x 保存并退出 nano,然后按 y 表示同意,最后按 Enter 保存更改。关闭并重新打开终端以确保我们的更改已被识别。我们可以打印出 .zshrc 文件的内容,看看我们的更改是否像这样保存:cat ~/.zshrc。
Linux (Ubuntu)
打开终端并使用 nano 打开 .bashrc 文件,如下所示: nano ~/.bashrc
其余步骤与上述 Mac 步骤类似,但我们很可能默认使用 ~/.bashrc
(而不是 ~/.zshrc)。所以这些值需要被替换!
将节点升级到最新版本。我在节点 6.6 上出现此错误并升级到 8.9.4,问题就消失了。
我今天遇到了同样的问题。我的问题是,我试图在我的 NextJS 项目中将大量数据导入数据库。
所以我所做的是,我像这样安装了 win-node-env 包:
yarn add win-node-env
因为我的开发机器是Windows。我在本地安装它而不是在全球安装它。您也可以像这样在全局范围内安装它:yarn global add win-node-env
然后在我的 NextJS 项目的 package.json
文件中,我添加了另一个启动脚本,如下所示:
"dev_more_mem": "NODE_OPTIONS=\"--max_old_space_size=8192\" next dev"
在这里,我传递了节点选项,即。将 8GB 设置为限制。所以我的 package.json
文件有点像这样:
{
"name": "my_project_name_here",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev",
"dev_more_mem": "NODE_OPTIONS=\"--max_old_space_size=8192\" next dev",
"build": "next build",
"lint": "next lint"
},
......
}
然后我像这样运行它:
yarn dev_more_mem
对我来说,我只在我的开发机器上遇到了这个问题(因为我正在导入大数据)。因此这个解决方案。想分享这个,因为它可能对其他人有用。
以防万一它可以帮助人们在使用产生大量日志记录的 nodejs 应用程序时遇到此问题,一位同事通过将标准输出管道传输到文件来解决此问题。
如果您尝试启动的不是 node
本身,而是其他一些软件,例如 webpack
,您可以使用环境变量和 cross-env
包:
$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
webpack --progress --config build/webpack.config.dev.js
对于角度项目捆绑,我在脚本部分的 pakage.json 文件中添加了以下行。
"build-prod": "node --max_old_space_size=5120 ./node_modules/@angular/cli/bin/ng build --prod --base-href /"
现在,为了捆绑我的代码,我使用 npm run build-prod
而不是 ng build --requiredFlagsHere
希望这可以帮助!
对于 Angular
,这就是我修复的方式
在 Package.json
中,在 script
标记内添加此
"scripts": {
"build-prod": "node --max_old_space_size=5048 ./node_modules/@angular/cli/bin/ng build --prod",
},
现在在 terminal/cmd
而不是使用 ng build --prod
只需使用
npm run build-prod
如果您只想将此配置用于 build
,只需从所有 3 个位置中删除 --prod
如果任何给定的答案对您不起作用,请检查您安装的节点是否与您的系统兼容(即 32 位或 64 位)。通常这种类型的错误是由于不兼容的节点和操作系统版本而发生的,终端/系统不会告诉你这一点,但会让你给出内存不足的错误。
在我的情况下,我在以前版本的节点上运行了 npm install
,有一天我升级了节点版本并 ram npm install
为几个模块。在此之后我收到了这个错误。为了解决这个问题,我从每个项目中删除了 node_module 文件夹并再次运行 npm install
。
希望这可以解决问题。
注意:这发生在我的本地计算机上,并且仅在本地计算机上得到修复。
如果您的内存或 RAM 有限,请执行以下命令。
ng 服务 --source-map=false
它将能够启动应用程序。对于我的示例,它需要 16gb 的 RAM。但我可以使用 8gb RAM 运行。
检查您是否没有在 64 位机器上安装 32 位版本的节点。如果您在 64 位或 32 位机器上运行 node,则 nodejs 文件夹应分别位于 Program Files 和 Program Files (x86) 中。
不定期副业成功案例分享
ng serve
还是通过其他网络服务器(如 express)分发ng build
/dist 文件夹的结果?但是,如果您的 Angular 项目使用的内存超过标准的 1.7GB 内存,那么您的应用程序中可能会出现架构问题?看起来您正在使用带有 nmp start 的开发环境,也许这是一个解决方案github.com/mgechev/angular-seed/issues/2063