AWS Lambda部署后出现Array buffer allocation failed问题求助
问题分析与解决
问题背景
AWS Lambda本地测试正常,部署后控制台运行抛出RangeError: Array buffer allocation failed错误,错误栈指向brotli库的Native模块,且Lambda报告的实际内存使用(60MB)远低于配置的128MB。
错误日志
RangeError: Array buffer allocation failed at new ArrayBuffer (<anonymous>) at Object.<anonymous> (/var/task/node_modules/brotli/build/encode.js:21:207) at Module._compile (node:internal/modules/cjs/loader:1165:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10) at Module.load (node:internal/modules/cjs/loader:1043:32) at Function.Module._load (node:internal/modules/cjs/loader:878:12) at Module.require (node:internal/modules/cjs/loader:1067:19) at require (node:internal/modules/cjs/helpers:103:18) at Object.<anonymous> (/var/task/node_modules/brotli/compress.js:1:14) at Module._compile (node:internal/modules/cjs/loader:1165:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10) at Module.load (node:internal/modules/cjs/loader:1043:32) at Function.Module._load (node:internal/modules/cjs/loader:878:12) at Module.require (node:internal/modules/cjs/loader:1067:19) at require (node:internal/modules/cjs/helpers:103:18) at Object.<anonymous> (/var/task/node_modules/brotli/index.js:1:20) START RequestId: dc611535-421d-4bb9-9632-1f17f016d093 Version: $LATEST RequestId: dc611535-421d-4bb9-9632-1f17f016d093 Error: Runtime exited with error: exit status 7 Runtime.ExitError END RequestId: dc611535-421d-4bb9-9632-1f17f016d093 REPORT RequestId: dc611535-421d-4bb9-9632-1f17f016d093 Duration: 16226.67 ms Billed Duration: 16227 ms Memory Size: 128 MB Max Memory Used: 60 MB
核心原因
Lambda控制台显示的Max Memory Used仅统计Node.js堆内存,而brotli这类Native模块会使用堆外内存(Off-Heap Memory),这部分内存不计入堆内存统计,但会占用Lambda的总内存配额。当堆内存+堆外内存接近或达到配置的128MB上限时,就会触发ArrayBuffer分配失败。
解决方法
- 提升Lambda内存配置:将内存从128MB调高至256MB或更高,给堆外内存留出足够空间。即使堆内存只用60MB,堆外内存可能占用了剩余的大部分配额,总内存触顶导致分配失败。
- 替换或升级brotli库:
- 改用纯JavaScript实现的brotli库(如
brotli-js),避免Native模块的堆外内存开销; - 升级当前
brotli库到最新版本,新版本可能修复了内存分配的bug或优化了内存占用。
- 改用纯JavaScript实现的brotli库(如
- 优化压缩逻辑:如果处理大文件,不要一次性加载整个文件到内存,改用流式压缩(借助Node.js
stream模块分块处理),减少单次内存占用。
内容的提问来源于stack exchange,提问作者Orest Mirko
相关产品推荐
相关产品推荐

