原创

望着业务和钱包!对Linux交换分区(Swap)的思考及实战配置

图0

1 前言

Linux系统中物理内存不足时,操作系统会将运行中的程序(比较闲的程序)暂时拿到交换分区(Swap)中,以保证物理内存来运行其它程序。等Swap中的程序要运行时,再从Swap分区中恢复保存的数据到内存中。

2 使用背景

现在服务器内存越来越大,动不动就16G、32G、64G甚至上百G,操作系统官网也给建议尽量使用系统物理内存,交换分区(SWAP)在应用中所占的比例越来越小,甚至不使用了。

可是对于个人、小个体甚至小微企业来说服务器的费用还是能省则省,内存已然捉襟见肘。本人有一台1核/2G的服务器和一台2核/4G的服务器,部署了五六个应用后就到极限了,动不动就崩溃了。

特别在微服务大行其道的今天,一个项目上去内存就沾满了。所以,再嚼嚼交换分区,一切为了钱。

3 Swap分区大小选择

Swap分区大小设置的建议:

  1. 物理内存小于2GB,Swap建议为物理内存的2倍;
  2. 物理内存2GB~8GB,Swap分区大小等于物理内存;
  3. 物理内存8GB~64GB,Swap分区大小最小为8G;
  4. 物理内存大于64GB,Swap分区至少为16G;

事实上,Swap分区的大小并不取决于物理内存的量,而是根据业务场景,客户需求和系统中内存的负荷,所以抛开业务场景、显示来谈Swap意义并不大;如果我的服务器内存很大,也不会瞎折腾O(∩_∩)O哈哈~

图1

4 何时使用Swap

不是等所有的物理内存都消耗完毕之后,才会去使用Swap的空间,什么时候使用是由swappiness参数值控制及系统调度的。

目前云服务器的Swap起始状态都是0,swappiness也为0,这就表示只能使用物理内存,如下图:

cat /proc/sys/vm/swappiness

图2

该值在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

图3

5.2 永久修改,重启生效

在/etc/sysctl.conf 文件里添加如下参数:

vm.swappiness=10

# 加载配置
sysctl -p

图4

6 创建交换分区

云服务器默认交换分区为0,默认只使用物理内存;我的小服务器只能手动设置开启交换分区咯!下面是创建并使用交换分区的步骤。

6.1 创建Swap分区

/dev/zero文件代表一个永远输出0的设备文件,可以用它来创建空文件。后两个参数可以控制文件大小。

dd if=/dev/zero of=/mnt/swap bs=512 count=8388616

我的服务器内存为4G,根据建议Swap大小设置为4G,创建过程有点慢,需要耐心等待。

图5

注意:创建swap大小为bs*count=4294971392(4G)

6.2 格式化swap文件

mkswap /mnt/swap

图6

6.3 启用swap文件(上文已提到)

  • 临时调整
sysctl -w vm.swappiness=60
  • 永久调整,需要重启服务器
vim  /etc/sysctl.conf
vm.swappiness=60

# 加载配置
sysctl -p

6.4 激活使用这个swap文件

  • 激活swap文件
swapon /mnt/swap

图7

  • 设置自动挂载交换分区
echo "/mnt/swap swap swap defaults 0 0" >> /etc/fstab

6.5 查看交换分区状态

swapon -s

free -m

图8

可以看到,系统并没有使用到我创建的交换空间,我的物理内存还剩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)会缩短硬盘使用寿命,这个没验证过,同时我是用的是云服务器,无所谓了。

正文到此结束
本文目录