乐于分享
好东西不私藏

第008篇|Codex App 一开就飙 CPU?我把根因锁定在“非 Git 聚合目录”

第008篇|Codex App 一开就飙 CPU?我把根因锁定在“非 Git 聚合目录”

封面图

如果你也遇到过这种情况,大概率会很困惑:

明明没有在跑什么重任务,Codex App 只是开着,Mac 却开始发热,风扇起来了,活动监视器里 Codex Helper (Renderer) 长时间 100%+,甚至主进程 Codex 也明显吃 CPU。

更诡异的是:同样的目录、同样的项目,换成 codex cli 却基本正常。

这说明问题不在“模型太重”,也不在“你让 AI 干活太多”,而更像是桌面端某个工作区机制卡住了。

这篇文章,我把这次真实排查过程整理成一份可复用结论,方便以后自己查,也方便遇到同类问题的人少走弯路。

先说结论

这次 CPU 飙高的根因,基本可以归结为一句话:

Codex App 绑定到了一个“非 Git 的聚合根目录”,桌面端持续尝试读取 Git 元数据,结果在 stable-metadata / Not a git repository 的错误循环里高频重试,最终把 Electron 渲染层 CPU 拉高。

最小修复动作也很简单:

cd /path/to/workspace-rootgit init

只要让这个聚合根目录具备一个最小可识别的 .git,Codex App 的高 CPU 现象就明显缓解,甚至直接消失。

问题定位示意图

这次异常到底长什么样

先看现象层:

  • • Codex Helper (Renderer) 两个进程长期在 100%+
  • • Codex 主进程也有明显 CPU 占用
  • • 机器发热明显
  • • 空闲状态也不恢复
  • • 但 codex cli 基本正常

本次排查的工作区根目录,可以抽象理解为:

/path/to/workspace-root

这个目录有一个关键特点:它本身不是 Git 仓库,但它下面挂了多个真正的子项目仓库,比如:

  • • frontend-app/.git
  • • backend-service/.git
  • • admin-panel/.git
  • • mobile-client/.git
  • • docs-site/.git

这种目录结构非常常见,本质上就是一个“聚合工作区”。

对人来说,它只是一个总目录;但对桌面端工具来说,如果它会主动读取 workspace Git 元数据,这种“顶层不是仓库、下层全是仓库”的结构就很容易触发边界问题。

我是怎么一步步排除的

排查这类问题,最怕一上来就重装、删缓存、怪模型。

真正有效的做法,是先分层:到底是模型问题、MCP 问题、桌面端问题,还是工作区问题。

第一步:先排除 CLI 和 MCP 小进程

先看进程分布后,很快能发现一个事实:

高占用主要集中在:

  • • Codex Helper (Renderer)
  • • Codex

而不是下面这些:

  • • memory-server
  • • trace-server
  • • state-server
  • • code-intel-server

这一步其实很关键,因为它直接把排查方向从“推理执行”切到了“桌面端壳层”。

也就是说,CPU 并不是被模型算力吃掉的,而更像是 Electron / Chromium 渲染层在做高频重复工作。

第二步:重置 Codex App profile,但问题依旧

