Claude Code 内存暴涨排查记录
Claude Code 内存暴涨排查记录
时间: 2026-05-18
节点: 172.20.6.110(x86_64,openEuler 2403 SP1,内存 7.1GB)
问题描述
在 172.20.6.110 节点上运行任意版本的 Claude Code,系统内存会被彻底耗尽,直至失去响应,SSH 不可用。重装任何版本均复现同样问题。
排查过程
1. 初步检查
连接节点后发现:
- Claude 软链接位于
/root/.local/bin/claude - versions 目录存有 2.1.140 / 2.1.141 / 2.1.142 三个版本(各约 221MB)
- 存在一个 0 字节的
2.1.143文件,说明正在下载新版本 - 系统无独立 Node.js 环境,Claude 为 Node.js SEA 自包含二进制
2. 定位崩溃进程
查看 dmesg OOM 日志,发现关键记录:
1 | |
- 虚拟内存膨胀至 73GB(约 9000+ 线程,每线程 8MB 栈)
- 物理内存实际占用 6.76GB,耗尽全部 RAM + Swap
- 崩溃进程名为
claude-2.1.143-,不是用户安装的版本
3. strace 分析
对运行中的 claude 进程执行 strace -c,输出如下:
1 | |
- 大量
futex错误 → 线程间锁竞争爆炸 - 高频
sched_yield→ 线程持续自旋,CPU 跑满 - 两者结合,印证线程失控行为
4. 根因确认
"安装任何版本都一样卡"的原因:
每个版本启动时会自动检测并下载最新版(2.1.143),然后启动 2.1.143 子进程。2.1.143 的 x86_64 构建存在线程爆炸 bug,导致内存耗尽。用户安装的版本本身没问题,崩溃的始终是被自动拉起的 2.1.143。
对比本机(rk3528-openeuler22,ARM64)运行 2.1.143 完全正常,确认该 bug 为 2.1.143 x86_64 构建特有。
修复措施
第一步:杀死失控进程,删除损坏文件
1 | |
第二步:禁用自动更新配置
创建 /root/.claude/settings.json:
1 | |
注:经测试对 2.1.140 版本无效,该版本在读取配置前已触发更新下载。
第三步:chattr +i 锁死 versions 目录
chmod 555 对 root 用户无效(root 可绕过权限位),必须使用文件系统不可变标志:
1 | |
验证:
1 | |
此后即使 Claude 尝试下载 2.1.143,写入操作会直接被拒绝。
第四步:环境变量双重保险
在 /root/.bashrc 追加:
1 | |
ulimit -v 4194304 将 Claude 进程虚拟内存上限设为 4GB,即使未来再出现类似 bug,也只会杀掉 Claude 进程,不会拖垮整台机器。
第五步:伪造 lock 文件
发现 ~/.local/state/claude/locks/ 目录中存有版本锁文件,Claude 启动时会写入当前版本信息。创建伪造的 2.1.143.lock 指向 2.1.140 二进制,使更新逻辑认为 2.1.143 已在运行:
1 | |
最终状态
- 运行版本:2.1.140(x86_64,稳定)
- versions 目录:
chattr +i锁定,仅含 2.1.140 - 内存:空闲 6.5GB,无暴涨
- 三道防线:
chattr +i+CLAUDE_DISABLE_AUTO_UPDATE=1+ 伪造 lock 文件
后续建议
待 Anthropic 发布修复了 x86_64 bug 的新版本后,执行以下命令恢复自动更新:
1 | |