ZRAM 与磁盘交换分区对比测试

在内存比较捉急的小鸡上,开启 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 作为交换空间。

点赞
  1. nsx-na1说道:

    关于 zram 如何设置可以参考 Archwiki。(systemd-zram-generator 在 Debian 12 / Ubuntu 22.04 才有)

  2. nsx-na1说道:

    Dict=24以外的部分可以忽略,因为几乎没有使用交换分区。
    Dict=24的压缩部分运行的时间非常长,有十几分钟,速度误差应该很小。这部分测试内存占用一直保持90%,交换分区占用130-250MB。

  3. nsx-na1说道:

    另外,zram 和磁盘 swap 可以同时使用。zram 的默认优先级更高,大小需要设置小一些,否则会出现 zram 还未达到最大值但实际上内存已经满了,而磁盘 swap 还空闲。

回复 nsx-na1 取消回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