先前安装系统的时候,swap 分区给小了(机器内存的一半)。我的笔记本内存 8G,swap 给了 4G,当系统已用内存超过 4G,会导致无法休眠。如果 swap 给的和本机内存一样大,那么就不会存在 swap 放不下当前工作镜像的问题。但重新分区追加 swap 显然不现实,所以只能让两块 swap 拼凑一下,达到总体有 8G 可用 swap 的效果。

像我之前,每当要休眠的时候,都要清一下系统内存,保证已用内存在 4G 以下再休眠。十分繁琐。现在的我建议,swap 分区至少和机器内存相当

无论是新建一块 swap 分区,抑或是创建一个 swapfile,都能达到上述效果。下面介绍一下如何创建一个 swapfile 作为追加 swap 使用。

当前,本机 swap 只有 4G:

1
2
3
4
$ free -h
            total        used        free      shared  buff/cache   available
内存:      7.7Gi       754Mi       6.0Gi       189Mi       978Mi       6.5Gi
交换:      4.1Gi          0B       4.1Gi

创建一个 swapfile:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建一个 4G 大小的文件
dd if=/dev/zero of=/tmp/swapfile bs=1M count=4096

# 格式化为 swap 格式
mkswap /tmp/swapfile

# 启用 swapfile
swapon /tmp/swapfile

# 查看当前可用 swap
free -h
               total        used        free      shared  buff/cache   available
内存:      7.7Gi       822Mi       5.9Gi       189Mi       981Mi       6.5Gi
交换:      8.1Gi          0B       8.1Gi

# 关闭 swap
swapoff /tmp/swapfile

# 查看已使用 swap 分区的摘要
swapon -s
Filename                                Type		Size		Used		Priority
/dev/nvme0n1p7                          partition   4323648         0		      -2
/home/yychi/EXTRA/swapfile              file        4194300         0		      -3

这样一来,就完成了 swap 扩容。但是,你会发现上述工作每次重启都会丢失,所以还要将 swapfile 写进 fstab,保证每次启动都会加载这块 swap.

1
2
3
4
5
$ cat /etc/fstab
# /dev/nvme0n1p7
UUID=4227170f-0a4f-4a8e-fads-jasdfkjaskf	none      	swap      	defaults,pri=-2	0 0
# extra swapfile
/home/yychi/EXTRA/swapfile                  none        swap        defaults,pri=-1 0 0

另,使用swapon -p <priority> <swap_partition>为指定 swap 分区设置优先级。

2024-01-28 更新:注意,上述 swap 分区的优先级必须使用正数才有效果,负数是内核专用(在这里相当于没设)。参考这里。我现在的设置是:

# extra swapfile, prefer use this swap file, as the swap partition is used for hibernation
/home/yychi/EXTRA/swapfile                  none        swap        defaults,pri=2 0 0
# /dev/nvme0n1p7
UUID=4227170f-0a4f-4a8e-a4fd-0d91f46f54af       none            swap            defaults,pri=1  0 0

数值越大,优先级越高。