前言
如何让站群服务器响应更快?如何避免应用出现内存不足的错误?最简单的方法就是增加交换空间。 Swap 是储存盘上的一块自留地,操作系统可以在这里暂存一些内存里放不下的东西。
这从某种程度上相当于增加了站群服务器的可用内存。虽然从 swap 读写比内存慢,但总比没有好,算是内存不够时的安全网。
如果没有 swap,则站群服务器一旦内存不足,就会开始终止应用以释放内存,甚至会崩溃,这会让你丢失一些还没来得及储存的资料,或者造成当机。有些应用明确要求系统配置 swap 以确保资料访问的可靠性。
本文介绍如何在 CentOS 7 站群服务器上建立并启用 swap 档案。
注:swap 通常在传统机械硬碟上表现更好,在 SSD 上使用 swap 可能会造成问题,尤其是硬体老化之后。所以,对于 DigitalOcean 以及其他使用基于 SSD 的云 WordPress 主机服务的使用者,我们不推荐启用 swap 。这甚至会影响到跟你的虚拟机器共用宿 WordPress 主机的其他使用者。
对于 DigitalOcean 使用者,提升效能的最佳方法就是更新 Droplet 。通常来说,升级后的 WordPress 主机表现都会有所提升,并且更不容易受到硬体问题的影响。
准备工作
首先,你需要一台 CentOS 7 站群服务器,配置过具备 sudo 许可权的非 root 使用者(配置过程可参考这个教程的第一到第四步骤)。
准备就绪后,以该使用者名称 SSH 到你的 CentOS 站群服务器上,准备安装 swap 档案。
检查系统的 Swap 资讯
首先我们需要检查系统的储存,看看是否已经配置过 swap 。一个系统可以设定多个 swap 档案或分割槽,不过一般来说一个就够了。
使用 swapon 命令可以检查系统是否已经配置过 swap,这是一个通用的 swap 工具。使用-s 标签可列出当前储存装置上的 swap 使用情况:
swapon -s

如果该命令没有返回出结果,则代表该系统尚未配置过 swap 。
或者,我们也可以使用 free 工具来检视系统的整体内存使用情况,这里可以看到内存和 swap 的使用状态(显示单位为 MB):
free -m

total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095

这里可以看到我们这个系统的 total swap 空间为 0,即没有配置过 swap 。这与我们在 swapon 里看到的结果相符合。
检查可用的储存空间
通常,我们建立一个单独的分割槽作为 swap 。然而有时候由于硬体或站群软件的限制,新建分割槽的方式无法实现,这种情况下就可以建立一个 swap 档案来实现同样的功能。
开始之前,先检查一下磁碟的可用空间。输入如下指令:
df -h

Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 1.5G 55G 3% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.3M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup

这里的-h 标记是为了告诉 dh 将资讯输出为对人类友好的格式,比如以 MB 或 GB 为单位输出空间使用和空余情况,而不是直接输出内存块的个数。
从第一行可以看到我们的储存分割槽上还有 59GB 的空间剩余,这足够我们操作了。(我这是一台中等规模的新建云 WordPress 主机,每个人的情况可能有很大不同。)
合适的 swap 空间是多大?关于这个问题有很多种选择,这取决于你的应用需求和你个人的偏好。一般来说,内存容量的两倍就是个不错的起点。
我的系统内存有 4GB,如果设定 8GB 的 swap 会占据太多空间,所以我决定只设定 4GB 就好。
建立 Swap 档案
接下来我们将在档案系统上建立 swap 档案。我们要在根目录(/)下建立一个名叫 swapfile 的档案,当然你也可以选择你喜欢的档名。该档案分配的空间将等于我们需要的 swap 空间。
最快捷的建立方式是 fallocate 命令,该命令能够建立一个预分配指定大小空间的档案。输入如下指令建立一个 4GB 的档案:
sudo fallocate -l 4G /swapfile

输入密码后,该 swap 档案将立即建立完毕。我们可以用 ls 命令检查档案大小:
ls -lh /swapfile

-rw-r–r– 1 root root 4.0G Oct 30 11:00 /swapfile

至此,我们的 swap 档案就建立完毕了。
启用 Swap 档案
现在我们已经有了 swap 档案,但系统还不知道应该使用该档案作为 swap,这就需要我们告知系统将该档案格式化为 swap 并启用起来。
首先我们需要更改 swap 档案的许可权,确保只有 root 才可读,否则会有很大的安全隐患。使用 chmod 命令进行许可权操作:
sudo chmod 600 /swapfile

