vscode插件更新时cpu满载主因是语言服务器重载、文件监视器重建、索引全量刷新三重叠加,尤其files.watcherexclude未配或错误导致node_modules被扫描;用code --status定位高cpu进程,配对"**/node\_modules/**": true等规则并重开工作区,linux需调高inotify句柄数,更新后须彻底退出vscode再重启。

VSCode插件更新时后台CPU满载,不是更新本身慢,而是更新触发了语言服务器重载、文件监视器重建、索引全量刷新三重叠加——尤其当 files.watcherExclude 没配或配错时,node_modules 目录一被扫描,inotify事件就爆炸式涌出,Node.js子进程直接 100%。
用 code --status 立刻锁定真凶进程
别等更新完再查。更新弹窗刚出现、风扇开始转,就立刻打开终端执行:
code --status
重点关注两行:
-
Extension HostCPU% >60% → 某个插件在重激活(常见于ms-python.python、esbenp.prettier-vscode) -
tsserver或pyright单独占高 → 语言服务正在全量重解析依赖,不是插件更新慢,是它默认策略太激进
记下对应 PID,再用 ps -p [PID] -o args= 看完整命令行,确认是不是 node /path/to/pylance 这类路径——这才是要调的靶子。
files.watcherExclude 必须配对且生效才管用
插件更新会触发 VSCode 重建整个文件监视树。如果 files.watcherExclude 没配,或者配错格式,chokidar 就会递归扫 node_modules 里几万个小文件,CPU 满载是必然结果。
- 必须写在项目根目录的
.vscode/settings.json中,用户级设置不生效 - 通配符只认
"**/node_modules/**": true——写成"node_modules/**"、"*/node_modules/*"或"node_modules"全无效 - 必加项不止一个:
"**/dist/**": true、"**/build/**": true、"**/.git/**": true、"**/__pycache__/**": true - 改完保存后,必须关闭并重新打开该工作区;
Developer: Reload Window不触发 watcher 重建
更新前手动降级语言服务比等它自己恢复更可靠
Python 和 TypeScript 插件更新后,语言服务器常默认启用完整语义分析,中大型项目下内存驻留破 1.2GB、CPU 持续拉高是设计使然,不是 bug。
- Python 项目:把
python.languageServer从Pylance临时切到Jedi,重启语言服务(Python: Restart Language Server) - TypeScript 项目:在
.vscode/settings.json加上"typescript.preferences.includePackageJsonAutoImports": "auto",避免加载全部@types - ESLint 类插件:把
"eslint.run"改成"onSave",禁掉onType实时检查,更新期间不卡输入
这些配置改完不用重启 VSCode,但必须关掉当前窗口再重开,否则旧 watcher 和旧语言服务进程仍在后台跑着。
Linux 用户额外检查 inotify 句柄数是否够用
插件更新过程中,watcher 频繁重建,若系统 inotify 句柄不足,会静默失败 + 反复重试,CPU 不一定飙高,但你会明显感觉“改了文件没反应”,接着又突然卡住。
- 运行
cat /proc/sys/fs/inotify/max_user_watches查当前值 - 若低于
524288,立即执行:echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches
- 这个改动重启后失效;如需永久生效,得追加到
/etc/sysctl.conf里
真正容易被忽略的是:插件更新完成 ≠ 后台任务结束。很多扩展注册了 onStartupFinished,更新后自动重拉进程,而你只关了编辑器窗口,没退出 Dock 图标(macOS)或系统托盘(Linux/Windows),旧进程就一直挂着。所以每次更新完,务必彻底退出 VSCode 再重进。











