我正在try 使用基于ARM的机器(具体地说,是arm.xlarge
)在CircleCI上构建一个Next.js项目,该机器有32 GB的RAM.然而,它似乎很快就退出了,并出现了关于内存不足的错误.我try 将Node进程的内存一直增加到机器的内存,但没有成功--我收到了同样的错误.
特别奇怪的是,GC的内存使用率很小(3.5MB),并且它在亚秒级时间内退出!
如果我将arm
资源类型替换为x86_64
资源类型,并为x86_64
平台构建一个Docker映像,则此构建确实有效.显然,这不能满足我的需求,但可以验证构建是否正常工作.
是什么导致了这种非常奇怪的行为?我还可以做些什么来进一步调试此问题?
我try 过的东西
- 更改 node 版本,范围从14到18.8.0
- 更改计算机资源大小
- 更改Docker的选项,包括向构建作业(job)的
extra-build-args
字段添加--memory
标志 - 移除这
yarn.lock
个 - 清除 node 缓存
- 删除
node_modules
文件夹
相关资源:
这是一条线索:
#16 [11/11] RUN NODE_OPTIONS="--max_old_space_size=8192" yarn build
#16 sha256:da0777711cb35943386ef4812f2df1ff4932fb5bee717be330a217104e5240c7
#16 0.178
#16 0.178 <--- Last few GCs --->
#16 0.178
#16 0.178 [1:0x570e320] 100 ms: Mark-sweep 1.2 (3.5) -> 1.2 (3.5) MB, 2.2 / 0.0 ms (average mu = 0.818, current mu = 0.007) allocation failure scavenge might not succeed
#16 0.178 [1:0x570e320] 102 ms: Mark-sweep (reduce) 1.2 (3.5) -> 1.2 (3.5) MB, 2.3 / 0.0 ms (average mu = 0.704, current mu = 0.006) last resort GC in old space requested
#16 0.178 [1:0x570e320] 104 ms: Mark-sweep (reduce) 1.2 (2.5) -> 1.1 (3.5) MB, 2.3 / 0.0 ms (average mu = 0.549, current mu = 0.010) last resort GC in old space requested
#16 0.178
#16 0.178
#16 0.178 <--- JS stacktrace --->
#16 0.178
#16 0.178 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
#16 ERROR: process "/bin/sh -c NODE_OPTIONS=\"--max_old_space_size=8192\" yarn build" did not complete successfully: exit code: 132
------
> [11/11] RUN NODE_OPTIONS="--max_old_space_size=8192" yarn build:
------
Dockerfile:32
--------------------
31 |
32 | >>> RUN NODE_OPTIONS="--max_old_space_size=8192" yarn build
34 |
--------------------
error: failed to solve: rpc error: code = Unknown desc = process "/bin/sh -c NODE_OPTIONS=\"--max_old_space_size=8192\" CI_BUILD=${CI_BUILD} DEPLOYMENT_VERSION=${DEPLOYMENT_VERSION} yarn build" did not complete successfully: exit code: 132
以下是Dockerfile的相关部分:
FROM node:14.18.0-alpine
WORKDIR /app
RUN apk update
RUN apk add python3
RUN apk add git gnupg jq g++ make py3-pip
COPY package.json yarn.lock ./
RUN yarn
RUN yarn add pm2@5.2.0 --global
COPY . .
RUN NODE_OPTIONS="--max_old_space_size=8192" yarn build
EXPOSE 3001
CMD [ "npx", ... ]
这是来自CircleCI config.yml
的工作:
build_and_push_image:
machine:
image: ubuntu-2004:202101-01
resource_class: arm.xlarge
steps:
- checkout
- docker/pull:
images: 'node:16.14.2'
- aws-ecr/build-and-push-image:
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
aws-cli-version: latest
create-repo: true
skip-when-tags-exist: true
dockerfile: Dockerfile
extra-build-args: >
--build-arg GPG_ENCRYPT_PASSPHRASE
--build-arg BUILD_STAGE
--build-arg CI_BUILD=true
platform: linux/arm64/v7
push-image: true
registry-id: AWS_ACCOUNT_ID
region: $AWS_REGION
repo: $PROJECT_NAME
tag: $version_tag