问题标签 [enomem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - AWS 弹性 beanstalk 部署失败并出现 ENOMEM 错误
您的 AWS Elastic Beanstalk 部署失败: - 间歇性 - 没有明显的原因
第 1 步:检查明显的日志
/var/log/eb-activity.log
第 2 步:谷歌搜索相应的快照日志文件...
/var/log/nodejs/npm-debug.log
第 3 步:明显的选项...
使用更大的实例,它可以工作......
不要修复,再试一次
再次部署,它的工作...
克隆环境,它可以工作......
重建环境,它工作....
感到肮脏和错误
linux - 具有私有匿名映射的 ENOMEM 的 munmap() 失败
我最近发现,mmap
如果munmap
这导致 VMA(虚拟内存区域)结构的数量超过vm.max_map_count
. 手册页(几乎)清楚地说明了这一点:
问题是 Linux 内核总是尽可能尝试合并 VMA 结构,munmap
即使是单独创建的映射也会失败。我能够编写一个小程序来确认这种行为:
它使用 分配大量页面(默认允许最大值的两倍)mmap
,然后munmap
每隔一页 s 为每个剩余页面创建单独的 VMA 结构。在我的机器上,最后一次munmap
调用总是以ENOMEM
.
最初,我认为munmap
如果使用与用于创建映射的地址和大小相同的值,则永远不会失败。显然,Linux 上不是这种情况,我无法找到有关其他系统上类似行为的信息。
同时,在我看来,应用于映射区域中间的部分取消映射预计在任何操作系统上都会失败,但我还没有找到任何文档表明这种失败是可能的。
我通常会认为这是内核中的一个错误,但知道 Linux 如何处理内存过度使用和 OOM,我几乎可以肯定这是一个“功能”,可以提高性能并减少内存消耗。
我能找到的其他信息:
- Windows 上的类似 API 由于其设计而没有此“功能”(请参阅
MapViewOfFile
、UnmapViewOfFile
、VirtualAlloc
、VirtualFree
)——它们根本不支持部分取消映射。 - glibc
malloc
实现只创建65535
映射,sbrk
当达到此限制时回退:https ://code.woboq.org/userspace/glibc/malloc/malloc.c.html 。这看起来像是解决此问题的方法,但仍然可以free
静默地泄漏内存。 - jemalloc 遇到了麻烦,并试图避免使用
mmap
/munmap
因为这个问题(我不知道它是如何结束的)。
其他操作系统真的保证内存映射的释放吗?我知道 Windows 会这样做,但是其他类 Unix 操作系统呢?自由BSD?QNX?
编辑:我正在添加示例,显示当内部调用失败时 glibc 如何free
泄漏内存。用于查看失败:munmap
ENOMEM
strace
munmap
git - Git 因 ENOMEM 失败
git pull
原因fatal: Out of memory, getdelim failed
我已经尝试过git pc
,重新安装了 git。我在 RAM 中有足够的可用空间(超过 6GB),并且交换中有 8GB 之类的可用空间。我在 Linux 上使用 git 版本 2.5.5,Fedora 4.5.5-300.fc24.x86_64
你有什么想法吗?
python - 10.13 High Sierra OSX - Python mprotect 在授予 exec 权限时总是失败,使用 ENOMEM
背景:
编写涉及在 python 程序中执行机器代码的概念证明。要在 osx 上执行此操作,我必须使用 ctypes 和 libc.dylib 以及以下函数调用:
(禁用 SIP)
- valloc 分配对齐的内存
- mprotect 授予 wrx 分配内存的权限
- memmove 将可执行代码复制到分配的内存;投掷; 并执行...
问题:
问题出现在 mprotect 函数调用中,它总是返回 -1 表示失败。
脚本:(逻辑几乎与 linux 系统相同,因为它们都是 posix 系列)
mmove 现在将失败并显示段错误错误消息(b/c 写入可能只有读取权限的内存空间),并且程序陷入困境......
问题出在 mprotect 上,这种方法在 linux 中效果很好,我现在看到 mac osx 的结果非常不同
问题:
Mac OSX 是否具有限制 mprotect 操作类型的额外安全功能(即使禁用 SIP)?如果是这样,如何绕过它?
更新:
根据评论中建议的@DietrichEpp,在 ctypes.CDLL 调用上使用 use_errno=True 会生成 errno。它评估为 errno:12,无法分配内存。此 errno 是 mprotect 手册页上 ENOMEM 的值。
尽管手册页上有一些 ENOMEM,但我怀疑这是最后一种情况:(b/c valloc 调用没有错误)
我怀疑 osx 有特殊限制,并且为每个进程设置了最大映射,因此添加更多权限,同一进程的新映射将超过这个最大限制(每个进程有多少个具有 exec/write 权限的映射)。如果我的假设是正确的,我们该如何解决呢?
aws-amplify - Grisome 构建在本地成功,但在 AWS Amplify 上失败
我有一个 Gridsome 站点,我正在尝试将其部署到 AWS Amplify。
该站点在本地构建良好且没有错误gridsome build
,但在 AWS Amplify 上却失败了。
我最初认为该错误与我正在使用所需标签的非 SSR 组件有关<ClientOnly>
,因为这会在我的本地构建中引发警告。但是,我已经删除了该组件并且问题仍然存在。
我还认为这个问题可能是由于与 webpack 相关的包需要一些过时的依赖项,但在尝试解决这些问题几个小时后,我相对确信情况并非如此。
我不太了解错误日志,但我认为问题可能与我网站上的大量图像有关,并且 AWS AmplifyENOMEM
在处理它们时内存不足 ( )。如果这甚至是原因,我还没有找到增加 AWS Amplify 内存分配的方法。
AWS Amplify 日志提供以下信息:
我的 package.json 包含以下内容:
在尝试解决此问题时,我将不胜感激。
先感谢您。
更新#1
我现在很确定这是由于在我的网站上通过<g-image>
.
我决定尝试使用 AWS CodeBuild 进行构建,看看是否有更多信息。它也失败了,但确实给了我一些更有帮助的错误。
当我删除了除少数图像之外的所有图像时,构建工作正常。一旦我以不同尺寸显示超过 300 张图像,事情就会开始失败。错误消息:
所以,是的,我想这是一个 Gridsome 错误?
更新#2
添加文件会node-options=--max_old_space_size=4096
导致.npmrc
构建挂起并最终超时。
更新#3
批量调整图像大小,使最大宽度/高度为 2000 像素(有效最大文件大小约为 2MB)。构建现在成功。
希望有人可以提供解决方案,以便我们可以从源文件构建而无需预处理图像。
javascript - Node.js 中的 ENOMEM 由高虚拟内存使用引起
几个月来,我的生产 Node.js (v12) 应用程序中出现 ENOMEM 错误。
这个问题特别难以诊断,因为我的堆总是在 100MB 范围内,并且不会随着时间的推移而增加。因此,不太可能发生节点内存泄漏。
但是,有时 VIRT 内存使用量(由 top cmd 报告)高达 15-20GB,这时节点开始抛出一些“spawn: enomem”错误。
据我所知,即使堆稳定在 100MB,节点也会保留大量虚拟内存。而且我无法诊断它是什么,因为节点首次亮相工具只允许我检查堆。
我在这个问题上花了将近 100 小时,所以任何见解/帮助将不胜感激!
我试过了:
- 手动设置 --max-old-space-size
- 增加服务器上的 RAM
- 将 SWAP 添加到我的服务器并允许 docker 使用该 SWAP
- 使用 chrome 开发工具检查节点堆
- 为我的 docker 容器设置内存限制
- 移动到不同的进程管理器(pm2 而不是 supervisord)
- 升级我所有的包并使用最新的 LTS 版本的节点
- 阅读和理解节点 ENOMEM 的所有谷歌搜索结果
- 了解 Node 如何管理其内存池,尤其是关于堆和 GC。
- 深入了解虚拟、保留、交换和共享内存的 linux 内核概念。
谢谢你的帮助 !
nuxt.js - Nuxt 构建 - “错误:生成 ENOMEM” - 达到 NPROC 限制
我想把我的 Nuxt 项目放在我的主机上,但是我遇到了“npm run build”没有成功的问题。我收到以下错误:
然后我收到了来自我的主机的报告,说我已经达到了我的极限。我的第一个猜测是我已经达到内存限制,但是当我查看 DirectAdmin 中的“资源使用情况”时,它达到了 NPROC 限制 100。因此达到了最大进程数。
我怎样才能解决这个问题?
我已经尝试过的:
- 将 Nuxt 降级到 2.12.2
- 删除大部分插件(虽然还没有很多)
- 在 Netlify 构建项目以进行测试(它可以正常工作)。它也适用于我的 mac。
当我仍然认为这是内存限制时,我已经尝试过
我尝试了很多东西,但这些是我仍然记得的东西
- 一遍又一遍地删除 node_modules、package.json、package.lock.json 等;-)
- --max-old-space-size=4096
我对建立这样一个项目比较陌生,所以如果我说一些愚蠢的话,请客气;-)
提前致谢!
node.js - 在共享托管服务器上启动 Next.js 应用程序时出现 ENOMEM 错误
TL;DR:spawn ENOMEM
当我尝试在共享托管服务器上构建和运行我的 Next.js 应用程序时遇到错误,该服务器在发生这种情况时有超过 900MB 的 RAM 和 70 多个可用进程。日志显示捕获错误时的 RSS 大小为 50814976。
我不太确定该错误是仅由内存不足引起还是由于设置或配置不正确而发生。你能给我一些建议吗?
==========详情如下=============
我正在使用 Node.js 构建 Next.js 应用程序,它是使用自定义服务器构建的(我的入口点:server.js)。我可以在 localhost:3000 的本地环境中运行我的应用程序。然后我尝试部署它以检查它在网络上是否正常。
我已订阅A2 Hosting 的 DRIVE Web Shared Hosting Plan,该计划经过优化以支持 Node.js 环境。他们在计划中提供的是 1GB 的物理内存和 75 个可用进程。
我的应用程序是通过 cPanel 上的Setup Node.js App功能创建的,并通过 SSH 使用 git 将我的项目克隆到服务器中。NPM 包也使用命令安装在服务器上npm install
。节点版本是v.12.9.1
,npm 版本是6.14.8
.
我的 npm 脚本被定义为运行自定义服务器。这是我的package.json文件中定义的 npm 脚本:
然后我使用命令npm run build
在.next文件夹中创建生产应用程序,但立即出现错误spawn ENOMEM
。
我用谷歌搜索这是一个与内存使用相关的问题。有人说内存不足时会出现这个错误,绕过这个问题的解决方法是在本地构建生产文件夹并将其上传到服务器。所以我复制了步骤。
但是,当我运行命令时,结果令人沮丧npm run start
。错误ENOMEM
仍然存在,在我输入命令后不到一秒钟就出现了。
清理 npm 缓存并重新安装 npm 模块似乎也不起作用。
我尝试通过在命令中添加选项来增加内存限制--max-old-space-size
并运行NODE_ENV=production node --max-old-space-size=1024 server.js
;但不幸的是,这似乎不起作用,ENOMEM
仍然弹出。
我添加console.log(process.memoryUsage())
以显示捕获错误时的用法,结果如下:
总的 rss 大小远远小于限制。还是我使用了错误的方法来检查内存消耗?
我该如何解决这个ENOMEM
问题?错误究竟是由什么引起的?真的只是因为可用 RAM 不符合 next.js 应用程序的要求吗?
我不确定我是否应用了不正确的设置,忽略了一些重要的配置,或者写错了导致此错误的任何代码。我想弄清楚下面发生了什么。在没有充分理解的情况下冲动地升级计划对我这个新手开发者来说是不利的,而善用预算是我的责任。
你能给我一些建议吗?
感谢您的关注。
memory - 将 posix_memalign 调用到附加程序中时出现 RUST 错误 ENOMEM
我会试着总结一下,但这会很复杂。
我在我的大学里有一个操作系统课程,我有一个实验室工作要做。我在 Rust 工作(据说实验室工作可以用任何编译语言完成,但最初主要是为 C 设计的)。
所以我有一个跟踪程序和一个跟踪程序。
实验室工作这一步的目标是使用 ptrace 从跟踪器附加到跟踪器,然后在合适的地方注入“trap-call-trap”指令以替换现有的无用函数,函数 posix_memalign(来自libc) 在traced中,通过寄存器间接调用(使用 rax)。目标是分配内存以便以后能够将缓存代码从另一个文件调用到被跟踪的程序中。
我遇到的问题是我实现在跟踪器中执行 posix memalign 所以我知道该函数有效,但是当我在跟踪器中调用它时(通过跟踪器),并在寄存器 rax 中查找函数的返回,我总是得到一个对应于 ENOMEM 的“12”(ENOMEM 没有足够的空间/无法分配内存)。
我有 2 个独立的货运项目,以便能够与货运分开启动每个程序。一切都在这个 git 上:https ://github.com/Carrybooo/TP_SEL
很抱歉,所有的印刷品和输出都是法文,(也有一些评论,我正在上法语课程),我认为我不必与任何人分享。其中也有很多无用的代码,来自实验室前面的步骤,我保留了以防万一,所以我的代码不是很干净。
这是我附加和修改 regs 以调用函数的部分(我缩短了代码并且没有向您显示辅助函数声明,因为它会太长):
在终端中运行程序会给出这样的结果:
所以是的,我不知道为什么我在这个调用中不断收到错误,我认为这是因为它违反了 rust 内存安全,因为编译器在跟踪的程序中从来不知道它必须分配内存,但我不确定它,也没有如何绕过它。我希望我已经足够清楚了,如果您需要更多详细信息,请告诉我,我真的提前感谢任何可以帮助我的人。欢迎任何建议。