在 CentOS 7 上添加 Swap 交换空间


how-to-add-swap-on-centos-7

Linux 中的 Swap 类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

Swap 从某种程度上相当于增加了服务器的可用内存。虽然从 Swap 读写比内存慢,但总比没有好,算是内存不够时的安全网。

本文介绍如何在 CentOS 7 服务器上创建并启用 Swap 文件。

检查系统 Swap 信息

首先检查系统的存储,看看是否已经配置过swap。一个系统可以设置多个swap文件或分区,不过一般来说一个就够了。

使用 swapon 命令可以检查系统是否已经配置过 Swap,这是一个通用的swap工具。使用 -s 标签可列出当前存储设备上的 Swap 使用情况:

swapon -s

如果没有返回出结果,则代表该系统尚未配置过 Swap。

我们也可以使用 free 工具来查看系统的整体内存使用情况,这里可以看到内存和 Swap 的使用状态(显示单位为MB):

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            992         638          76           0         277         183
Swap:             0           0           0

可以看到我们这个系统的 total swap 空间为 0,即没有配置过 Swap。

检查可用的存储空间

通常情况下,可以建立一个单独的分区作为 Swap。然而有时候由于硬件或软件的限制,新建分区的方式无法实现,这种情况下就可以建立一个 Swap 文件来实现同样的功能。

开始之前,使用 df -h 命令检查一下磁盘的可用空间:

$ df -h
文件系统    容量      已用      可用  已用%     挂载点
/dev/vda1   40G     2.3G    37G     6%      /

可以看到存储区上有 37GB 的可用空间。一般来说,我们需要分配内存容量的两倍存储空间给 Swap,可根据自己的应用需要与个人偏好自由设定。(我的系统内存是 1GB,在此我设置 2GB 的 Swap 空间。)

创建 Swap 文件

在系统根目录(/)下创建一个名称为 swapfile 的文件(可以选择你喜欢的其他的文件名)。这里我们使用 fallocate 命令来创建一个预分配指定大小空间的文件:

$ sudo fallocate -l 2G /swapfile

完成后,可以使用 ls 命令来检查文件大小:

$ ls -lh /swapfile
-rw-r--r-- 1 root root 2.0G 4月   2 11:04 /swapfile

启用 Swap 文件

现在已经有了Swap文件,但系统还不知道应该使用该文件作为 Swap,这就需要告知系统将该文件格式化为 Swap 并启用起来。

首先需要更改swap文件的权限,确保只有 root 才可读,否则会有很大的安全隐患。使用 chmod 命令进行权限操作:

$ sudo chmod 600 /swapfile

然后,使用如下命令告知系统将该文件用于 Swap:

$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097150 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf

现在,这个swap文件就可以作为 Swap 空间使用了。输入如下命令开始使用该 swap:

$ sudo swapon /swapfile

至此,Swap 已经设置完毕,可以使用 swapon -s 或者 fee -m 命令来确认 Swap 是否生效:

$ swapon -s
文件名             类型      大小    已用    权限
/swapfile       file       2097150     0     -1

$ free -m
total        used        free      shared  buff/cache   available
Mem:            992         635          69           0         287         186
Swap:          2048           0        2048

接下来,需要要让系统在重启后自动生效 Swap,可以通过修改 fstab 文件来实现(这是一个管理文件系统和分区的表):

$ sudo vi /etc/fstab

在文件末尾添加如下内容:

/swapfile   swap    swap    sw  0   0

添加完毕后,保存退出。以后服务器每次重启都会检查该文件并自动启用 Swap。

更改Swap配置(可选)

有几个涉及 Swap 的选项可能会影响到系统的性能表现。大部分情况下这些选项是可选的,具体要修改成什么样则取决于应用需求以及个人偏好。

Swappiness

swappiness 参数决定了系统将数据从内存交换到 Swap 空间的频率,数值设置在 0 到 100 之间,代表系统将数据从内存交换到 Swap 空间的力度。该数值越接近于 0,系统越倾向于不进行 Swap,仅在必要的时候进行 Swap 操作;该数值越接近于 100,系统越倾向于多进行 Swap。

查看当前的 swappiness 数值,执行:

$ cat /proc/sys/vm/swappiness

0

CentOS 7 默认设置了 0 的 swappiness,使用 sysctl 命令可以修改 swappiness

$ sudo sysctl vm.swappiness=30

本次修改将一直生效到下次重启前。如果希望永久修改该数值,则需要编辑 sysctl 配置文件:

$ sudo vi /etc/sysctl.conf

将以下内容粘贴到文件末尾:

vm.swappiness = 30

编辑完成后,保存退出,之后服务器每次重启的时候会将 swappiness 设置为该值。

缓存压力(Cache Pressure )

另一个可以考虑更改的配置项是 vfs_cache_pressure ,该配置项涉及特殊文件系统元文件条目的存储。对此类信息的频繁读取是非常消耗性能的,所以延长其在缓存的保存时间可以提升系统的性能。

通过 proc 文件系统查看缓存压力的当前设定值:

$ cat /proc/sys/vm/vfs_cache_pressure

1000

这个数值是比较高的,意味着系统从缓存中移除 inode 信息的速度比较快。一个保守一些的数值是50,使用 sysctl 命令进行设置:

$ sudo sysctl vm.vfs_cache_pressure=50

这条命令仅在重启前有效。要让该设置永久有效,需要编辑 sysctl 配置文件:

$ sudo vi /etc/sysctl.conf

在文件末尾添加如下内容:

vm.vfs_cache_pressure = 50

保存退出,服务器就会在每次重启后都自动将缓存压力设置为50了。

总结

至此,我们的系统内存就获得了一些喘气的空间。有了 Swap 空间可以有效避免一些常见的问题。

如果你仍然会遇到内存不足(OOM,out of memory)的错误信息,或者你的系统不能运行你需要的应用,那么最好的方法是优化你的应用配置或者升级你的服务器,不过配置 Swap 空间也不失为一个灵活的节省方案。

本文源自 DigitalOcean 文章:How To Add Swap on CentOS 7 作者:Josh Barnett

#EOF