如何在 CentOS 7 上添加 Swap
介绍
使服务器响应更快并防止应用程序出现内存不足错误的最简单方法之一是添加一些交换空间。交换区是存储驱动器上的一个区域,操作系统可以在其中临时存储无法再保存在内存中的数据。
这使您能够增加服务器可以保留在其工作内存中的信息量,但有一些注意事项。读取和写入交换比使用内存慢,但它可以在服务器内存不足时提供良好的安全网。
如果没有交换,内存不足的服务器可能会开始终止应用程序以释放内存,甚至崩溃。这可能会导致您丢失未保存的数据或经历停机。为确保可靠的数据访问,某些应用程序需要交换才能运行。
在本指南中,我们将介绍如何在 CentOS 7 服务器上创建和启用交换文件。
尽管通常建议对使用传统旋转硬盘驱动器的系统使用交换,但将交换与 SSD 一起使用可能会导致硬件随时间退化的问题。出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器性能,我们建议升级您的 Droplet。这通常会带来更好的结果,并且会降低导致可能影响您的服务的硬件问题的可能性。
先决条件
在开始使用本指南之前,需要先完成几个步骤。
您将需要安装 CentOS 7 服务器并使用具有 sudo
权限的非根用户进行配置。如果您还没有这样做,您可以通过 CentOS 7 初始服务器设置指南中的步骤 1-4 来创建此帐户。
一旦你有了你的非根用户,你就可以使用它通过 SSH 进入你的 CentOS 服务器并继续安装你的交换文件。
检查系统的交换信息
在我们开始之前,我们应该看看我们服务器的存储,看看我们是否已经有一些可用的交换空间。虽然我们可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以使用通用交换实用程序 swapon
查看系统是否有任何已配置的交换。使用 -s
标志,swapon
将在我们的存储设备上显示交换使用情况和可用性的摘要:
swapon -s
如果命令未返回任何内容,则摘要为空且不存在交换文件。
另一种检查交换空间的方法是使用 free
实用程序,它向我们展示了系统的整体内存使用情况。我们可以通过键入以下内容来查看我们当前的内存和交换使用情况(以兆字节为单位):
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095
如您所见,我们在系统中的总交换空间为 0。这与我们在 swapon
中看到的相符。
检查可用存储空间
为交换分配空间的典型方法是使用专用于该任务的单独分区。但是,由于硬件或软件限制,并不总是可以更改分区方案。幸运的是,我们可以轻松地创建一个驻留在现有分区上的交换文件。
在我们这样做之前,我们应该了解我们当前的驱动器使用情况。我们可以通过键入以下内容来获取此信息:
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
以易于阅读的格式输出驱动器信息。例如,df -h
不会输出分区中内存块的原始数量,而是会以 M(兆字节)或 G(千兆字节)为单位告诉我们空间使用情况和可用性。
正如您在第一行看到的,我们的存储分区有 59 GB 可用空间,因此我们有相当多的空间可以使用。请记住,这是在一个全新的中型 VPS 实例上进行的,因此您的实际使用情况可能会大不相同。
尽管对于交换空间的适当大小有很多意见,但它实际上取决于您的应用程序要求和您的个人喜好。通常,等于或两倍于系统内存量的量是一个很好的起点。
由于我的系统有 4 GB 的内存,加倍会从我的存储空间中占用比我愿意放弃的更大的块,我将创建一个 4 GB 的交换空间来匹配我的系统内存。
创建交换文件
现在我们知道了我们的可用存储空间,我们可以着手在我们的文件系统中创建一个交换文件。我们将在我们的根 (/
) 目录中创建一个名为 swapfile
的文件,但您可以根据需要为该文件命名。该文件必须为我们的交换文件分配我们想要的空间量,并且它应该在一个连续的块中创建。
执行此操作的最佳方法是使用 dd
实用程序。此命令将创建一个 4 GB 的文件:
sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB
输入密码以授予 sudo
权限后,将创建交换文件。这可能需要一些时间,然后提示将返回给您。我们可以使用 ls
验证是否为交换保留了正确的空间量:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile
如您所见,我们的交换文件是在预留正确空间量的情况下创建的。
启用交换文件
现在,我们的文件已创建,但我们的系统不知道这应该用于交换。我们需要告诉我们的系统将该文件格式化为交换文件,然后启用它。
在我们这样做之前,我们应该调整交换文件的权限,以便除根帐户之外的任何人都无法读取它。允许其他用户读取或写入此文件将带来巨大的安全风险。我们可以使用 chmod
锁定权限:
sudo chmod 600 /swapfile
这将限制对 root 帐户的读写权限。我们可以再次使用 ls -lh
来验证交换文件是否具有正确的权限:
ls -lh /swapfile
-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile
现在我们的交换文件更安全了,我们可以告诉我们的系统设置交换空间以供输入:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf
我们的交换文件现在可以用作交换空间了。我们可以通过键入以下内容开始使用它:
sudo swapon /swapfile
为了验证该过程是否成功,我们可以检查我们的系统现在是否报告交换空间:
swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
此输出确认我们有一个新的交换文件。我们可以再次使用 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 已经设置成功,我们的操作系统将根据需要开始使用它。
使交换文件永久化
我们的交换文件目前是启用的,但是当我们重新启动时,服务器不会自动启用该文件以供使用。我们可以通过修改 fstab
文件来改变它,该文件是一个管理文件系统和分区的表。
在文本编辑器中使用 sudo
权限编辑文件:
sudo nano /etc/fstab
在文件的底部,您需要添加一行,告诉操作系统自动使用您创建的交换文件:
/swapfile swap swap sw 0 0
添加完该行后,您可以保存并关闭文件。服务器将在每次启动时检查此文件,因此从现在开始交换文件就可以使用了。
调整您的交换设置(可选)
您可以配置几个选项,这些选项会在处理交换时对系统性能产生影响。在大多数情况下,这些配置是可选的,您所做的更改将取决于您的应用程序需求和您的个人喜好。
交换性
swappiness
参数确定系统将数据从内存交换到交换空间的频率。这是一个介于 0 和 100 之间的值,表示将触发使用交换的内存使用百分比。
如果值接近于零,除非绝对必要,否则系统不会将数据交换到驱动器。请记住,与交换文件的交互是“昂贵的”,因为它们比与内存的交互慢得多,并且读写速度的这种差异会导致应用程序性能的显着降低。告诉系统不要依赖于交换尽可能多通常会使您的系统更快。
接近 100 的值将尝试将更多数据放入交换区,以努力保持更多内存空闲。根据您的应用程序的内存配置文件,或者您使用服务器的目的,在某些情况下这可能是更好的选择。
我们可以通过读取 swappiness
配置文件来查看当前的 swappiness 值:
cat /proc/sys/vm/swappiness
30
CentOS 7 默认的 swappiness 设置为 30,这对于大多数桌面和本地服务器来说是一个公平的中间地带。对于 VPS 系统,我们可能希望将其移近 0。
我们可以使用 sysctl
命令将 swappiness 设置为不同的值。例如,要将 swappiness 设置为 10,我们可以键入:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
此设置将一直保留到下一次重新启动。为了使设置在重新启动之间保持不变,我们可以将输出行添加到我们的 sysctl
配置文件中:
sudo nano /etc/sysctl.conf
将您的 swappiness 设置添加到文件的底部:
vm.swappiness = 10
添加完该行后,您可以保存并关闭文件。服务器现在会自动将 swappiness 设置为您在每次启动时声明的值。
缓存压力
您可能想要修改的另一个相关值是 vfs_cache_pressure
。此设置会影响特殊文件系统元数据条目的存储。不断读取和刷新这些信息的成本通常非常高,因此将其存储在缓存中的时间更长对您的系统性能非常有利。
您可以通过再次查询 proc
文件系统来查看此缓存压力的当前值:
cat /proc/sys/vm/vfs_cache_pressure
100
按照当前的配置,我们的系统从缓存中删除 inode 信息的速度太快了。我们可以使用 sysctl
将其设置为更保守的设置,例如 50:
sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
同样,这仅对我们当前的会话有效。我们可以通过将它添加到我们的配置文件来更改它,就像我们对 swappiness 设置所做的那样:
sudo nano /etc/sysctl.conf
在底部,添加指定新值的行:
vm.vfs_cache_pressure = 50
添加完该行后,您可以保存并关闭文件。服务器现在会自动将缓存压力设置为您在每次启动时声明的值。
结论
按照本指南中的步骤,您将在内存使用方面为您的服务器提供一些喘息的空间。交换空间在避免一些常见问题方面非常有用。
如果您遇到 OOM(内存不足)错误,或者如果您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。但是,配置交换空间可以为您提供更大的灵活性,并可以帮助您在功能较弱的服务器上争取时间。