1. 4 个 Codex 加 1 个 Claude 把 CPU 跑满,问题到底出在哪
先说结论:CPU 跑满不是模型推理造成的,Codex 和 Claude 的推理都在远端服务器上完成,本地 CPU 根本不参与矩阵运算。真正吃掉 9700X 全部 16 个逻辑线程的,是多个 Agent 同时驱动本地工具链产生的连锁反应。
我当时的场景是这样的:VS Code 里装了 Codex 扩展,开了 4 个窗口各跑一个 Codex Agent,另外再开 1 个 Claude 做代码审查。任务管理器里Visual Studio Code (71)这个数字直接把我整懵了——71 个进程。拆开看,里面包含 4 个codex.exe、2 个claude.exe、30 多个 VS Code 子进程、多个 TypeScript language server、Go language server、file watcher、Git refresh、vite dev server、pnpm dev、go run。
这些进程单独看都不重,但叠在一起就出事了。一个 Agent 改了一个.ts文件,触发链条是这样的:file watcher 发现变化 → tsserver 重新分析整个项目 → Git 状态刷新 → Vite 热更新 → Agent 又跑测试 → 测试输出又触发新的文件变化。4 个 Codex 加 1 个 Claude 同时做这件事,等于 5 条触发链在同一个工作区里互相踩。
所以这篇不是讲怎么让 Agent 跑得更快,而是讲怎么把 5 个 Agent 的 Key、API 通道、配置文件收敛到一处,同时把 CPU 从 100% 压回可接受范围。适合已经在 VS Code 里跑多个 Agent、发现机器越来越卡、又不想放弃并行开发的人。
2. 为什么多 Agent 场景下必须统一 Key 与 API 通道
在讲配置之前,先解释一下为什么 Key 和 API 通道的收敛跟 CPU 占用是同一件事。
我最初的做法是每个 Agent 单独配 Key:Codex 窗口 1 用 Key A,窗口 2 用 Key B,Claude 用 Key C。看起来隔离得很干净,但实际跑起来有三个问题。
第一,每个 Agent 启动时都要独立完成一次鉴权握手。5 个 Agent 就是 5 次握手,而且 VS Code 扩展模式下每次重连、每次切换模型、每次刷新会话都可能重新触发鉴权。这些握手本身不重,但它们是同步阻塞的,会跟 language server 的初始化抢 CPU 时间片。
第二,不同 Key 对应不同的限流策略和配额池。4 个 Codex 如果共用一个 Key,请求会被统一排队;如果分散在 4 个 Key 上,反而容易出现某个 Key 触发限流后 Agent 疯狂重试,重试又触发新的文件扫描。
第三,配置文件散落在settings.json、config.toml、环境变量、扩展私有配置里,改一处要同步五处,改错了还很难排查。
统一到 TaoToken 之后,所有 Agent 走同一个 API 通道,Key 只维护一份,鉴权握手从 5 次变成 1 次(通道层面复用),限流策略统一,配置文件收敛到两个文件里。这不是为了省事,是为了让 CPU 峰值来源变得可预测。
TaoToken 在这里的角色是统一的 API 网关,官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。它不替代编辑器,也不替代 Agent 本身,只是把多个 Agent 的请求出口收敛到一个通道上。
3. 可复制配置:settings.json 与 config.toml 骨架
这一节给两份可以直接抄的配置骨架。一份是 VS Code 的settings.json,负责收敛文件监控范围和扩展行为;一份是 Codex 的config.toml,负责收敛 API 通道和 Key。
3.1 VS Code settings.json 骨架
这份配置的核心目的是减少 file watcher 和 search 的扫描范围,让 Agent 改文件时不要触发全项目重扫。
{ "files.watcherExclude": { "**/node_modules/**": true, "**/dist/**": true, "**/build/**": true, "**/.git/objects/**": true, "**/.git/subtree-cache/**": true, "**/coverage/**": true, "**/tmp/**": true, "**/*.log": true, "**/.next/**": true, "**/target/**": true }, "search.exclude": { "**/node_modules": true, "**/dist": true, "**/build": true, "**/coverage": true, "**/tmp": true, "**/.next": true, "**/target": true }, "files.watcherInclude": [], "typescript.tsserver.maxTsServerMemory": 2048, "typescript.disableAutomaticTypeAcquisition": true, "extensions.autoUpdate": false, "telemetry.telemetryLevel": "off" }几个参数说明一下。files.watcherExclude里把node_modules、dist、build、.git/objects全部排除,这几个目录是 Agent 改文件时最容易触发大规模重扫的地方。typescript.tsserver.maxTsServerMemory限制在 2048MB,防止 tsserver 在多个 Agent 同时改文件时无限膨胀。extensions.autoUpdate关掉,避免后台更新进程跟 Agent 抢 IO。
3.2 Codex config.toml 骨架
这份配置放在~/.codex/config.toml(Windows 下是C:\Users\你的用户名\.codex\config.toml)。核心是把 API 通道指向 TaoToken,Key 只写一份。
# ~/.codex/config.toml model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses" [profiles.agent1] model = "gpt-5-codex" model_provider = "taotoken" [profiles.agent2] model = "gpt-5-codex" model_provider = "taotoken" [profiles.agent3] model = "gpt-5-codex" model_provider = "taotoken" [profiles.agent4] model = "gpt-5-codex" model_provider = "taotoken"这里的关键点是env_key = "TAOTOKEN_API_KEY"。Key 不写在配置文件里,而是通过环境变量注入。这样 4 个 Codex 实例读的是同一个环境变量,Key 只有一份。
环境变量设置(PowerShell):
[System.Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY", "你的Key", "User")设置完要重启终端和 VS Code,让环境变量生效。
3.3 Claude 侧配置
Claude 如果走 Anthropic 兼容通道,配置放在~/.claude/settings.json:
{ "apiProvider": "taotoken", "apiBaseUrl": "https://taotoken.net/api", "apiKeyEnvVar": "TAOTOKEN_API_KEY", "model": "claude-sonnet-4-5" }这样 Codex 和 Claude 读的是同一个TAOTOKEN_API_KEY,走的是同一个https://taotoken.net/api通道。Key 和通道都收敛到一处。
4. 验证请求:确认 CPU 回落且不再重复鉴权
配置写完不算完,要验证两件事:一是请求确实走了统一通道,二是 CPU 确实回落了。
4.1 验证 API 通道
先用 curl 直接打一次 TaoToken 的 API,确认 Key 和通道都通:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5-codex", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 10 }'返回里如果有正常的choices字段,说明通道没问题。如果返回 401,检查环境变量有没有生效;如果返回 404,检查base_url有没有写错。
4.2 验证 Codex 走的是统一通道
启动一个 Codex 实例,加上--verbose或者看日志:
codex -C C:\proj1 --profile agent1在 Codex 的日志里搜base_url,应该看到https://taotoken.net/api。如果看到的是别的地址,说明config.toml没被读到,检查文件路径和 TOML 语法。
4.3 验证 CPU 回落
打开任务管理器,切到「详细信息」标签,按 CPU 排序。重点看三个东西:
第一,codex.exe的数量。如果还是 4 个,但每个的 CPU 占用从之前的 15% 降到 5% 以下,说明鉴权握手和重复请求减少了。
第二,tsserver的 CPU 占用。配置了watcherExclude之后,tsserver 不应该再频繁触发全项目重扫,CPU 应该稳定在低位。
第三,Visual Studio Code进程组的总数。如果从 71 降到 40 左右,说明多余的 extension host 和 webview 被收敛了。
我实测下来,配置收敛之后,5 个 Agent 同时跑,CPU 峰值从 100% 降到 65% 左右,桌面不再卡死。
4.4 用 Process Explorer 精确定位
任务管理器只能看个大概。VS Code 内置了一个更好的工具:按Ctrl+Shift+P,输入Developer: Open Process Explorer。打开后按 CPU 排序,能看到每个 extension host、每个 language server、每个 renderer 的具体占用。
如果发现某个 language server 一直高占用,去对应项目检查是不是有超大文件或者循环依赖。如果发现 extension host 高占用,考虑关掉不用的扩展。
5. 本篇常见错排查
5.1 环境变量不生效
最常见的问题是设了TAOTOKEN_API_KEY但 Codex 读不到。原因通常是设在了当前会话而不是用户级。用[System.Environment]::SetEnvironmentVariable(..., "User")设用户级,然后完全重启 VS Code,不是 reload window,是退出进程再开。
5.2 config.toml 语法错误
TOML 对缩进和引号很敏感。[model_providers.taotoken]这个 section 名如果写错,Codex 会静默回退到默认 provider,不会报错。验证方法是启动时加--verbose,看它实际用的 base_url。
5.3 多个 Agent 抢同一个工作区
如果 4 个 Codex 都指向同一个项目目录,file watcher 会收到 4 倍的变更事件。正确做法是用 git worktree 隔离:
git worktree add ..\repo-agent-1 -b agent-1 git worktree add ..\repo-agent-2 -b agent-2 git worktree add ..\repo-agent-3 -b agent-3 git worktree add ..\repo-agent-4 -b agent-4然后每个 Agent 指向自己的 worktree:
codex -C ..\repo-agent-1 --profile agent1 codex -C ..\repo-agent-2 --profile agent2 codex -C ..\repo-agent-3 --profile agent3 codex -C ..\repo-agent-4 --profile agent4VS Code 那边用一个 multi-root workspace 同时打开 4 个 worktree,只负责看代码和 Git diff,不跑 Agent。
5.4 dev server 重复触发
多个vite、pnpm dev、go run同时跑,Agent 一改文件就全部热更新。建议单开一个终端管 dev server,只保留当前真正要看的那一个,其余停掉。不要觉得 dev server 空着没成本,只要文件在变,它就会被触发。
5.5 Agent 优先级没降下来
如果机器还是被拖死,给 Agent 降优先级:
Get-Process codex,claude -ErrorAction SilentlyContinue | ForEach-Object { $_.PriorityClass = 'BelowNormal' $_.ProcessorAffinity = 0xFFF0 }BelowNormal降低优先级,ProcessorAffinity限制能跑的逻辑线程。0xFFF0在 16 线程机器上表示避开前 4 个线程,把响应空间留给 VS Code 和系统。这个值不要死记,按自己机器的线程数调整。
5.6 鉴权仍然重复
如果日志里还是看到频繁的鉴权请求,检查是不是有 Agent 没读到统一的config.toml。每个 Codex 实例启动时都会读一次~/.codex/config.toml,如果某个实例用了--config覆盖,就会绕过统一配置。检查启动命令里有没有多余的--config参数。
6. 把 Key 和配置收敛之后,下一步做什么
配置收敛只是第一步。真正让多 Agent 并行开发稳定的,是接受一个事实:Agent 不是聊天窗口,是会动本地工程的自动化进程。它的成本不在推理,在它触发的本地工具链。
所以高并发跑法的思路要换:少开完整 VS Code 窗口,多用 CLI Agent;用 multi-root workspace 看代码;用 git worktree 隔离同仓库任务;停掉不用的 dev server;用 Process Explorer 定位真正吃 CPU 的进程。
如果你还在配 Key 的阶段,先去 https://taotoken.net/api-keys 拿一个 Key,然后按第 3 节的骨架把config.toml和settings.json写好。如果你已经配好了,想验证模型通道是否正常,可以去 https://taotoken.net/models 用模型对话直接测一次。如果你打算长期跑 4 个以上的 Agent 做编码任务,建议看一下 Coding Plan,它针对多 Agent 并发场景做了通道层面的优化,比按量计费更适合这种用法。
接入文档在 https://taotoken.net/doc ,里面有各语言 SDK 的接入示例和错误码说明。Claude Code 相关的配置参考 https://taotoken.net/claude-code 。控制台在 https://taotoken.net/console ,可以看每个 Key 的请求量和限流状态。
最后留一个我踩过的坑:ProcessorAffinity设了之后,Agent 重启会丢失,需要重新设。如果想让它在每次启动时自动生效,可以写一个 PowerShell 启动脚本,在启动 Codex 之前先设好优先级和绑核。这样每次开 Agent 不用手动调。