1 前言
Linux系统中物理内存不足时,操作系统会将运行中的程序(比较闲的程序)暂时拿到交换分区(Swap)中,以保证物理内存来运行其它程序。等Swap中的程序要运行时,再从Swap分区中恢复保存的数据到内存中。
2 使用背景
现在服务器内存越来越大,动不动就16G、32G、64G甚至上百G,操作系统官网也给建议尽量使用系统物理内存,交换分区(SWAP)在应用中所占的比例越来越小,甚至不使用了。
可是对于个人、小个体甚至小微企业来说服务器的费用还是能省则省,内存已然捉襟见肘。本人有一台1核/2G的服务器和一台2核/4G的服务器,部署了五六个应用后就到极限了,动不动就崩溃了。
特别在微服务大行其道的今天,一个项目上去内存就占满了。所以,再嚼嚼交换分区,一切为了钱。
3 Swap分区大小选择
Swap分区大小设置的建议:
- 物理内存小于2GB,Swap建议为物理内存的2倍;
- 物理内存2GB~8GB,Swap分区大小等于物理内存;
- 物理内存8GB~64GB,Swap分区大小最小为8G;
- 物理内存大于64GB,Swap分区至少为16G;
事实上,Swap分区的大小并不取决于物理内存的量,而是根据业务场景,客户需求和系统中内存的负荷,所以抛开业务场景、显示来谈Swap意义并不大;如果我的服务器内存很大,也不会瞎折腾O(∩_∩)O哈哈~
4 何时使用Swap
不是等所有的物理内存都消耗完毕之后,才会去使用Swap的空间,什么时候使用是由swappiness参数值控制及系统调度的。
目前云服务器的Swap起始状态都是0,swappiness也为0,这就表示只能使用物理内存,如下图:
cat /proc/sys/vm/swappiness
该值在CentOS 6上是60,在CentOS 7上建议是30,可以看出随着硬件的降价,交换分区的比重越来越轻了。
swappiness设置为0时会最大限度使用物理内存,然后才是Swap空间;设置为100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
现在生产服务器用户动不动上百万,内存上百G,对用户体验,相应速度都要求极高,我们可以降低系统对Swap的使用,甚至全部使用内存。
5 如何修改swappiness参数
5.1 临时性修改,系统重启恢复默认
sysctl vm.swappiness=10
cat /proc/sys/vm/swappiness
5.2 永久修改,重启生效
在/etc/sysctl.conf 文件里添加如下参数:
vm.swappiness=10
# 加载配置
sysctl -p
6 创建交换分区
云服务器默认交换分区为0,默认只使用物理内存;我的小服务器只能手动设置开启交换分区咯!下面是创建并使用交换分区的步骤。
6.1 创建Swap分区
/dev/zero文件代表一个永远输出0的设备文件,可以用它来创建空文件。后两个参数可以控制文件大小。
dd if=/dev/zero of=/mnt/swap bs=512 count=8388616
我的服务器内存为4G,根据建议Swap大小设置为4G,创建过程有点慢,需要耐心等待。
注意:创建swap大小为bs*count=4294971392(4G)
6.2 格式化swap文件
mkswap /mnt/swap
6.3 启用swap文件(上文已提到)
- 临时调整
sysctl -w vm.swappiness=60
- 永久调整,需要重启服务器
vim /etc/sysctl.conf
vm.swappiness=60
# 加载配置
sysctl -p
6.4 激活使用这个swap文件
- 激活swap文件
swapon /mnt/swap
- 设置自动挂载交换分区
echo "/mnt/swap swap swap defaults 0 0" >> /etc/fstab
6.5 查看交换分区状态
swapon -s
free -m
可以看到,系统并没有使用到我创建的交换空间,我的物理内存还剩1G,后面跑下程序试试。
7 删除交换分区
7.1 停止交换分区
swapoff /mnt/swapfile
7.2 删除/etc/fstab中的自动挂载
vim /etc/fstab
# 注释或删除掉
# /mnt/swapfile swap swap defaults 0 0
7.3 删除分区文件
rm /mnt/swapfile
8 总结
swappiness的值为0~100,我的CentOS 7设置为60,也就是内存使用到40%就会使用交换分区。
如果业务、经济允许,还是使用物理内存好,毕竟内存速度比磁盘快得多;同时交换分区如果经常大量使用,会造加大系统io开销,所以该升级内存升级内存,该调整参数调整参数。
另外有一种说法,使用交换分区(Swap)会缩短硬盘使用寿命,这个没验证过,同时我是用的是云服务器,无所谓了。