最近发现2H4G的小鸡内存不够用了,内存和Swap分区双双爆满,奈何囊中羞涩无法从升级硬件入手,只能通过扩充Swap虚拟内存解决了。
什么是Swap分区呢?
Swap分区,即交换区,系统在物理内存(这里指运行内存)不够时,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中,从而解决内存容量不足的情况。
查看 Swap分区
首先查看一下系统分区情况
free -m #查看Swap分区使用情况
如下图所示,Mem表示物理内存大小(RAM),Swap则表示交换分区的大小:
图片位置
如果我们VPS本身的物理内存不够用,并且Swap分区设置的又太小,那么就会出现Linux Swap占用很高,甚至Swap分区全部占满的情况。
根据Linux内存的大小不同,需要按照对应关系设置Swap分区的大小,参考如下:
- 内存 <= 4GB:Swap 建议 4GB
- 内存 4~16GB:Swap 建议 8GB
- 内存 16G~64GGB:Swap 建议 16GB
- 内存 64G~256GB:Swap 建议 32GB
上述仅作为物理内存不够用参考建议,大家可以根据自己的情况按需调整。
关闭/删除 Swap分区
如上图所示,物理内存(Mem)和交换分区(Swap)都已经不够用了,咱们就需要对交换分区(Swap)进行扩容。第一步,需要关闭/删除当前交换分区(Swap)
swapon -s #查看Swap分区路径
swapoff -a #关闭Swap分区
rm -rf /var/swap #删除Swap分区
创建新的Swap分区
依次执行下列代码:
dd if=/dev/zero of=/var/swapfile bs=1M count=4096
#其中/var/swapfile是文件位置,bs=1M 代表增加的模块大小是1M,count=4096 代表模块个数,bs*count就是文件大小,执行时间较长,且根据文件大小而定,耐心等待 ...
mkswap /var/swapfile #格式化为Swap分区文件
swapon /var/swapfile #启用Swap分区
新的Swap分区创建好了,接下来检查一下新的Swap分区是否启用
free -m #查看Swap分区使用情况
图片位置
如上图所示,4GB的Swap分区就创建成功了。
但是到这一步,只是临时swap,需要再配置开机启动(fstab)使swap文件永久有效
vi /etc/fstab #编辑fstab文件
# /swap none swap sw 0 0 #注释掉之前的Swap开机启动项
/var/swapfile swap swap defaults 0 0 #在新行插入
或者直接执行
echo "/var/swapfile swap swap defaults 0 0" >>/etc/fstab
更改Swap依赖度(swappiness)
查看依赖度
cat /proc/sys/vm/swappiness #查看依赖度
swappiness值的范围为0-100,值越高代表对swap依赖程度越高,但是swap是基于文件储存的缓存交换机制,所以效率明显低于物理内存,swappiness值过高的情况下容易导致物理内存远远没有耗尽便开始使用swap;一般来说swappiness值可以设置为10-60之间,SSD硬盘可以设置的高一点
修改依赖度
sysctl vm.swappiness=30 #临时修改为30,重启后会失效
echo "vm.swappiness = 30" >> /etc/sysctl.conf #修改为30,永久有效
如此,Swap就优化完成了。