使用vs_code连接linux虚拟机开发调试代码
最近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.setLocaleVariables
和terminal.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/内存都要跟得上。