问题概述
开发SystemUI时,使用内存为16G的主机,Ubuntu 20.04的系统编译SystemUI的源码,编译的过程中发现电脑卡顿,鼠标不能移动。必须重启电脑才可以使用,如果继续编译代码,还是会出现卡顿的问题,严重影响开发效率。
分析问题
发现这个问题的时候,我的第一想法是内存不足,因为我的主机电脑的内存是比较老的,内存只有16G,所以我就准备开始采购内存条。转念一想,不对呀,前几天还能正常编译代码呢,突然不行了只有两个原因,内存条坏了,这点不可能,因为不编译代码,就没有问题,第二个原因,就是大量的CPU被占用了。后面在我的FrameWork同事的提示下发现了问题的真正原因。发现问题的方法也很简单,在编译源码的时候,另外开一个窗口,使用top命令,查看当前的CPU状况,和内存的使用状况。如下图所示:
>上图是编译代码正常时候的情况,如果不正常的情况是,图中的红框内没有交换分区的内存,然后CPU会一直飙升到特别高,我的当时飙升到了1400%多,还出现虚拟内存不足的情况。导致这一问题的原因就是交换分区没有设置。交换分区可以在系统运行内存不足时将一部分未使用的内存文件转存在此分区以减轻动态内存的压力。所以解决这一问题的方法就是设置调整交换分区。
解决问题
问题发现后,我们开始准备配置我们的交换分区:
查看交换分区
首先我们需要先检查下是否启用了交换分区
$ sudo swapon --show #未启用SWAP分区的话,执行此命令将不会有任何输出
创建交换分区
如果已经设置成功了就会出现上图中的信息,没有设置的话什么也不输出。
如果没有设置交换分区,则运行下面的命令创建交换分区
sudo fallocate -l 32G /swapfile #创建大小依据实际物理内存大小自行调整
需要特别注意的是,这里分配的交换分区的内存不宜太大,建议创建的文件大小为实际物理内存的 2-3 倍,比如我的物理内存是16G,我的这里就设置成32G
创建完成后给swapfile添加权限
$ sudo chmod 600 /swapfile
给完权限后,我们执行下面的命令标注交换分区
sudo mkswap /swapfile
如果已经执行过命令,则会输出下面的信息。
创建完交换分区后,就可以激活分区了
sudo swapon /swapfile
如果已经激活过,运行命令会提示下面的信息
可以使用下面的命令查看交换分区是否工作:
sudo swapon --show
sudo free -h
命令执行结果如下所示
为了防止交换分区莫名丢失,推荐将创建的交换分区设置为永久分区,将 交换分区路径写入到/etc/fstab
文件中
/swapfile swap swap defaults 0 0
删除交换分区
删除交换分区首先需要使用下面的命令停用交换分区:
sudo swapoff -v /swapfile
然后在/etc/fstab
文件中删除交换分区的路径。接着使用下面的命令删除交换分区文件
sudo rm /swapfile
调整交换分区的活跃度
我们可以使用下面的命令查看当前系统设置的 Swappiness 值
cat /proc/sys/vm/swappiness
可以使用下面的命令临时调整这个活跃值,这个活跃值可以设置在0-100,根据环境需求自行调整
sudo sysctl vm.swappiness=60
我们也可以设置永久性的 活跃值,方法就是编辑/etc/sysctl.conf
文件,在文件末尾添加下面的内容:
vm.swappiness=60