成功最有效的方法就是向有经验的人学习!

内存还剩余很多,却使用 swap 分区

原因
今天早上 AI 部门工程师来找我说,你会给 ubuntu 设置 swap 分区吗,我们机器内存好像不咋够用了,给我搞个 swap 分区吧!我说好的,这么简单分分钟钟的事情,我三下五除二的就给他搞定了,给他说好了,你用吧,但是过一会他就跑来说,你给我弄好 swap 分区之后这台机器就特别特别卡,你能帮我看看什么问题吗?

排查
我登录到机器上,查看机器内存free -h结果如下图

file

从结果可以看出来,机器在内存还剩 148G 但是 swap 分区却完全被使用完了,这说明我给他创建好 swap 分区之后完全他完全不使用内存了,这是什么情况,查阅资料得到如下解决办法

解决问题
swappiness的值的大小对如何使用swap分区是有着很大的联系的。

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

当该参数= 0,表示只要有可能就尽力避免交换进程移出物理内存; 该 参数=100,这告诉内核疯狂的将数据移出物理内存移到swap缓存中。

这个值只是一个Linux在判断是否交换内存(swap)的一个“倾向”参考值,而并不是说,设置为0以后,Linux就完全不会使用内存交换空间

然后 ubuntu 和 centos 一般默认都是 60 ,就是当内存使用=(100%-60%)*内存总量

cat /proc/sys/vm/swappiness
60

所以才会出现我们上面那种情况,这个时候我们只需要调整这个值即可,

sysctl vm.swappiness=10 #临时修改
echo "vm.swappiness=10" >> /etc/sysctl.conf #永久修改
sysctl -p #生效

改完之后就会使用物理内存了,刚才卡的情况也解决了

参考
什么是 swap 分区
Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android是基于Linux的操作系统,所以也可以使用Swap分区来提升系统运行效率 。

交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

以上解释来自于百度百科

什么时候才会使用 swap 分区
其实是Linux通过一个参数swappiness来控制的。当然还涉及到复杂的算法。

这个参数值可为 0-100,控制系统 swap 的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

修改这个权重

echo 10 > /proc/sys/vm/swappiness
sysctl vm.swappiness=10 #临时修改
echo "vm.swappiness=10" >> /etc/sysctl.conf #永久修改
sysctl -p #生效

swap分区设置多大合适
关于这个问题,应该说只能有一个统一的参考标准,具体还应该根据系统实际情况和内存的负荷综合考虑,像ORACLE的官方文档就推荐如下设置,这个是根据物理内存来做参考的。

RAM Swap Space
Up to 512 MB 2 times the size of RAM
Between 1024 MB and 2048 MB 1.5 times the size of RAM
Between 2049 MB and 8192 MB Equal to the size of RAM
More than 8192 MB 0.75 times the size of RAM

如何创建 swap 分区
利用剩余磁盘创建 分区来生成swap 分区
1,首先利用 fdisk 方式创建一个分区出来

2,然后使用 mkswap 方式来格式化分区

mkswap /dev/sdb2

3,启动交换分区

swapon /dev/sdb2

4,设置成开机自动启动

echo "/dev/sdb2 swap swap defaults 0 0" >> /etc/fstab

利用剩余空间创建 swap 分区
1,创建一个目录,(可省略,但是不建议)

mkdir /swapdir && cd /swapdir

2,使用 dd 命令创建大小合适的的交换文件:

dd if=/dev/zero of=/swapfile bs=1M kcount=1000

创建一个名为swapfile 的 1G 的交换文件
3,格式化此文件

mkswap /swapdir/swapfile

4,启用交换分区

swapon /swapdir/swapfile

5,设置开机自启动

echo "/swapdir/swapfile swap swap defaults 0 0" >> /etc/fstab

如何扩容 swap分区
只需要按照上面步骤创建 swap 分区,挂载上去之后就自动扩容上去了

如何缩减 swap 分区
1,用下面命令查看下当前 swap 分区上面挂载了那些磁盘

swapon -s / cat /proc/swaps

2,关闭对应的 swap 分区

swapoff /dev/sdb2
赞(3) 打赏
未经允许不得转载:陈桂林博客 » 内存还剩余很多,却使用 swap 分区

大佬们的评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

全新“一站式”建站,高质量、高售后的一条龙服务

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