在内存比较捉急的小鸡上,开启 swap 可以减少出现 OOM 而杀掉进程的情况。然而用硬盘分区作为 swap 有几个明显的缺陷:一是速度慢,二是影响其他进程磁盘 io 的速度。
ZRAM 在安卓手机上几乎都是默认开启的,它相对于磁盘交换分区的优势是不会影响其他 io 进程,缺点是更吃 CPU。
前段时间开了一台 bytevirt 的 214M 内存的小鸡。这么小的内存用 alpine 应该比较合适,但是 openrc 我不会用,所以装了 debian,这样就肯定要开 swap 了。但是这家的 SSD 速度感人
:
用 sysbench 测试顺序读写:
Throughput:
read, MiB/s: 340.05
written, MiB/s: 0.00
Throughput:
read, MiB/s: 0.00
written, MiB/s: 93.66
16K 随机读写:
Throughput:
read, MiB/s: 6.55
written, MiB/s: 4.37
我发现论坛上几乎没有讨论 ZRAM 的帖子,于是自己做了个对比测试。
测试使用 7zip benchmark,最大字典设置为 2^24,命令为:7zz b --md24。
ZRAM 组使用 zstd 压缩算法(注:zstd 是压缩率高而速度相对慢的算法。本次测试中 lz4 算法 OOM 了,所以用 zstd。用 lz4 算法速度会快很多,详见 链接):
7-Zip (z) 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15
64-bit locale=C.UTF-8 Threads:1
d24
Compiler: 10.2.1 20210110 GCC 10.2.1
Linux : 5.10.0-15-cloud-amd64 : #1 SMP Debian 5.10.120-1 (2022-06-09) : x86_64
PageSize:4KB THP:never hwcap:2 hwcap2:2
Intel(R) Xeon(R) CPU E3-1241 v3 @ 3.50GHz (306C3)
1T CPU Freq (MHz): 3567 3439 3446 3505 3473 3460 3438
RAM size: 181 MB, # CPU hardware threads: 1
RAM usage: 220 MB, # Benchmark threads: 1
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 3403 100 3326 3311 | 41719 100 3574 3562
23: 2786 90 3151 2839 | 40143 99 3500 3475
24: 27 46 64 30 | 39143 99 3460 3436
---------------------------------- | ------------------------------
Avr: 2072 79 2180 2060 | 40335 99 3512 3491
Tot: 89 2846 2776
磁盘 swap 组:
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 3621 99 3560 3523 | 42135 99 3627 3598
23: 3119 97 3260 3178 | 40484 99 3551 3504
24: 20 9 256 22 | 36118 92 3438 3171
---------------------------------- | ------------------------------
Avr: 2253 68 2359 2241 | 39579 97 3539 3424
Tot: 83 2949 2833
测试结果的说明可以参考这里。
这里的关键数据是 Dict=24 时的 Compressing 部分,只有这部分高强度使用交换分区。截取出来是:
// zram
Dict Speed Usage R/U Rating
KiB/s % MIPS MIPS
24: 27 46 64 30
// 磁盘 swap
Dict Speed Usage R/U Rating
KiB/s % MIPS MIPS
24: 20 9 256 22
其中 Speed 项,即压缩速度,尽管 zram 用的不是最快的算法(没有用 lz4 而是 zstd),zram 还是比磁盘 swap 快了 35%,这就是本次测试的结论。
再看 Usage 项,即 CPU 使用率,zram 组为 46%,其余时间在进行 zram 压缩/解压缩;而磁盘 swap 组只有 9%,其余时间在等待磁盘 io。
最后的结论是,在硬盘不太快的 vps 上,建议使用 zram 作为交换空间。

关于 zram 如何设置可以参考 Archwiki。(
systemd-zram-generator在 Debian 12 / Ubuntu 22.04 才有)Dict=24以外的部分可以忽略,因为几乎没有使用交换分区。
Dict=24的压缩部分运行的时间非常长,有十几分钟,速度误差应该很小。这部分测试内存占用一直保持90%,交换分区占用130-250MB。
另外,zram 和磁盘 swap 可以同时使用。zram 的默认优先级更高,大小需要设置小一些,否则会出现 zram 还未达到最大值但实际上内存已经满了,而磁盘 swap 还空闲。