vscode 两个不起眼的插件竟导致内存占用持续飙升至99%
vscode两个不起眼的插件竟导致内存占用持续飙升至99%
怀疑对象:DotENV(v1.0.1)和shell-format(v7.2.5)两个插件
备注:已经关闭了用户级和工作区级的
search.followSymlinks
设置。赶时间的小伙伴可直接看【复盘】和【结论】。操作系统:Windows 11 家庭中文版 (23H2,22631.4037)16GB
vscode版本:
版本: 1.92.2 (user setup)
提交: fee1edb8d6d72a0ddff41e5f71a671c23ed924b9
日期: 2024-08-14T17:29:30.058Z
Electron: 30.1.2
ElectronBuildId: 9870757
Chromium: 124.0.6367.243
Node.js: 20.14.0
V8: 12.4.254.20-electron.0
OS: Windows_NT x64 10.0.22631
谁能想到都2024年了,vscode两个不起眼的小插件(后经证明是一个插件的问题),导致vscode内存占用率居高不下,差点以为是vscode不行,准备转投Jetbrains阵营了。
缘起
本人是一个PHP(拍黄片)的兼职PM(含折腾量,懂的都懂),作为早年的PHPer,基本上前端、后端、Linux、运维简单都懂点。本人又是一个“主前辅后”的码农,所以主要使用的编辑器为 VisualStudio Code(简称“vscode")。
鉴于团队的PHP框架主流为Lavarel,里面含一个.env文件,编辑修改本地化配置的时候非常不友好,所以先安装了DotENV插件。
后因需要编辑Linux下的.sh文件,所以又随便安装了一个shell-format插件。
最开始没啥问题,也用了一段时间,但是后来发现vscode用着用着就输入不了文字,以为是我无线键盘没电,但鼠标也动不了,才知道是系统卡,在任务管理器里一看,内存占用率99%,好家伙,敢随意吃我内存,我定然不会放过。内存占用率倒序排列看看吧,发现竟是vscode的锅,内存竟然高达4个G。
起初用vscode的就是冲着轻量、打开快的特性去的,现在跟早年使用PHPStorm的体验一样,耗内存,表示接收不了一点。早年电脑配置内存普遍还是8G的时候,PHPStorm的内存占用率竟高达4G,具体不记得了,反正就是很卡,电脑带不动,也许是我不会配置,所以就弃用了。
因为这两个插件都说能处理dotenv文件,所以先假设是他们两个插件起冲突而引发的内存高占用问题。
诊断
首先还是无脑用搜索引擎吧,老规矩:先百度、DIY、后梯子谷歌、再stackoverflow、最后vscode github找issue。很幸运,进行到第二步骤(DIY)的时候就定位问题了,节约了工时,为老板偷偷高兴一波。
-
百度搜索的结果大多数是“vscode CPU占用率高“的帖子,且都是好多都是同一个帖子,转来转去的,对,说的就是csdn。果断搜索时排除csdn的结果。
-
按照部分文章的说明,取消了
search.followSymlinks
的设置,内存高占用问题依旧未解决。 -
DIY自查一下吧,进入任务管理器(快捷键Ctrl+Shift+Esc),通过观察,该异常子进程,内存占用率到4.3个G的时候就会退出,然后重启。我玩个黑悟空估计也没这么高的内存占用率吧,没玩过,简单cue一下。
退出前的进程ID78600,内存4个G(下图中,最后一列)。重启后进程ID89272,内存3G(截至截图的时刻,下面第二张图)
- 看该进程具体在做什么。在任务管理器(快捷键Ctrl+Shift+Esc)的“详细信息”板块,查看具体的进程命令行寻找答案。需勾选该列以启用显示,默认显示的列没有,具体操作见下图。
打开“命令行”之后,发现命令行的参数太多,无法显示完全,且任务管理器最大化之后也显示不全,最重要的是,命令行参数无法复制,这就导致无法把关键字复制粘贴到搜索引擎去精确检索。
好在之前安装了Process Explorer工具,找(小技巧:英文输入法下,按字母C键盘,快速定位到C开头的进程)到内存持续上升的Code.exe进程,鼠标右键>Properties>Image 选项卡,
复制Command line里的内容如下:
"C:\Users\79836\AppData\Local\Programs\Microsoft VS Code\Code.exe" --type=utility --utility-sub-type=node.mojom.NodeService --lang=zh-CN --service-sandbox-type=none --dns-result-order=ipv4first --inspect-port=0 --user-data-dir="C:\Users\79836\AppData\Roaming\Code" --standard-schemes=vscode-webview,vscode-file --enable-sandbox --secure-schemes=vscode-webview,vscode-file --cors-schemes=vscode-webview,vscode-file --fetch-schemes=vscode-webview,vscode-file --service-worker-schemes=vscode-webview --code-cache-schemes=vscode-webview,vscode-file --field-trial-handle=8732,i,13489911972744504812,6910048615653825559,262144 --enable-features=kWebSQLAccess --disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess,WinDelaySpellcheckServiceInit,WinRetrieveSuggestionsOnlyOnDemand --variations-seed-version --mojo-platform-channel-handle=8028 /prefetch:8
简单查看其参数,也看不出来该进程到底在干嘛。简单搜了下关键字--type=utility --utility-sub-type=node.mojom.NodeService --lang=zh-CN --service-sandbox-type=none --dns-result-order=ipv4first --inspect-port=0
没有命中任何匹配结果。
- 直接任务管理器里右键结束该进程,观察vscode的反应,发现了端倪。结束异常进程时,编辑器底部提示“拓展主机意外终止。正在重启...”。这个表现,与上面第三步的症状类似。
- 定位到是拓展(插件)的问题,那么下一步就一个个拓展(插件)禁用,观察内存占用情况。这里有个细节,有些插件禁用之后,会显示“重新启动拓展”,则说明该类插件禁用不会立马终止运行,会在内存继续运行,直到编辑器重启或者拓展服务重启。
过程比较费时间,但是也顺利找到了问题。发现禁用掉shell-format插件时,且重启拓展,内存高占用问题会消失。将该插件禁用、重新启动拓展、观察内存占用、启用、观察内存占用,反复进行了多次,结果就是该插件的问题。可以看以下动图(插件DotENV未禁用的前提下),内存在以肉眼可见的速度增长。这里进行了加速和抽帧,实际增加的没这么快,比较线性。
- 因为该插件的描述中,提到了能处理dotenv文件,所以怀疑是与插件DotENV起冲突,我还是愿意相信插件本身没有问题的。但很快就被打脸,当我把DotENV插件禁用掉之后,再开启shell-format,问题依旧。但未证明是否其他插件有冲突,因为不是所有插件都禁用了,直到这一刻,我依旧不愿意相信下载量175m(1758349)的shell-format插件会有这么low。
- 但很多事情,不是不愿意相信就不存在,我悟了,也萎了。受了vscode官方性能问题调试(见参考2)的启发,打开了“正在运行的拓展”面板,看到如下内容(截图是分析后的结果)。可按照红色标记的方法分析拓展,结果发现shell-format激活(Activation)时间继续增加,说明其一直在活跃运行中。安装的其他的插件如
PHP Intelephese
,在未禁用情况下,也没有在运行。注意,此时编辑器没有打开任何文件,除了打开了.gitignore。也刚好是打开了.gitignore文件,才激活了shell-format插件的运行,因为重启vscode之后,在不打开任何文件的前提下,内存高占用问题是不存在的,“正在运行的拓展”的面板里也看不到shell-format。所以,初步结论是:shell-format在编辑器打开支持的文件类型的文件时,会激活启用,然后进入内存蚕食模式。至此,初步结案,罪魁祸首是shell-format插件。
复盘
-
启用shell-format插件,重启编辑器。
-
打开一个工程文件夹,关闭任何打开的页面。打开“正在运行的拓展”的面板。
会发现,只有几个编辑器自带的几个拓展或自带拓展附带的拓展,具体如下图:
-
打开一个.gitignore文件,然后回到“正在运行的拓展”面板,发现启用了shell-format插件,见往前数第四个图。
-
打开操作系统的任务管理器,观察名称为Code.exe且内存持续上升的进程(以下简称”高内进程“,实际是vscode拓展服务进程)。以下步骤皆保持观察。
-
关掉第三步打开的.gitignore文件,内存依旧持续上升。因为该插件还在内存运行中。
-
不做任何处理,高内进程的内存持续上升,直至达到4.3G左右,自动重启(vscode的拓展服务进程)。
-
禁用shell-format插件,内存还在上升中。因为插件还在运行中。
-
点击shell-format的”重启启动拓展“,高内存Code.exe进程消失。且内存持续增加的问题不再出现。
解决问题很简单,禁用或卸载一个插件的事,但是发现问题和定位问题的过程比较曲折,尤其是编写此文档时,重新复盘的过程。
为什么要写这个文章,做吃力不讨好的事?因为个人遇到的好多问题,都是通过网页检索找到的答案或者受启发之后再找到答案的。为表示对他们的感谢,也为受困于类似问题的小伙伴提供一点小小的帮助,所以撰写了该文章。
结论
vscode内存占用率高,是插件shell-format(v7.2.5)的锅,跟插件DotENV没关系。
总结
- 不用的插件,及时禁用(全局禁用或工作区禁用)或卸载。
- 禁用当前工作区(项目工作目录)用不到的插件。
- 禁用vscode插件,提示“重新启动拓展”的,说明该插件禁用之后,还在内存运行。
- 插件质量良莠不齐,安装时注意观察其下载量和区分名称(被插件vetur和vuter坑了的,举个爪)。
- vscode的拓展服务进程的内存占用率达到4.3G后,会自动重启。4.3G是本人电脑调试时的能达到的最大值,可能会因机而异。
名词解释
- 拍黄片:拼音输入法下,输入“php”,大多数输入法软件提示的第一个词就是“拍黄片” ,所以有些php开发者经常以此自嘲。
- 主前辅后:来自LOL主Q辅E的技能加点的说法,表示主要加点Q技能,辅加E技能,如”皇子“。所以,主前辅后,表示以前端开发为主,也懂点后端。
- 黑悟空:全名“黑神话:悟空”,截至写稿时(2024.8.30)该游戏已经推出10天,处于爆火期。作者在各大平台被相关帖子“洗脑了”。什么八戒蜘蛛精意难平,什么悟空四妹意难平,什么菩提老祖是悟空师父唐僧只是老板,什么八戒和侯哥才是真兄弟,什么唐僧从来不敢赶八戒走因为他真的会走,诸如此类。害,媒体想让我看啥,我不得不看啊,社畜的无奈。
参考
- 【CSDN】解决VScode内存占用过大问题
- 【github/microsoft】Performance Issues,vscode官方推荐排查问题的指南