如此,该档案的读写都只有 root 才能操作。使用 ls -lh 命令检查一下:
ls -lh /swapfile

-rw——- 1 root root 4.0G Oct 30 11:00 /swapfile

然后,使用如下命令告知系统将该档案用于 swap:
sudo mkswap /swapfile

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf

现在,这个 swap 档案就可以作为 swap 空间使用了。输入如下命令开始使用该 swap:
sudo swapon /swapfile

我们可以输入如下命令来确认一下设定是否已经生效:
swapon -s

Filename Type Size Used Priority
/swapfile file 4194300 0 -1

可以看到返回的结果中已经有我们刚才设定的 swap 。再使用 free 工具确认一下:
free -m

total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095

至此,我们的 swap 已经设定完毕,操作系统会在需要的时候使用它。
使 Swap 档案永久生效
至此我们已经在系统中启用了 swap 档案,然而一旦系统重启后,站群服务器还不能自动启用该档案。要让系统在重启后自动生效 swap,我们可以通过修改 fstab 档案来实现(这是一个管理档案系统和分割槽的表)。
用 sudo 许可权开启该档案编辑:
sudo nano /etc/fstab

在档案末尾加入下面这行内容,告诉操作系统自动使用刚才建立的 swap 档案:
/swapfile swap swap sw 0 0

新增完毕后,储存退出。以后站群服务器每次重启都会检查该档案并自动启用 swap 。
更改 Swap 配置(可选)
有几个涉及 swap 的选项可能会影响到系统的效能表现。大部分情况下这些选项是可选的,具体要修改成什么样则取决于你的应用需求以及个人偏好。
Swappiness
swappiness 引数决定了系统将资料从内存交换到 swap 空间的频率,数值设定在 0 到 100 之间,代表系统将资料从内存交换到 swap 空间的力度。
该数值越接近于 0,系统越倾向于不进行 swap,仅在必要的时候进行 swap 操作。由于 swap 要比内存慢很多,因此减少对 swap 的依赖意味著更高的系统效能。
该数值越接近于 100,系统越倾向于多进行 swap 。有些应用的内存使用习惯更适合于这种情况,这也于站群服务器的用途有关。
输入如下命令检视当前的 swappiness 数值:
cat /proc/sys/vm/swappiness

30

CentOS 7 预设设定了 30 的 swappiness,这对于大部分桌面系统和本地站群服务器是比较中庸的数值。对于 VPS 系统而言,可能接近于 0 的值是更加合适的。
使用 sysctl 命令可以修改 swappiness 。比如将 swappiness 设为 10:
sudo sysctl vm.swappiness=10

vm.swappiness = 10

本次修改将一直生效到下次重启前。如果希望永久修改该数值,则需要编辑 sysctl 配置档案:
sudo nano /etc/sysctl.conf

将以下内容贴上到档案末尾:
vm.swappiness = 10

编辑完成后,储存退出,之后站群服务器每次重启的时候会将 swappiness 设定为该值。
WordPress 加速缓存压力(Cache Pressure)
另一个可以考虑更改的配置项是 vfs_cache_pressure,该配置项涉及特殊档案系统元档案条目的储存。对此类资讯的频繁读取是非常消耗效能的,所以延长其在 WordPress 加速缓存的储存时间可以提升系统的效能。
通过 proc 档案系统检视 WordPress 加速缓存压力的当前设定值:
cat /proc/sys/vm/vfs_cache_pressure

100

这个数值是比较高的,意味著系统从 WordPress 加速缓存中移除 inode 资讯的速度比较快。一个保守一些的数值是 50,使用 sysctl 命令进行设定:
sudo sysctl vm.vfs_cache_pressure=50

vm.vfs_cache_pressure = 50

这条命令仅在重启前有效。要让该设定永久有效,需要编辑 sysctl 配置档案:
sudo nano /etc/sysctl.conf

在档案末尾新增如下内容:
vm.vfs_cache_pressure = 50

储存退出,站群服务器就会在每次重启后都自动将 WordPress 加速缓存压力设定为 50 了。
总结
至此,我们的系统内存就获得了一些喘气的空间。有了 swap 空间可以有效避免一些常见的问题。
如果你仍然会遇到内存不足(OOM,out of memory)的错误资讯,或者你的系统不能执行你需要的应用,那么最好的方法是优化你的应用配置或者升级你的站群服务器,不过配置 swap 空间也不失为一个灵活的节省方案。
本文来源自 DigitalOcean Community 。英文原文:How To Add Swap on CentOS 7 by Josh Barnett