Skip to main content

如何在 Rocky Linux 9上添加交换空间(Swap Space)

作者 Alex Garnett

导言

要防止应用程序“内存不足(out-of-memory)”这一错误,有一种方法是向服务器添加一些交换空间(Swap Space)。在本指南中,我们将介绍如何向 Rocky Linux 9 服务器添加交换文件。

Swap 是什么?

Swap 分区,即交换区,是预留的硬盘存储的一部分,用来临时存储操作系统不能再保存在 RAM 中的数据。你可以通过它来增加服务器在其工作内存中保存的信息量,但有几点需要注意。当 RAM 中没有足够的空间来保存正在使用的应用程序数据时,将主要使用硬盘驱动器上的交换空间。 信息写入磁盘将比保存在 RAM 中要慢得多,但操作系统将倾向于在内存中继续运行应用程序数据,并对较旧的数据使用交换空间。总之,在可使用非 ssd 存储的系统上,当系统 RAM 耗尽时,使用交换空间作为后备可以很好地防止出现内存不足的异常。

第1步 - 检查系统的交换信息

在开始之前,我们可以检查系统是否已经有一些可用的交换空间。交换文件或交换分区可以有多个,但通常一个就足够了。 可以通过输入以下命令查看系统是否已配置任何交换空间:

$ sudo swapon --show

如果没有得到任何输出,这意味着系统中目前没有可用的交换空间。 可以使用 free 实用工具来验证目前没有活跃的交换空间:

$ free -h
Output
total used free shared buff/cache available
Mem: 1.7Gi 173Mi 1.2Gi 9.0Mi 336Mi 1.4Gi
Swap: 0B 0B 0B

可以在上面输出的 Swap 一行中看到,系统上没有活跃的交换空间。

第2步 - 检查硬盘分区可用空间

在创建交换文件之前,我们将检查当前的磁盘使用情况,以确保有足够的空间。输入:

$ df -h
Output
Filesystem Size Used Avail Use% Mounted on
devtmpfs 855M 0 855M 0% /dev
tmpfs 888M 0 888M 0% /dev/shm
tmpfs 355M 9.4M 346M 3% /run
/dev/vda1 59G 1.4G 58G 3% /
/dev/vda2 994M 155M 840M 16% /boot
/dev/vda15 100M 7.0M 93M 7% /boot/efi
tmpfs 178M 0 178M 0% /run/user/0

本例中,在 Mounted on 这一列中带有 / 的设备就是我们的磁盘。本例中我们有足够的可用空间(仅使用了 1.4G)。您的实际情况可能会有所不同。 尽管关于交换空间的大小多大才适当有很多不同看法,但这实际上取决于您的个人偏好和应用程序的需求。一般来说,一开始等于或两倍于系统上的 RAM 就好。另一个经验是,如果您只是将交换空间用作 RAM 后备,那么可能不必超过 4G。

第3步 - 创建一个交换文件

现在我们已经知道了我们的可用硬盘空间,接下来可以在我们的文件系统上创建一个交换文件。我们将在我们的根(/)目录下分配一个我们想要的大小的文件,叫做 swapfile。 创建交换文件最好使用 fallocate 程序。这个命令可以立即创建一个指定大小的文件。 由于我们例子中的服务器有 2G 的内存,我们将创建一个 2G 的文件。你可以根据你自己的服务器的需要来调整:

$ sudo fallocate -l 1G /swapfile

我们可以通过以下代码来验证保留的空间大小是否正确:

$ ls -lh /swapfile
$ -rw-r--r--. 1 root root 2.0G Sep 13 17:52 /swapfile

我们的文件已经创建好了,并预留了正确大小的空间。

第4步 - 启用交换文件

现在,我们有了一个可用的正确大小的文件,我们需要将其变成交换空间。 首先,我们需要锁定文件的权限,以便只有具有 root 权限的用户才能读取内容。这将阻止普通用户访问该文件,否则将带来重大的安全隐患。 输入以下命令,让文件只能被 root 用户访问:

$ sudo chmod 600 /swapfile

输入以下命令验证权限更改:

$ ls -lh /swapfile
Output
-rw------- 1 root root 2.0G Sep 13 17:52 /swapfile

如你所见,只有 root 用户的读和写标志被启用了。 我们现在可以输入以下命令,将文件标记为交换空间:

$ sudo mkswap /swapfile
Output
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=585e8b33-30fa-481f-af61-37b13326545b

标记文件后,我们可以启用交换文件,来允许我们的系统使用它:

