介绍
使您的服务器更具响应性并防止应用程序中的内存不足错误的最简单方法之一是添加一些交换空间。 Swap 是存储驱动器上的一个区域,操作系统可以在其中临时存储无法再保存在内存中的数据。
这使您能够增加服务器可以保留在其工作内存中的信息量,但有一些警告。 读取和写入交换比使用内存要慢,但它可以为服务器内存不足时提供良好的安全网。
如果没有交换,内存不足的服务器可能会开始杀死应用程序以释放内存,甚至崩溃。 这可能会导致您丢失未保存的数据或遇到停机时间。 为了确保可靠的数据访问,某些应用程序需要交换才能运行。
在本指南中,我们将介绍如何在 CentOS 7 服务器上创建和启用交换文件。
笔记
尽管对于使用传统旋转硬盘的系统通常建议使用交换,但使用 SSD 交换可能会导致硬件随着时间的推移而退化。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并会降低导致可能影响服务的硬件问题的可能性。
先决条件
在开始阅读本指南之前,需要先完成几个步骤。
您需要安装一个 CentOS 7 服务器,并使用具有 sudo
权限的非 root 用户进行配置。 如果您还没有这样做,您可以通过 CentOS 7 初始服务器设置指南 中的步骤 1-4 来创建此帐户。
拥有非 root 用户后,您可以使用它通过 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
如您所见,我们的交换文件是在留出正确空间量的情况下创建的。
启用交换文件
现在,我们的文件已创建,但我们的系统不知道这应该用于交换。 我们需要告诉我们的系统将此文件格式化为交换,然后启用它。
在我们这样做之前,我们应该调整交换文件的权限,以便除了 root 帐户之外的任何人都无法读取它。 允许其他用户读取或写入此文件将是一个巨大的安全风险。 我们可以使用 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
我们的交换已经成功建立,我们的操作系统将根据需要开始使用它。
使交换文件永久化
我们的交换文件目前已启用,但是当我们重新启动时,服务器不会自动启用该文件以供使用。 我们可以通过修改 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(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。 但是,配置交换空间可以为您提供更大的灵活性,并可以帮助您在功能较弱的服务器上争取时间。