减少 VPS 的交换区大小

Johnny 的 VPS 经过几天的重新设定后,Johnny 的网站今天又回到美国了,在这几天的设定中,Johnny 对 Linux 服务器的交换分区进行了收缩操作,为什么要这样?方法如何?
同学们都知道,操作系统除了会使用电脑的物理内存(RAM),还会使用虚拟内存(在 Linux 中,它被称为“交换区”,也就是 Swap),这样做是为了在物理内存短缺的时候,不至于让系统立即宕机,实际上,交换区也就是硬盘上的一个分区。然而,现在的服务器通常会配有巨大的物理内存,因为硬盘的速度总是要比物理内存来得慢,当系统开始使用交换区时,便意味着性能逐渐下降,所以,Johnny 总是尽可能避免操作系统使用交换区,因此,巨大的交换区有时候便成为了一种浪费。
大多数的虚拟专用服务器(VPS)提供商都会按照 VPS 物理内存的比例来划分额外的硬盘空间作为交换区,Johnny 确信自己不会用到如此多的交换区,因此,Johnny 计划缩减原有的交换区,将得到的空间用于其它类型的缓存。
由于 Johnny 的服务器运行 CentOS 7 操作系统,所以,下面的示例将按照 CentOS 7 的规则来编写,另外,OpenVZ 类型的 VPS 无法调整交换区,这是架构决定的,Johnny 也木有办法呀!
首先,需要确定交换区位于哪里,为此,请运行下面的指令:
swapon -s
———- 我是分隔线 ———-
Filename Type Size Used Priority
/dev/sda2 partition 1048572 79372 -1
[root@localhost ~]#
———- 我是分隔线 ———-
从上面的输出,同学们应该知道,交换区位于 /dev/sda2 分区,严格地说,/dev/sda2 就是交换区,这里,/dev/sda2 并不是绝对的,一些主机上,可能显示为 /dev/xvda2 等,因此,同学们需要多加留意,然后,大小是 1 GB,这里的单位是 KB,已经使用了 77 MB 左右。
要减小交换区的空间,需要先把交换区停止运行才可以哟!请使用下面的指令把它停掉:
swapoff /dev/sda2
然后,还要看看它是不是真的已经被停用了,使用如下指令:
swapon -s
如果看不到输出,就说明交换区已经被关闭了,我们继续。
由于 Johnny 计划使用文件形式的交换区,所以,需要先把原来的交换区格式化,不然是不能挂载为正常的分区来进行操作的噢,然后,嗯,那就没办法创建常规的文件啦!Johnny 计划使用 xfs 文件系统,指令如下:
mkfs.xfs -f /dev/sda2
———- 我是分隔线 ———-
meta-data=/dev/sda2 isize=512 agcount=4, agsize=65536 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]#
———- 我是分隔线 ———-
同学们也许看到了指令中加上了 -f 参数,这是因为,mkfs.xfs 指令在侦测到即将被格式化的分区里包含了已知的文件系统时,它是不让格式化的噢!所以呀,我们就需要使用 -f 参数来强制进行格式化啦。
分区被格式化以后,我们需要进行挂载(mount)操作,这样,分区才可以被访问,如下指令将创建用来挂载分区的文件夹,并且执行挂载操作:
mkdir /cachep
mount /dev/sda2 /cachep
指令中的 cachep 是我发明的名称(俺小 Johnny 就是爱发明吗!),这个 cachep 表示 cache partition,当然啦,同学们可以使用别的名称,真的真的真的没必要跟我一样的耶!来,验证一下文件系统是否已经挂载成功,指令式:
df -h
———- 我是分隔线 ———-
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.0G 2.2G 5.9G 27% /
devtmpfs 325M 0 325M 0% /dev
tmpfs 335M 0 335M 0% /dev/shm
tmpfs 335M 13M 322M 4% /run
tmpfs 335M 0 335M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 67M 0 67M 0% /run/user/0
/dev/sda2 1014M 33M 982M 4% /cachep
[root@localhost ~]#
———- 我是分隔线 ———-
OK,棒极啦!现在可以创建用作交换区的文件啦,使用如下指令:
dd if=/dev/zero of=/cachep/swapfil bs=32M count=2
其中,dd 是指令的名称,if 是输入文件的名称,Johnny 以 0 填充,也就是 /dev/zero,of 是输出文件的名称,看,Johnny 把它放在了 /cachep 目录里,起名为 swapfil,bs 是每次从 /dev/zero 读取的大小,这里是 32 MB,count 是执行 bs 的次数,Johnny 只想创建 64 MB 的文件,所以填写 2。
———- 我是分隔线 ———-
2+0 records in
2+0 records out
67108864 bytes (67 MB) copied, 0.206856 s, 324 MB/s
[root@localhost ~]#
———- 我是分隔线 ———-
好啦,好啦,哈哈,我们可以把这个文件格式化为交换区文件啦,为了保护它,防止有人偷窃,我们应该为它设定权限,使用这条指令:
chmod 0600 /cachep/swapfil
OK,开始把 /cachep/swapfil 格式化为交换区文件,使用这条指令就好了噢:
mkswap /cachep/swapfil
———- 我是分隔线 ———-
Setting up swapspace version 1, size = 65532 KiB
no label, UUID=a9b646e1-391e-40f6-8cdf-8a9482805bba
———- 我是分隔线 ———-
然后,我们来把它装在为交换区,使用这条指令:
swapon /cachep/swapfil
来,我们通过 free 指令,检查一下交换区有没有载入:
———- 我是分隔线 ———-
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 668 401 110 12 155 129
Swap: 63 0 63
[root@localhost ~]#
———- 我是分隔线 ———-
Oh, Yeah,我成功啦!
慢点,我们的设定还没有保存呢!下次开机的时候,系统可是会大乱的噢!我们来编辑一个文件:
/etc/fstab
———- 我是分隔线 ———-

