npm install安装依赖时频繁遇到网络超时#967
可以用这两个命令测试下.
nslookup registry.npmjs.org
curl -v https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz -O
如果是198的ip就是正常的, 如果是其他ip,检查下是不是自己改过host用的不是默认的dns
/tmp/iOALog/.new_Clipboard/Clipboard_Screenshot_1749799809.png
我在远程开发和 ci 里跑,看着下载是正常加速的
https://cnb.cool/tian-yu/tmp/test-new-model/-/build/logs/cnb-alo-1itk2ni4q
/tmp/iOALog/.new_Clipboard/Clipboard_Screenshot_1749799986.png
可以用这两个命令测试下.
nslookup registry.npmjs.org
curl -v https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz -O如果是198的ip就是正常的, 如果是其他ip,检查下是不是自己改过host用的不是默认的dns
/tmp/iOALog/.new_Clipboard/Clipboard_Screenshot_1749799809.png
我在云开发环境和ci执行这两个命令也没问题,但实际构建还是一堆 ERR_SOCKET_TIMEOUT
做了若干测试
pnpm install换成 npm install --legacy-peer-deps (忽略依赖冲突), ci 构建正常.临时解法:先给一个临时解法,加一个 PNPM_WORKERS 的变量,限制一下 worker 数量。
FROM node:20.18-alpine AS builder
WORKDIR /app
RUN npm install -g pnpm
COPY package.json pnpm-lock.yaml ./
# 填写您需要的核数
ENV MY_CPU=2
# 使用 PNPM_WORKERS 限制 pnpm worker 数量
RUN PNPM_WORKERS=$(( $(/usr/bin/nproc) - $MY_CPU )) pnpm install --frozen-lockfile
RUN npx update-browserslist-db@latest
原因:
pnpm 使用了一个 nodejs 的新版 API(os.availableParallelism) , 获取可用 CPU 数量,但是这个 nodejs 的 API 在容器环境有 bug , 获取到了母机的 CPU 数量,导致启动了 300 多个 worker,直接干 OOM 了,pnpm 和 nodejs 仓库的相关 Issue 讨论:
pnpm 源码是这样配置 CPU 核数的,配置的是需要“空出来”多少核,也就是总核数减去你需要用多少,故产生上述的临时方案。

有更佳的方案继续补充。
对, 排查下来是 pnpm 在大核心宿主机上, 对虚拟化的兼容和性能问题. 看代码, 在docker中申请使用 cpu=2 核时, 仍按照宿主机总核数384去创建WORKER数. 造成的性能下降.
指定 PNPM_WORKERS 能规避. 其中 PNPM_WORKERS 计算方式是: PNPM_WORKERS = 宿主机总核数-申请CPU数, 即 PNPM_WORKERS=384-2=382。 (也可以参照上条评论自动计算)
代码里加下就好了:
RUN pnpm install --frozen-lockfile
改成
RUN PNPM_WORKERS=382 pnpm install --frozen-lockfile
版本是 node20.18 和 pnpm v10.12.1
构建日志 https://cnb.cool/tian-yu/ai/fork/test-npm-build/-/build/logs/cnb-pgg-1iu315bik
可以试试这个设置, 完整的优化需要等 libuv升级-》node 升级 -〉支持 os.availableParallelism正确返回docker中限制的cpu值 或者pnpm优化.
目前解决方式是上面的 PNPM_WORKERS=xxx 的设值方案. issue先关闭了
描述一下体验不好的点
似乎与特定节点有关系,amd64节点不管使用哪个源都会报ERR_SOCKET_TIMEOUT,但在arm64节点则一切正常。
#935 也反馈了相同的问题,希望能尽早解决
优化建议?如有