有时用vscode打开比较大的工作目录,用一会儿机器会突然卡顿,鼠标都移动不了,但是查看系统资源会发现cpu全是空闲的,mem占用也不到50%,但是swap几乎处于打满状态。
一、原因分析
之前遇到过几次这个问题,改为打开单个项目目录就好了。今天在一个小项目编译时再次遇到机器卡死的问题,现象跟上边相同,最终查看mem/swap是被一批叫cpptools、cpptools-srv的进程占用,将近6个G左右。并行编译和产出的cp也会占用大量swap。
查询后发现,这是vscode的一个插件./vscode/extensions/ms-vscode.cpptools-1.16.3-linux-x64/bin/cpptools,其实就是vscode推荐的微软官方C/C++插件。这个插件有很多好用的功能,类似一键跳转到定义/声明位置、查找所有引用等。而问题就出在这里的智能感知缓存功能上C_Cpp.intelliSense,它为了实现快速的错误检测、代码提示、引用关系跳转等,会对代码进行分析和缓存,从而占用机器资源。
二、解决方法
1.禁用微软C/C++插件
简单粗暴的方法,可以直接禁用此插件。效果立竿见影,但是也确实会带来不便,比如想查找定义/引用很不方便。
2.加大系统Swap大小
在16核CPU+16G内存的电脑上,不应该出现这么低级的卡顿问题,究其根因,其实是因为Swap交换空间太小导致的。
正常情况下,Swap交换空间最好为物理内存的1-1.5倍,才能有充足的空间用于存贮被交换下来的内存,而Ubuntu在默认安装时,只分配了2G Swap空间,这里我们选择直接加大Swap空间大小。
# 查看swap大小(ubuntu默认Swap为2G,但是物理内存为16G,swap太小)
free -m
total used free shared buff/cache available
Mem: 15770 1521 890 333 13358 13579
Swap: 2047 1009 1038
# 查看swap分区挂载位置(/swapfile)
cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 2097148 1025792 -2
# 停止交换分区
sudo swapoff /swapfile
# 检查停止状态
cat /proc/swaps
# 删除分区文件
sudo rm /swapfile
# 建立swap文件(这里跟物理内存保持一致为16G)
sudo dd if=/dev/zero of=/swapfile bs=1024 count=16000000
# 使用新分区
sudo chmod 600 /swapfile
sudo mkswap -f /swapfile
Setting up swapspace version 1, size = 15.3 GiB (16383995904 bytes)
no label, UUID=9b592b83-bfbb-4bfb-8ca1-b4e479759a6d
sudo swapon /swapfile
# 查看swap大小(变为16G)
free -m
total used free shared buff/cache available
Mem: 15770 2613 176 668 12980 12156
Swap: 15624 0 15624
cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 15999996 256 -2
# 永久生效交换分区
vim /etc/fstab
/swapfile none swap sw 0 0
调大Swap后,C/C++插件也可以打开了,再也没遇到卡顿问题了。
yan 23.7.18
参考:
https://blog.csdn.net/qq_34160841/article/details/104856865