我把 Codex App 的本地 profile 目录(例如:

~/Library/Application Support/Codex

整个重命名,让 Codex App 生成全新 profile。

结果是:问题仍然复现。

这说明它不是旧缓存损坏,不是单次 profile 污染,也不是某个历史会话状态坏掉了。

第三步:收窄 trusted project,减少干扰项

继续检查 ~/.codex/config.toml,把过宽的 trusted project 收窄,例如去掉:

  • • ~/
  • • /path/to/workspace-root

这一步没有单独解决问题,但它很有价值:

它把“配置过宽导致的额外扫描”这个变量尽量压小了,方便继续锁定主因。

第四步:清理旧 OpenClaw / QClaw 路径噪音

排查过程中还发现一个次要问题:日志里反复引用已经不存在的旧工具目录。

后面做了两件事:

  • • 清理旧配置文件里的失效路径
  • • 增加兼容层,避免 Codex App 持续访问不存在的位置

这一步能消掉一部分报错噪音,但并不能让 CPU 根本恢复正常。

换句话说,它是“次要干扰项”,不是“主因”。

真正把根因暴露出来的,是 Git 日志

关键线索出现在本地日志与诊断信息里,里面反复出现这些关键词:

  • • workerId=git
  • • stable-metadata
  • • Not a git repository

当这三个关键词放在一起时,信号就很强了:

Codex App 正在持续尝试读取当前 workspace 的 Git 元数据,但绑定的根目录本身不是 Git 仓库,于是进入了高频失败、高频重试的循环。

这也解释了两个现象为什么能同时成立:

  1. 1. codex cli 基本正常
  2. 2. 桌面端却能把 CPU 持续拉高

因为两者用的是同一个模型体系,却不是同一套桌面端工作区与渲染逻辑。

排查路径对比图

为什么“非 Git 聚合目录”特别容易中招

因为它同时满足了三个触发条件:

1. 顶层目录不是 Git 仓库

桌面端如果默认把当前 project 根目录当成 Git-backed workspace 去读取元数据,就会在第一步失败。

2. 下层又挂着多个子仓库

这会让工具对“当前该认哪个仓库”为有效上下文变得更复杂,增加扫描和探测负担。

3. 聚合目录通常体量更大

目录越大、层级越深、项目越多,错误重试一旦变成循环,CPU 就越容易被持续放大。

所以这类目录不是普通“非 Git 文件夹”,而是桌面端 Git 集成逻辑最容易踩坑的一类边界工作区。

最终解决方案:给顶层补一个最小 .git

真正解决问题的动作非常朴素:

cd /path/to/workspace-rootgit init

执行后,Codex App 的 CPU 立刻明显下降。

这里的重点不是“把整个聚合目录纳入版本控制”,而是给桌面端一个可识别的 Git 壳,让它停止在“不是 Git 仓库”的错误状态里死循环。

为了保证安全,我采用的是一个“壳仓库”做法:

顶层 .git 只负责满足 Codex App 的工作区识别,不真正管理聚合目录内容。

对应的顶层 .gitignore 策略是:

  • • 默认忽略所有文件和目录
  • • 只保留 .gitignore 自身可见

这样做有四个好处:

  • • 满足 Codex App 对 Git-backed workspace 的要求
  • • 不误纳入聚合目录里的大量文件
  • • 不干扰各个子项目已有的独立 Git 仓库
  • • 几乎不增加额外存储成本

给经常用多项目工作区的人,一个实用建议

如果你的工作方式也是“一个大目录下面挂多个子项目仓库”,那这次排查给我的结论很明确:

不要等 Codex App 出问题后再查,最好一开始就让聚合根目录具备一个最小 .git

它不一定是为了版本管理,而是为了给桌面端工具一个稳定、明确的 workspace 身份。

从工程角度讲,这相当于给工具链补一个“上下文锚点”。

很多桌面 AI 工具的问题,表面看像性能问题,实际上是上下文识别失败后触发的重试风暴。

最后给你一份排查清单

如果以后你再次遇到类似的 CPU 异常,优先按下面顺序检查:

  1. 1. 当前 Codex App 绑定的 project 根目录是不是 Git 仓库
  2. 2. 日志里有没有出现 workerId=git / stable-metadata / Not a git repository
  3. 3. 高占用是否集中在 Codex Helper (Renderer) 而不是模型或 MCP 小进程
  4. 4. 当前 workspace 是否是“顶层非 Git、下层多仓库”的聚合目录
  5. 5. 是否还存在旧路径、已删除工作区、失效配置被反复扫描

如果前四项同时成立,优先试一次:

git init

很多时候,这比你重装、清缓存、换模型都更直接。

写在最后

这次排查对我最大的提醒是:

桌面 AI 工具的性能问题,很多时候并不是“AI 太重”,而是“上下文环境没有被工具正确理解”。

只要工作区身份错了,后面很多看起来莫名其妙的问题,都会被放大成 CPU、发热、卡顿,甚至误判成模型不稳定。

所以以后再遇到类似现象,先别急着怪模型,先看看你的 workspace 到底是不是一个对工具“可理解”的工程目录。