Guantao Chen | 陈冠韬

Back

省流#

最后真正奏效的应该是在本地的settings.json里面添加两行(如果已有就修改相应的值):

settings.json
"remote.SSH.useLocalServer": false,
"remote.SSH.useExecServer": true,
json

简单来说这两行代码就是停止mac本地启动的中转/管理进程,直接用 SSH 命令去远程机器上启动 VS Code Server。

折腾历程#

发现问题#

在SSH我的Linux主机后,正常使用是不卡顿的。但是一旦启用C/C++的intellisense,就会从流畅变成小卡最后到卡出💩(terminal,settings,打字,一切和远程有关的操作都被影响)。我尝试了用topbtop检查高占用率进程,并无收获。网络上也没有相关的问题和解决办法,我只好自己开始摸索。

两个版本的VSCode#

本地设置#

由于之前也遇到过类似的问题(SSH到服务器,不过当时是python卡),我直接沿用之前的方法装旧版本VSCode,发现依然奏效。但是为了个SSH就一直用旧版本VSCode,实在是有点窝囊。因此我最开始想的解决方法是:新版本的VSCode正常使用,而旧版本的VSCode仅用于SSH连接。由于不同版本的VSCode对插件版本的要求不一样,最好的方案是让两个VSCode分别使用不同的本地缓存路径,实现物理隔离:

// 版本一
open -n "/Applications/Visual Studio Code.app"

// 版本二
open -n "/Applications/Visual Studio Code Legacy.app" --args \
  --user-data-dir "$HOME/.vscode-legacy-user-data" \
  --extensions-dir "$HOME/.vscode-legacy-extensions"
bash

由于Karabiner最好不要直接设置长命令,我先写一个shell脚本来打开旧版本VSCode:

code-old
#!/bin/bash
open -n "/Applications/Visual Studio Code Legacy.app" --args \
  --user-data-dir "$HOME/.vscode-legacy-user-data" \
  --extensions-dir "$HOME/.vscode-legacy-extensions"
bash

在Karabiner Elements中设置快捷键来区分这两个版本(原来已经有option+1打开VSCode,现在只用新设置一个快捷键打开旧版本):

这样设置好之后,旧版本VSCode就可以正常使用了,SSH连接也不会卡顿了。我切换回新版本VSCode,SSH可以连接到主机,但是开始疯狂重新建立连接。

远程主机设置#

虽然两个本地VSCode是隔离的,但它们连接同一台 SSH 主机时,远程默认都用~/.vscode-server目录存放服务器端的文件。此时两个VSCode实例在同时争抢这个目录,导致频繁重启。解决方法是让旧的VSCode使用独立的远程 server 目录~/.vscode-server-legacy(其中Tony-Linux是SSH的主机别名):

settings.json
{
  "remote.SSH.serverInstallPath": {
    "Tony-Linux": "~/.vscode-server-ssh-minimal"
  },
  "remote.SSH.useLocalServer": false
}
json

清理一下之前的缓存就应该可以正常区分登录了:

rm -rf ~/.vscode-server
rm -rf ~/.vscode-server-insiders
bash

吗?

又报错了:

到这里我才发现,旧版本的VSCode能够正常登录,是因为在settings.json中设置好了useLocalServer = false,而新版本的VSCode默认是true的。也就是说,旧版本VSCode直接在远程机器上启动VSCode Server,而新版本VSCode则会先在本地启动一个中转/管理进程,然后通过SSH连接到远程机器上启动VSCode Server。这个中转/管理进程可能就是导致卡顿的罪魁祸首。

settings.json中设置:

settings.json
{
  "remote.SSH.useLocalServer": false,
  "remote.SSH.useExecServer": true
}
json

两个版本的VSCode都可以正常SSH了。

大一统#

既然新版本的VSCode也可以正常SSH了,那还要旧版本的干啥呢?我直接卸载了旧版本VSCode,删除了相关的缓存文件、Karabiner的旧版本快捷键,一切又干净了。

alt text

折腾了一圈,没想到只用加两行配置就可以了。不过解决了心头大患也不枉这折腾的3个小时。

Comment seems to stuck. Try to refresh?✨