最近vs code有个比较实用的功能-Remote Development using SSH正式发布了,之前一直在insider中。

## 为啥要远程连接虚拟机开发

组里前辈提倡用这个功能加上vagrant/ansible配置开发环境让开发和运行环境保持一致,同时又能让程序部署的过程脚本化。 用了一下感觉很棒,同时得到了windows下的vs code编辑界面和linux下的调试和运行环境。

## 配置方法

具体的配置vs code的文档上面链接中写的非常详细,在vo code中安装插件后配置好.ssh/config连接即可。

## 遇到的问题

### vagrant每次摧毁重来后,机器指纹改变连不上得手动删除ssh中的指纹记录

每次用vs code连接远程主机后,会询问是否信任然后加入known_hosts文件中,但是,在使用vagrant虚拟机调试时经常会需要destroy掉再up,这时候机器指纹改变,导致连不上。。。 解决办法是像以下这样配置:

Host your-project-vagrant
    User vagrant
    HostName 127.0.0.1
    Port 8282
    IdentityFile D:\Users\yourname\workspace\your-project\.vagrant\machines\default\virtualbox\private_key
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

重点是其中的UserKnownHostsFile要让它不写入本机的known_hosts文件中。

### 语言和编码问题

在vs code server默认的语言跟本地vs code一样,远程中的集成终端也是,而如果本地是中文的话,远程的LANG=zh_CN.UTF-8会导致有些命令无法执行(如python manage.py无法运行)。

解决办法:

有两处跟集成终端中的远程环境变量有关的配置:terminal.integrated.setLocaleVariablesterminal.integrated.env.linux.

经试验,terminal.integrated.env.linux优先级较低,会被 terminal.integrated.setLocaleVariables所对应本地语言变量配置覆盖。 将 terminal.integrated.setLocaleVariables设置为false,如此terminal.integrated.env.linux中设置lang就可以生效,或者就不用设置了也能正常运行了。

### 虚拟机没反应的问题

以虚拟机作为开发机的情况下,有时会很卡连ssh都断线。经排查是cpu占有率飙高导致无法使用,其中kswapd0占用率接近100%。 搜索一下得知:

 kswapd0进程的作用:它是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high。通过阻止kswapd0进程过渡活跃地消耗CPU的方法是设置大页内存。

所以其实是内存太小导致的,因为编辑开发和运行都在虚拟机上,包括vs code server/程序的调试运行/数据库,所以得调整下vagrant配置文件中机器的内存配置,如果是在虚拟机中开发的话,机器性能还是要好点才行,ssd/cpu/内存都要跟得上。