一次离奇的 VSCode CPU 爆红100%排查经历
一次离奇的 VSCode CPU 爆红100%排查经历
一个星号*引发的惨案
问题现象
那天,我像往常一样打开项目准备写代码,却发现 VSCode(后来换 Trae 也一样)突然变得异常卡顿:
- Extension Host 进程 CPU 占用飙升到 100%+
- 电脑风扇狂转,像要起飞一样
- 整个编辑器卡死,鼠标都飘了
一开始以为是某个扩展在搞事情,于是开始了常规排查:
| 操作 | 结果 |
|---|---|
| 禁用所有扩展 | ❌ 问题依旧 |
| 重装编辑器 | ❌ 问题依旧 |
| 安全模式启动 | ❌ 问题依旧 |
正当我怀疑人生的时候,发现了一个诡异的现象:其他项目完全正常。
这就很有意思了 —— 既然其他项目都好好的,问题一定出在这个项目的某个独特属性上。
排查过程
1. 进程分析
打开系统监视器,看到了惊人的一幕:
Extension Host 居然派生出了 20+ 个 rg --files 进程,每个都在疯狂扫描文件:
rg --files --hidden --case-sensitive --no-require-git --no-ignore-parent --follow --no-config
这些进程的 CPU 累积占用超过 60%,系统直接响应缓慢。
rg是 ripgrep 的缩写,一个超快的文本搜索工具,VSCode/Trae 用它来索引项目文件。
2. 项目规模检查
我首先怀疑是不是项目太大了?但检查后发现:
$ find . -type f | wc -l
2958
不到 3000 个文件,这个规模绝对不应该导致 CPU 爆炸。
3. 对比分析
| 项目 | 状态 |
|---|---|
JZJ_theta* |
❌ CPU 爆炸 |
| 其他任意项目 | ✅ CPU 正常 |
既然其他项目都正常,问题一定出在这个项目的某个独特属性上。
4. 真相大白
检查项目路径时,我愣住了:
$ ls ~/
JZJ_theta* # 注意这个星号!
项目名称中包含了 * 字符!
我突然意识到 —— 这个项目是为了测试 Theta* 算法临时创建的,随手打了个 JZJ_theta*,没想到这个星号成了罪魁祸首。
根本原因
VSCode/Trae 内部使用 glob 模式进行文件匹配。路径中的 * 被解释为通配符,导致了一系列连锁反应:
路径包含 *
↓
rg 命令将 * 展开为"匹配所有文件"
↓
触发递归扫描,甚至可能扫描整个文件系统
↓
启动大量并行进程
↓
CPU 爆炸 💥
简单来说:* 在文件路径中是特殊字符,不应该被用作普通文件名。
解决方案
找到问题后,解决就很简单了 —— 重命名项目目录,去掉特殊字符:
mv ~/JZJ_theta* ~/JZJ_theta_star
然后重新打开项目,问题彻底解决。
就这么简单,一个 mv 命令,世界清净了。
经验总结
✅ 项目命名规范建议
| 推荐 | 不推荐 | 原因 |
|---|---|---|
my_project_v1 |
my_project_v* |
* 是通配符 |
ros_ws |
ros_ws* |
* 是通配符 |
theta-star |
theta* |
* 是通配符 |
JZJ_theta_star |
JZJ_theta* |
* 是通配符 |
安全字符集:字母、数字、下划线 _、连字符 -、点 .
避免使用的字符:
*?—— glob 通配符[]{}—— 括号扩展|—— 管道符号<>—— 重定向符号$—— 变量引用!@#&()等 —— 各种特殊含义
🔍 类似问题排查思路
如果你也遇到类似的诡异问题,可以按这个顺序排查:
- 确认问题范围:是单个项目还是所有项目?
- 检查进程:哪些进程在消耗 CPU?(
top/htop/htop) - 对比分析:问题项目 vs 正常项目的差异
- 检查路径:是否包含特殊字符?是否指向系统目录?
- 二分法:禁用扩展、安全模式、重装 → 排除干扰项
📝 向编辑器反馈
这本质上是 VSCode/Trae 的一个 bug —— 路径中的特殊字符应该被正确转义。已向相关团队反馈此问题。
写在最后
有时候,问题不在代码,不在扩展,不在编辑器配置,而在于一个不起眼的星号。
一个简单的重命名,解决了困扰已久的 CPU 爆炸问题。
希望这篇小记能帮助遇到类似问题的开发者。
💡 深有体会
经历了这次事件,我终于明白为什么很多地方对命名有这么多符号限制了。
以前总觉得那些限制太严格,心里还嘀咕:“至于吗?不就是名字而已。”
- 变量名不能用特殊字符
- 文件名不能包含
*?<>|:等符号 - 项目名只能字母数字下划线
现在彻底懂了 —— 每一个看似繁琐的限制,背后可能都是血泪教训。
| 字符 | 在 Shell 中的含义 |
|---|---|
* |
匹配任意多个字符 |
? |
匹配单个字符 |
| ` | ` |
< > |
输入/输出重定向 |
& |
后台运行 |
$ |
变量引用 |
| 空格 | 参数分隔符 |
这些字符在编程环境、命令行、文件系统里都有特殊含义。如果允许它们出现在文件名中,就可能被各种工具"误解",引发意想不到的灾难。
命名规范不是束缚,而是保护。
遵守规范,看似多了一分约束,实则少了一分踩坑的风险。
这次一个星号引发的 CPU 爆炸,就是最好的教训。
“The bitterness of poor quality remains long after the sweetness of meeting the schedule has been forgotten.” —— 赶工期的甜蜜早已遗忘,低质量的苦涩却长存。
同理:图一时方便用了特殊字符,后续的坑可能让你哭都哭不出来。
更多推荐



所有评论(0)