第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. codex cli基本正常 -
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. 当前 Codex App 绑定的 project 根目录是不是 Git 仓库 -
2. 日志里有没有出现 workerId=git / stable-metadata / Not a git repository -
3. 高占用是否集中在 Codex Helper (Renderer)而不是模型或 MCP 小进程 -
4. 当前 workspace 是否是“顶层非 Git、下层多仓库”的聚合目录 -
5. 是否还存在旧路径、已删除工作区、失效配置被反复扫描
如果前四项同时成立,优先试一次:
git init
很多时候,这比你重装、清缓存、换模型都更直接。
写在最后
这次排查对我最大的提醒是:
桌面 AI 工具的性能问题,很多时候并不是“AI 太重”,而是“上下文环境没有被工具正确理解”。
只要工作区身份错了,后面很多看起来莫名其妙的问题,都会被放大成 CPU、发热、卡顿,甚至误判成模型不稳定。
所以以后再遇到类似现象,先别急着怪模型,先看看你的 workspace 到底是不是一个对工具“可理解”的工程目录。
夜雨聆风