Linux 上添加 swap 分区

防止应用程序出现内存不足错误的一种方法是向服务器添加一些交换空间。在本指南中,我们将介绍如何向 Almalinux 服务器添加 swap 分区。

1. 什么是 Swap?

swap 分区是硬盘存储空间的一部分,专门留给操作系统用来临时存储 RAM 中无法再保存的数据。这可以增加服务器在工作内存中可以保存的信息量,但有一些注意事项。硬盘上的交换空间主要在 RAM 中没有足够的空间来保存正在使用的应用程序数据时使用。

写入磁盘的信息将比保存在 RAM 中的信息慢得多,但操作系统会倾向于将正在运行的应用程序数据保留在内存中,并使用交换空间来存储较旧的数据。总的来说,在系统 RAM 耗尽时,将交换空间作为后备方案,可以很好地防止出现内存不足异常。

2. 检查系统的 swap 分区

在开始之前,我们可以检查系统是否已经有可用的交换空间。可能有多个交换文件或交换分区,但通常一个就足够了。

我们可以通过输入以下命令来查看系统是否有任何配置的交换:

1
2
3

sudo swapon --show

如果没有任何输出,则意味着您的系统当前没有可用的交换空间。

您可以使用以下实用程序验证没有 active 的 swap 分区:

1
2
3
4
5
6
7

$ free -h

Output
total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B

正如从输出的 Swap 行中看到的,系统上没有活动的交换。

3. 检查硬盘分区上的可用空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

$ df -h

Output
Filesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000

Mounted on 列中的设备/是本例中的磁盘。本例中我们有足够的可用空间(仅使用了 1.4G)。您的使用情况可能有所不同。

虽然关于交换空间的合适大小有很多意见,但这实际上取决于您的个人偏好和应用程序要求。通常等于或两倍于系统 RAM 的量是一个不错的起点。另一个好的经验法则是,如果您只是将其用作 RAM 后备,那么超过 4G 的交换空间可能没有必要。

4. 创建交换文件

现在我们知道了可用的硬盘空间,我们可以在文件系统上创建一个交换文件。我们将在根目录分配一个大小与 RAM 相等的 swapfile。

创建交换文件的最佳方法是使用 fallocate 程序。此命令会立即创建指定大小的文件。

由于我们示例中的服务器具有 1G 的 RAM,因此我们将在本指南中创建一个 1G 的文件。不过您可以调整它以满足您自己的服务器的需求:

1
2
3

sudo fallocate -l 1G /swapfile

我们可以通过输入以下命令来验证是否保留了正确数量的空间:

1
2
3
4
5

$ ls -lh /swapfile

-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

swap 分区文件已创建并留出了足够的空间。

5. 启用交换文件

现在我们有了一个可用且大小正确的文件,我们需要将其真正转变为交换空间。

首先,我们需要锁定文件的权限,以便只有具有 root 权限的用户才能读取内容。这样可以防止普通用户访问该文件,否则将带来严重的安全隐患。

输入以下命令使该文件仅 root 用户可用:

1
sudo chmod 600 /swapfile

输入以下命令验证权限是否改变:

1
2
3
4
5

$ ls -lh /swapfile

Output
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

如您所见,只有 root 用户启用了读写标志。

我们现在可以通过输入以下命令将文件格式化为交换空间:

1
2
3
4
5
6

$ sudo mkswap /swapfile

Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

格式化文件后,我们可以启用交换文件,允许系统开始使用它:

1
sudo swapon /swapfile

输入以下命令验证交换是否可用:

1
2
3
4
5
6

$ sudo swapon --show

Output
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2

我们可以再次使用 free 命令检查 active swap 分区:

1
2
3
4
5
6
7

$ free -h

Output
total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi

我们的交换分区已成功设置,操作系统将在必要时开始使用它。

6. 使交换分区永久化

我们最近的更改已为当前会话启用了交换文件。但是,如果我们重新启动,服务器将不会自动保留交换设置。我们可以通过将交换文件添加到我们的/etc/fstab 文件中来更改此设置。

备份/etc/fstab 文件以防万一出现问题:

1
2
3

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

在/etc/fstab 文件末尾添加以下内容以使交换分区永久有效:

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

7. 调整交换分区设置

您可以配置一些选项,这些选项会在处理交换时对系统的性能产生影响。

7.1. 调整 Swappiness 属性

此 swappiness 参数配置系统将数据从 RAM 交换到交换空间的频率。这是一个介于 0 到 100 之间的值。

如果值接近于零,则除非绝对必要,否则内核不会将数据交换到磁盘。请记住,与 swap 分区文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费的时间更长,并且会显著降低性能。告诉系统不要过多依赖交换通常会使得系统更快。

接近 100 的值将尝试将更多数据放入交换中,以保持更多 RAM 空间可用。根据应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。

我们可以通过输入以下命令来查看当前的 swappiness 值:

1
2
3
4
5
6

$ cat /proc/sys/vm/swappiness

Output
60

对于桌面操作系统来说,将 swappiness 设置为 60 还不错。对于服务器来说,您可能希望将其设置为更接近 0。

我们可以使用命令将 swappiness 设置为不同的值 sysctl。

例如,要将 swappiness 设置为 10,我们可以输入:

1
2
3
4

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

此设置将持续到下次重新启动。我们可以通过在/etc/sysctl.conf 文件中添加以下行来在重新启动时自动设置此值:

1
2
3

sudo vi /etc/sysctl.conf

可以在底部添加:

1
2
3

vm.swappiness=10

完成后保存并关闭文件

7.2. 调整缓存压力设置

另一个你可能想要修改的相关值是 vfs_cache_pressure。此设置配置系统将选择缓存 inode 和 dentry 信息而不是其他数据的量。

基本上,这是有关文件系统的访问数据。这通常查找起来非常昂贵,而且请求非常频繁,因此这对您的系统来说是一件非常好的事情。您可以通过 proc 再次查询文件系统来查看当前值:

1
2
3
4
5
6

$ cat /proc/sys/vm/vfs_cache_pressure

Output
100

根据目前的配置,我们的系统从缓存中删除 inode 信息的速度太快。我们可以通过键入以下内容将其设置为更保守的设置,例如 50:

1
2
3
4
$ sudo sysctl vm.vfs_cache_pressure=50

Output
vm.vfs_cache_pressure = 50

这仅对我们当前会话有效。我们可以像 swappiness 设置一样,通过将其添加到配置文件中来更改它:

1
2
3
4
5

$ sudo vi /etc/sysctl.conf

# 添加一行配置
vm.vfs_cache_pressure=50

完成后保存并关闭文件。

8. 总结

按照本指南中的步骤操作,您将在可能导致内存不足异常的情况下获得一些喘息空间。交换空间对于避免这些常见问题非常有用。

如果您遇到 OOM(内存不足)错误,或者发现系统无法使用所需的应用程序,最好的解决方案是优化应用程序配置或升级服务器。

9. 参考文档

如何在 Ubuntu 22.04 上添加交换空间

作者

鹏叔

发布于

2024-10-04

更新于

2024-10-04

许可协议

评论