跳转至

在 Ubuntu 24.04 上添加交换空间

检查交换内存情况

在开始之前,我们可以检查系统是否已经有可用的交换空间。

sudo swapon --show
输出
NAME      TYPE SIZE   USED PRIO
/swapfile file   8G 135.2M   -2

如果有类似上述的输出,这意味着系统目前有可用的交换空间。

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

你可以使用 free 来验证是否存在活动交换空间:

free -h
输出
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       995Mi        95Mi        51Mi       872Mi       724Mi
Swap:          8.0Gi       135Mi       7.9Gi

从以上输出结果的 Swap 行可以看到,系统上已经有可用的交换空间。

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

从以上输出结果的 Swap 行可以看到,系统上目前没有可用的交换空间。

创建交换文件

我们将在根目录 (/) 下分配一个交换文件,名为 swapfile

创建交换文件的最佳方法是使用 fallocate

我们将在本指南中创建一个 8G 的交换文件,请根据自己服务器的需要进行调整:

sudo fallocate -l 8G /swapfile

验证一下是否预留了正确的空间:

ls -lh /swapfile
输出
-rw-r--r-- 1 root root 8.0G Jul 23 18:33 /swapfile

启用交换文件

首先,我们需要锁定文件的权限,只有拥有 root 权限的用户才能读取交换文件的内容。

这样,普通用户就无法访问该文件,否则会产生重大安全隐患。

sudo chmod 600 /swapfile

验证权限更改:

ls -lh /swapfile
输出
-rw------- 1 root root 8.0G Jul 23 18:33 /swapfile

现在,我们可以输入以下命令将刚刚创建的文件标记为交换文件:

sudo mkswap /swapfile
输出
Setting up swapspace version 1, size = 8192 MiB (8589934592 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

标记交换文件后,我们可以启用交换文件,让我们启用它:

sudo swapon /swapfile

验证交换文件是否可用:

输出
NAME      TYPE SIZE   USED PRIO
/swapfile file   8G 135.2M   -2

交换文件设置持久化

上述操作启用了交换文件,但仅在本次会话有效。

我们可以通过在 /etc/fstab 文件中添加 swap 记录来使交换文件设置持久化。

备份 /etc/fstab 文件,以防出错:

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

将 swap 记录添加到 /etc/fstab 文件末尾:

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

调整相关设置

添加好交换文件后,我们可以配置一些对系统性能有影响的选项。

调整 swappiness 属性

swappiness 参数用于配置系统将数据从内存交换到交换空间的频率。该值介于 0 和 100 之间,代表一个百分比。

当值接近 0 时,除非绝对必要,内核不会将数据交换到磁盘上。这将会告诉系统不要过度依赖交换文件,通常会让系统运行得更快。

请记住,与交换文件的交互是更耗时的,因为它们比与内存的交互耗时更长,而且会导致性能大幅下降。

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

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

cat /proc/sys/vm/swappiness
输出
60

对于台式机来说,交换性设置为 60 也不错。对于服务器,我建议将其调整接近于 0。

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

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

sudo sysctl vm.swappiness=10
输出
vm.swappiness = 10

以上设置仅在本次会话有效,因此我们可以在 /etc/sysctl.conf 文件中添加这一行,在重启时自动设置该值:

sudo nano /etc/sysctl.conf

/etc/sysctl.conf 文件底部,您可以添加:

/etc/sysctl.conf
vm.swappiness=10

调整 cache pressure 设置

另一个需要修改的相关值是 vfs_cache_pressure

基本上,这是有关文件系统的访问数据。 一般来说,这些数据的查询成本很高,而且请求频率也很高,因此是系统缓存的最佳内容。

你可以通过再次查询 proc 文件系统来查看当前值:

cat /proc/sys/vm/vfs_cache_pressure
输出
100

按照目前的配置,我们的系统从缓存中删除 inode 信息的速度太快。

我们可以将其设置为更保守的值,比如 50,只需输入:

sudo sysctl vm.vfs_cache_pressure=50
输出
vm.vfs_cache_pressure = 50

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

sudo nano /etc/sysctl.conf

/etc/sysctl.conf 文件底部添加:

/etc/sysctl.conf
vm.vfs_cache_pressure=50