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
2
Out of memory: Killed process 10110 (claude-2.1.143-)
total-vm:73454768kB anon-rss:7080728kB
  • 虚拟内存膨胀至 73GB(约 9000+ 线程,每线程 8MB 栈)
  • 物理内存实际占用 6.76GB,耗尽全部 RAM + Swap
  • 崩溃进程名为 claude-2.1.143-,不是用户安装的版本

3. strace 分析

对运行中的 claude 进程执行 strace -c,输出如下:

1
2
3
47.94%   futex        83,953 次 / 3,108 个错误
19.65% sched_yield 12,322 次
25.51% epoll_pwait2 7,557 次
  • 大量 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
2
kill -9 <pid>
rm -f /root/.local/share/claude/versions/2.1.143

第二步:禁用自动更新配置

创建 /root/.claude/settings.json

1
2
3
{
"autoUpdates": false
}

注:经测试对 2.1.140 版本无效,该版本在读取配置前已触发更新下载。

第三步:chattr +i 锁死 versions 目录

chmod 555 对 root 用户无效(root 可绕过权限位),必须使用文件系统不可变标志:

1
chattr +i /root/.local/share/claude/versions/

验证:

1
2
lsattr -d /root/.local/share/claude/versions/
# ----i---------e------- /root/.local/share/claude/versions/

此后即使 Claude 尝试下载 2.1.143,写入操作会直接被拒绝。

第四步:环境变量双重保险

/root/.bashrc 追加:

1
2
3
4
5
export CLAUDE_DISABLE_AUTO_UPDATE=1

function claude() {
( ulimit -v 4194304; /root/.local/bin/claude "$@" )
}

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
3
4
5
6
7
8
cat > /root/.local/state/claude/locks/2.1.143.lock << 'EOF'
{
"pid": 99999,
"version": "2.1.143",
"execPath": "/root/.local/share/claude/versions/2.1.140",
"acquiredAt": 1779029054678
}
EOF

最终状态

  • 运行版本: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
2
chattr -i /root/.local/share/claude/versions/
rm /root/.local/state/claude/locks/2.1.143.lock