#
# /etc/fstab
# Created by anaconda on Wed Mar 15 05:05:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1e89a83c-b352-4288-be7f-4296e0fc2a8b / xfs defaults 0 0
UUID=833c2dca-8d94-4e45-9121-4194a9c4ee3b /boot xfs defaults 0 0
UUID=8b6b3a66-a4a4-4acd-b8c8-56dfe63d1084 swap swap defaults 0 0

———- 我是分隔线 ———-
我们只要改成这样子就行了:
———- 我是分隔线 ———-

#
# /etc/fstab
# Created by anaconda on Wed Mar 15 05:05:19 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1e89a83c-b352-4288-be7f-4296e0fc2a8b / xfs defaults 0 0
UUID=833c2dca-8d94-4e45-9121-4194a9c4ee3b /boot xfs defaults 0 0
/dev/sda2 /cachep xfs defaults 0 0
/cachep/swapfil swap swap defaults 0 0

———- 我是分隔线 ———-
实际上,我们要修改的也就是删除原来针对交换区的设定,把它换成正常的文件系统参数值,然后,在后面增加我们对交换区的设定,只要保存,就好了噢!稍微提一下,可以用 UUID 来表示分区,也可以用路径来表示分区,对啦,那些喜欢偷懒的同学,可不要直接复制粘贴上面的设定到你的 fstab 噢!不然下次就开不动啦,切记切记!
到这里,我们对交换区的重新分配就算完成了,不过还没结束呢!最好我们还要优化一下系统,降低不活动的程序被系统调入交换区的可能性。不活动的程序被调入交换区的可能性有多大呢?很大的啦!不信请执行这条指令:
cat /proc/sys/vm/swappiness
———- 我是分隔线 ———-
60
———- 我是分隔线 ———-
这里,数值越高,不活动的程序被调入交换区的可能性就越大,预设是 60,很吓人吧!可以把数值设定小一些,使用指令:
sysctl vm.swappiness=10
这样,再次执行 cat /proc/sys/vm/swappiness,数值就是 10 了,不过这只是临时修改而已噢,并不是永久保存耶!可以使用这条指令来让系统永久保存修改。
echo vm.swappiness=10 > /etc/sysctl.d/set_swappiness.conf
全部完成后,我们来执行 reboot 指令。
机器重启后,我们来重新检查一下交换区和 vm.swappiness 的数值,我这里是没问题的噢!
最后:可能有的 VPS 提供商因为成本原因使用不具备数据保护功能的硬盘来作为交换区的硬盘,这种盘常被称为监控盘,因此,Johnny 非常不建议同学们把重要的数据存放到原先作为交换区的区域噢!由于不断地写入和擦除,这块区域可能已经变得很不可靠啦!

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注