原因
今天早上 AI 部门工程师来找我说,你会给 ubuntu 设置 swap 分区吗,我们机器内存好像不咋够用了,给我搞个 swap 分区吧!我说好的,这么简单分分钟钟的事情,我三下五除二的就给他搞定了,给他说好了,你用吧,但是过一会他就跑来说,你给我弄好 swap 分区之后这台机器就特别特别卡,你能帮我看看什么问题吗?
排查
我登录到机器上,查看机器内存free -h结果如下图
从结果可以看出来,机器在内存还剩 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