在这里插入图片描述

linux分区一般来说是较为灵活的,一般还会单独分出一个交换分区(也就是swap分区),这个分区是用于在物理内存不够用的情况下来帮助承担存储程序所需内存的任务,现在很多的电脑或者服务器的内存都是较大的,所以一般swap分区都不会派上用场,但是做好交换分区的后备肯定也是必需的。

在前不久,我就碰上了服务器的swap分区被占满的情况,但是这时候检查物理内存的使用情况,却发现物理内存还有绝大部分未被使用,因此就引起了我的兴趣,本文将简要介绍swap分区,以及介绍如何处理物理内存还存在大量剩余但是swap分区却几乎被占满的情况。


swap分区是什么?

在Linux分区中,至少需要分的两个区就是根目录和swap分区,也就是在分区时需要在硬盘上分出一小部分的空间作为swap分区,这个分区之后将不再用于储存文件,而只是做为交换分区使用了。从这里我们知道swap分区若是分配太多空间则会使硬盘的储存空间变少,同时swap分区若太小又不能达到后备的效果。但是现在的电脑的内存都是较大的,一般情况下swap分区是不会被使用到的,因此现在电脑上的swap分区所占的大小也都普遍不大。这里有兴趣的可以查看red hat官方给出swap分区大小设置的建议:link

上面已经提到了swap分区是为了应付物理内存不足的情况,也就是其也是用于储存程序运行时所需数据的,但是其和内存不一样的地方在于内存中的数据直接被程序调用,是和CPU直接交流的数据,而swap分区中要储存的数据是程序调用时会使用到的,但是却暂不使用的数据。这时候内存就能够用于储存正在运行的程序或数据了。等到程序需要使用swap分区中保存的一些数据时,再将这些数据从swap分区中转移到内存中来。这样就完成了swap分区的工作。

要查看swap分区的大小或者swap分区的使用情况,使用top、htop、free命令都可以。

要查看swap分区被什么程序占用,网络上可以查到有很多现成的脚本可以使用,可以多查一下,但是都是需要root权限的,如:

for i in $(cd /proc;ls | grep "^[0-9]" | awk '$0>100'); do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps;done| sort -k2nr

可以看到实际上在这个命令中实际上就是在读取/proc文件夹中的进程相关的文本文件所储存的内容,因此我们也可以自己写一个脚本来读取这些文件。

swap分区被占满后的处理方式

现阶段大家使用的电脑的内存一般都较大,因此一般是不会出现物理内存被占满的情况,所以应该也是不应该出现swap分区被占满的情况的,因此按道理来说swap分区被占满应该是不应该出现的,若是出现的话表明可能设置应该修改一下了。

上面提到swap分区在一般情况下不应该被调用,但实际上swap分区是否被使用和linux中的一个设置有关,即vm.swappiness参数,这个参数的大小(范围为0-100)对应着使用swap分区的倾向,值越大表示越倾向于使用swap分区,而值越小则表示越倾向于不使用swap分区。ubuntu中默认设置的这个值为60,大致表示使用物理内存大于1-60%=40%后就开始使用swap分区,在这种情况下swap分区就倾向于被使用,因此也很可能会出现快被占满的情况(我碰到的情况就是这样)。

上面解释了是因为vm.swappiness这个参数,因此只需要修改这个参数就能够改善情况了,一般来说改为10就可以了,临时修改可以使用:

cat /proc/sys/vm/swappiness # 查看参数值
sysctl vm.swappiness=10

临时修改的话,电脑重启后又会恢复原来的默认参数值。因此可以到文件中修改此值,可以使用下面的命令进行修改:

echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
# 上一句为修改
# 第二句为启用修改后的设置

但是即使修改了,未重启的话电脑已被占据的swap分区也并未被释放,这时候可以先将交换分区关闭再打开,这样就能够释放交换分区的内存了,之后也应该不会出现swap分区几乎被占满的情况了。但是关闭交换分区时需要注意是否有一些程序正在使用交换分区,以防数据或任务被破坏。

这里将几个命令列在这:

swapon -s
cat /proc/swaps

上面两个命令用于查看swap分区的使用情况和挂载点。结果:
在这里插入图片描述
从结果中获取到挂载点/dev/dm-1,下一步就可以通过命令关闭这个挂载点上的swap分区

swapoff /dev/dm-1
# 关闭是需要消耗一定时间的

完全关闭后再打开即可:

swapon /dev/dm-1

这样就解决了swap分区被占满的问题了。

参考:https://juejin.cn/post/6844904081677352968
参考:https://www.cnblogs.com/fjping0606/p/10598654.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