如何在 CentOS 7 上添加交换

简介

要使服务器反应更快,并防止应用程序出现内存不足错误,最简单的方法之一就是增加一些交换空间。交换 是存储驱动器上的一个区域,操作系统可在此临时存储内存中无法再保存的数据。

这样就能增加服务器工作内存中的信息量,但也有一些注意事项。从 swap 中读取和写入信息的速度比使用内存慢,但它可以在服务器内存不足时提供一个很好的安全网。

如果没有交换功能,服务器内存耗尽后可能会开始杀死应用程序以释放内存,甚至会导致服务器崩溃。这会导致丢失未保存的数据或停机。为确保可靠的数据访问,一些应用程序需要交换功能。

在本指南中,我们将介绍如何在 CentOS 7 服务器上创建并启用交换文件。

<$>[注释] [标签 备注] 虽然交换通常推荐用于使用传统旋转硬盘驱动器的系统,但在固态硬盘上使用交换可能会导致硬件随着时间的推移而退化。 基于这一考虑,我们不建议在 DigitalOcean 或其他使用固态硬盘存储的提供商上启用交换功能。 这样做会影响您和您邻居的底层硬件的可靠性。

如果您需要提高服务器性能,我们建议您升级 Droplet。 这将在总体上带来更好的结果,并降低导致硬件问题的可能性,从而影响您的服务。 <$>

先决条件

在开始使用本指南之前,需要先完成几个步骤。

您需要安装一个 CentOS 7 服务器,并配置一个具有 "sudo "权限的非 root 用户。如果您还没有这样做,可以执行 CentOS 7 初始服务器设置指南 中的步骤 1-4 来创建此账户。

有了非 root 用户后,就可以用它 SSH 登录 CentOS 服务器,继续安装交换文件。

检查系统的交换信息

在开始之前,我们应该查看一下服务器的存储空间,看看是否已经有了一些可用的交换空间。虽然我们可以拥有多个交换文件或交换分区,但通常一个就足够了。

我们可以使用通用交换工具 "swapon "来查看系统是否配置了交换。使用 -s 标志,swapon 将显示存储设备上交换使用情况和可用性的摘要:

1swapon -s

如果命令没有返回任何内容,则说明摘要为空,不存在交换文件。

检查交换空间的另一种方法是使用 "free "实用程序,它可以显示系统的总体内存使用情况。我们可以通过键入以下命令查看当前内存和交换空间的使用情况(以兆字节为单位):

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

正如你所看到的,系统中的总交换空间为 0。

检查可用存储空间

为交换分配空间的典型方法是使用一个单独的任务专用分区。不过,由于硬件或软件的限制,改变分区方案并不总是可行的。幸运的是,我们可以很容易地在现有分区上创建一个交换文件。

在此之前,我们应该了解当前硬盘的使用情况。我们可以通过键入

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

注意: -h标志只是告诉 dh 以人类友好的阅读格式输出驱动器信息。例如,df -h不会输出分区中内存块的原始数量,而是以 M(兆字节)或 G(千兆字节)为单位告诉我们空间的使用情况和可用性。

从第一行可以看到,我们的存储分区有 59 千兆字节可用,因此我们有相当多的空间可以使用。请注意,这是在一个新的、中等大小的 VPS 实例上,所以你的实际使用情况可能会有很大不同。

虽然关于交换空间的适当大小众说纷纭,但这确实取决于你的应用程序要求和个人喜好。一般来说,交换空间的大小等于或大于系统内存的两倍是一个很好的起点。

由于我的系统有 4GB 内存,如果将内存容量增加一倍,会占用很大一部分存储空间,所以我将创建一个与系统内存相匹配的 4GB 交换空间。

创建交换文件

既然知道了可用存储空间,我们就可以在文件系统中创建交换文件了。我们将在根目录(/)下创建一个名为 "swapfile "的文件,当然,如果你愿意,也可以给文件取其他名字。该文件必须为我们的交换文件分配所需的空间,并以一个连续的区块创建。

最好的方法是使用 dd 工具。该命令将创建一个 4 千兆字节的文件:

1sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB

输入密码授权 "sudo "权限后,将创建交换文件。这可能需要一些时间,然后系统会返回提示。我们可以使用 ls 来验证是否为 swap 预留了正确的空间:

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

正如你所看到的,我们创建的交换文件预留了正确的空间。

启用交换文件

现在,我们的文件已经创建,但系统并不知道它应该用于交换。我们需要告诉系统将此文件格式化为交换文件,然后启用它。

