受到 Databend - set swap to 10G 的感召,检查了一下自己本子的 Swap ,只有大概 8G 的 zram 。

[[email protected] ~]$ swapon -s
Filename				Type		  Size		  Used	Priority
/dev/zram0      partition	8388604		0	    100

完蛋,不能顺利跑完 grcov 限定版 unit-test 的原因大概就在这里了(之前有讨论过是 OOM)。本着「大就是好,多就是美」的原则,决定给它来个超级加倍,再塞个 32 GiB 的 Swapfile 上去。

Btrfs 限定之初始化 Swapfile

自 5.0 内核之后,Btrfs 才支持创建 Swapfile ,而且有一些特别的要求:

  • Swapfile 不能放在 snapshotted subvolume (快照子卷)上。
  • 不支持跨多设备文件系统上的 Swapfile 。

所以正确的做法是:新建一个 non-snapshotted subvolume ,然后在该子卷之下创建禁用压缩的 Swapfile 。

# 创建 non-snapshotted subvolume 。
[[email protected] /]$ sudo btrfs subvolume create swap
Create subvolume './swap'
# 进入子卷。
[[email protected] /]$ cd swap
# 新建长度为 0 的 Swapfile 。
[[email protected] swap]$ sudo truncate -s 0 ./swapfile
# 设置交换文件的属性,使其免于 copy-on-write 。
[[email protected] swap]$ sudo chattr +C ./swapfile
# 禁用压缩。
[[email protected] swap]$ sudo btrfs property set ./swapfile compression none

注意,这些需要在系统根目录下完成,以避免权限问题和设置问题。

设定 Swapfile 作为 Swap 成分之一

Swapfile 是创建特定交换分区的一种替代方案,好处是方便创建和删除、也便于动态变更大小。

这种方案比较适合 SSD 空间充裕的情况。刚好可以组成一个 memory -> zram -> swapfile 的多级交换。

# 将 Swapfile 填充至合适的大小,一般选择内存空间的一半或者与内存空间相当。
# 这里仅仅是为了好玩,选择了巨量的 32GiB ,有浪费之嫌。
[[email protected] swap]$ sudo dd if=/dev/zero of=./swapfile bs=1M count=32768 status=progress
33980153856字节(34 GB,32 GiB)已复制,20 s,1.7 GB/s
记录了32768+0 的读入
记录了32768+0 的写出
34359738368字节(34 GB,32 GiB)已复制,21.2624 s,1.6 GB/s
# 设置正确的权限。
[[email protected] swap]$ sudo chmod 600 ./swapfile
# 格式化 Swapfile 作为交换类型。
[[email protected] swap]$ sudo mkswap ./swapfile
正在设置交换空间版本 1,大小 = 32 GiB (34359734272  个字节)
无标签,UUID=2e48f371-62a9-487a-9613-382b386b2836
# 激活交换文件,并设定优先级。
# 由于 zram 的优先级是 100 ,所以这里设定成 50 。毕竟 zram 的性能比 swapfile 要强不少。
[[email protected] swap]$ sudo swapon --priority 50 ./swapfile

检查 Swap 空间并设置自动挂载

那么,经过之前两步,已经得到了接近 40GiB 的 Swap 空间,接下来就是检查一下,并设置挂载。

# 使用 free 查看概览。
[[email protected] ~]$ free -m
               total        used        free      shared  buff/cache   available
Mem:           15453        5206         290         109        9956        9808
Swap:          40959           2       40957
# 使用 swapon 查看详情。
[[email protected] ~]$ swapon -s
Filename				Type		  Size		  Used		Priority
/dev/zram0      partition	8388604		2560		100
/swap/swapfile  file		  33554428	0		    50
# 编辑 fstab ,添加指定条目以完成挂载。
# 这里必须带上子卷名,UUID 可以不写。
[[email protected] ~]$ sudo nano /etc/fstab
/swap/swapfile    none    swap    defaults    0    0

参考资料

笑死,一个多年 Fedora 用户看的文档大多都来自 Arch Wiki 。

  • https://wiki.archlinux.org/title/Improving_performance#zram_or_zswap
  • https://wiki.archlinux.org/title/Btrfs#Swap_file
  • https://wiki.archlinux.org/title/Swap#Swap_file_creation
  • https://wiki.archlinux.org/title/Fstab

克制 Rust 编译大型项目时 OOM 还有一些小技巧,也许下次可以水一点内容。

我没有摸鱼!(手动狗头)