$ sudo swapon /swapfile

输入以下代码,验证交换文件是否可用:

$ sudo swapon --show
Output
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2

可以再次查看 free 的输出来佐证以上信息:

$ free -h
Output
total used free shared buff/cache available
Mem: 1.7Gi 172Mi 1.2Gi 9.0Mi 338Mi 1.4Gi
Swap: 2.0Gi 0B 2.0Gi

现在我们已经成功设置了交换空间,操作系统将在必要时开始使用它。

第5步 - 永久启用交换文件

刚刚的更改为当前会话启用了交换文件。但是,如果我们重新启动,服务器将不会自动保留交换设置。我们可以将交换文件添加到 /etc/fstab 文件来改变这一点。 首先备份 /etc/fstab 文件,以防出错:

$ sudo cp /etc/fstab /etc/fstab.bak

输入以下代码,在 /etc/fstab 文件末尾添加交换文件信息:

$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

接下来,我们将回顾一些可以更新的设置,以优化交换空间。

第6步 - 交换空间设置调优

您可以配置一些交换空间选项,它们将对系统的性能产生影响。

调整 Swappiness 属性

swappiness 参数会配置系统将数据从 RAM 交换到交换空间的频率。它是一个介于0到100之间的值,表示百分比。 当值接近零时,除非绝对必要,否则内核不会将数据交换到磁盘。请记住,与交换文件的交互是消耗很大的,因为它比与 RAM 的交互花费的时间要长得多,而且会导致性能显著降低。让系统不要太依赖交换通常能够使系统更快。 如果值接近于100,将尝试将更多的数据放入交换空间中,以努力保持更多的 RAM 空闲空间。这在某些情况下可能是很好的做法,不过取决于你的应用程序的内存配置文件或您使用服务器的目的。 可以输入以下命令查看当前 swappiness 值:

$ cat /proc/sys/vm/swappiness
Output
60

对于 Desktop,设置 swappiness 为 60 是个不错的选择。对于服务器来说,这个值接近 0 更好。 可以使用 sysctl 命令将 swappiness 设置为不同的值。 例如,要将 swappiness 设置为10,我们可以输入:

$ sudo sysctl vm.swappiness=10
Output
vm.swappiness = 10

此设置将持续到下次重新启动。而如果在 /etc/sysctl.conf 文件中添加这一行,我们可以在重新启动时自动设置这个值。 Rocky Linux 9自带的默认文本编辑器是 vivi 是一个非常强大的文本编辑器,但对于缺乏使用经验的用户来说,它可能有些笨拙。您可能需要安装一个更友好的编辑器,如 nano,以方便在您的 Rocky Linux 9 服务器上编辑配置文件: sudo dnf install nano 现在你可以使用 nano 来编辑 sysctl.conf 文件了:

$ sudo nano /etc/sysctl.conf

你可以在底部添加: /etc/sysctl.conf

vm.swappiness=10

完成后保存并关闭该文件。如果您使用的是 nano,可以按 CTRL + X 保存并退出,然后在出现提示时按 Y,然后按 Enter

调整缓存压力设置

另一个可能需要修改的相关值是 vfs_cache_pressure。此设置配置的是,相对于其他数据,系统将选择缓存多少 inode 和 dentry 信息。 这些是关于文件系统的访问数据。查找它们通常耗费很大,获取这些信息的请求又非常频繁,因此缓存它们对你的系统是一个很好的事情。你可以通过再次查询 proc 文件系统查看当前值:

$ cat /proc/sys/vm/vfs_cache_pressure
Output
100

目前的配置使得我们的系统从缓存中删除 inode 信息的速度过快。我们可以将其设置为更保守的值,如50,输入:

$ sudo sysctl vm.vfs_cache_pressure=50
Output
vm.vfs_cache_pressure = 50

同样,这一配置只对当前会话有效。我们可以将其添加到配置文件中来改变这一点,就像我们对 swappiness 设置所做的那样:

$ sudo nano /etc/sysctl.conf

在底部添加下面这行来指定新值: /etc/sysctl.conf

vm.vfs_cache_pressure=50

完成后关闭并保存文件。

结语

遵循本指南中的步骤将为您提供一些“喘息的空间”,以应对可能导致内存不足异常的情况。交换空间可以很好地用来避免这种常见问题。 而如果遇到内存不足的错误,或者发现系统无法使用所需的应用程序,最好的解决方案是优化应用程序配置,或升级服务器。