在此之前,我们应该调整 swap 文件的权限,以确保除 root 账户外,其他任何人都无法读取该文件。允许其他用户读取或写入该文件将是一个巨大的安全隐患。我们可以用 chmod 锁定权限:

1sudo chmod 600 /swapfile

这将限制 root 账户的读写权限。我们可以再次使用 ls -lh来验证 swap 文件的权限是否正确:

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

现在,我们的交换文件更安全了,我们可以通过输入

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

我们的 swap 文件现在可以用作交换空间了。我们可以输入

1sudo swapon /swapfile

为了验证程序是否成功,我们可以检查系统现在是否报告了交换空间:

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

输出结果证实我们有一个新的交换文件。我们可以再次使用 free 工具来证实我们的发现:

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

我们的交换系统已经设置成功,操作系统将根据需要开始使用它。

将交换文件永久化

我们的交换文件目前是启用的,但当我们重启时,服务器不会自动启用该文件。我们可以通过修改 fstab 文件来改变这种情况,该文件是一个管理文件系统和分区的表格。

在文本编辑器中以 sudo 权限编辑文件:

1sudo nano /etc/fstab

在文件底部,你需要添加一行内容,告诉操作系统自动使用你创建的交换文件:

1/swapfile swap swap sw 0 0

完成添加后,保存并关闭文件。服务器将在每次启动时检查该文件,因此交换文件从现在起就可以使用了。

调整交换设置(可选)

在处理交换时,您可以配置一些对系统性能有影响的选项。在大多数情况下,这些配置都是可选的,您所做的更改将取决于您的应用程序需求和个人偏好。

Swappiness

swappiness "参数决定了系统将数据从内存交换到交换空间的频率。这是一个介于 0 和 100 之间的值,代表会触发使用交换空间的内存使用百分比。

当值接近零时,除非绝对必要,系统不会将数据交换到硬盘上。请记住,与交换文件的交互是 "昂贵 "的,因为它们比与内存的交互要慢得多,这种读写速度上的差异会显著降低应用程序的性能。告诉系统不要过多依赖交换文件,通常会让系统运行得更快。

接近 100 的值会尝试将更多数据放入交换,以保持更多内存空闲。根据应用程序的内存情况或服务器的用途,在某些情况下,这可能是更好的选择。

我们可以通过读取 swappiness 配置文件来查看当前的交换度值:

1cat /proc/sys/vm/swappiness
130

CentOS 7 默认将交换性设置为 30,这对于大多数台式机和本地服务器来说是一个合理的中间值。对于 VPS 系统,我们可能希望将其设置为 0。

我们可以使用 sysctl 命令将交换度设置为不同的值。例如,要将交换度设置为 10,我们可以键入

1sudo sysctl vm.swappiness=10
1vm.swappiness = 10

该设置将持续到下次重启。要使设置在两次重启之间持续有效,我们可以在 sysctl 配置文件中添加输出行:

1sudo nano /etc/sysctl.conf

在文件底部添加交换性设置:

1vm.swappiness = 10

完成添加后,保存并关闭文件。现在,服务器将在每次启动时自动将交换度设置为您声明的值。

缓存压力

你可能想修改的另一个相关值是 vfs_cache_pressure。该设置会影响特殊文件系统元数据项的存储。不断读取和刷新这些信息通常成本很高,因此在缓存中存储更长时间对系统性能非常有利。

您可以再次查询 proc 文件系统,查看缓存压力的当前值:

1cat /proc/sys/vm/vfs_cache_pressure
1100

按照目前的配置,系统从缓存中删除 inode 信息的速度太快。我们可以使用 sysctl 将其设置为更保守的值,比如 50:

1sudo sysctl vm.vfs_cache_pressure=50
1vm.vfs_cache_pressure = 50

同样,这只对当前会话有效。我们可以将其添加到配置文件中进行更改,就像我们的交换性设置一样:

1sudo nano /etc/sysctl.conf

在底部,添加指定新值的一行:

1vm.vfs_cache_pressure = 50

完成添加后,保存并关闭文件。现在,服务器会在每次启动时自动将缓存压力设置为您声明的值。

结论

按照本指南中的步骤操作,就能为服务器的内存使用提供一些喘息空间。交换空间对于避免一些常见问题非常有用。

如果遇到 OOM(内存不足)错误,或者发现系统无法使用所需的应用程序,最好的解决办法是优化应用程序配置或升级服务器。不过,配置交换空间可以给你带来更大的灵活性,并能帮助你在性能较弱的服务器上赢得时间。

Published At
Categories with 技术
comments powered by Disqus