在 Linux 上为 zram 放弃交换分区

Zram 是一种用于创建 RAM 内压缩缓存的工具,专门用作交换空间。
5 位读者喜欢这篇文章。
How Linux got to be Linux: Test driving 1993-2003 distros

互联网档案馆图书图片。由 Opensource.com 修改。CC BY-SA 4.0

我花了很多时间在电脑上玩耍(我的意思是工作),并且发现了很多有趣的东西。最近引起我注意的一个是 zram0 设备。几个月前,当我撰写一篇 Opensource.com 文章时,我第一次注意到它。它出现在 lsblk 命令的输出中

# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda             8:0    0 931.5G  0 disk
├─sda1          8:1    0   600M  0 part
[...]
zram0         252:0    0     8G  0 disk [SWAP]

它被识别为交换空间,这首先引起了我的好奇心,所以我进行了一些探索。Zram 最初被称为“compcache”,代表“压缩缓存”。事实证明,zram 是一种用于创建 RAM 内压缩缓存的工具,专门用作交换空间。

但为什么呢?

当我开始研究 zram 时,我只找到了一些关于使用 zram 作为交换空间的基本文章。起初,这对我来说似乎有点违反直觉。毕竟,如果你的 RAM 快用完了,你将页面交换到 RAM 中的虚拟驱动器中,那有什么好处呢?

然后我找到了 Fedora 项目维基页面,其中提出了使用 zram 上的交换分区。该提案指出:“交换分区很有用,除非它很慢。zram 是一种使用压缩的 RAM 驱动器。在启动期间创建 zram 上的交换分区。默认情况下不再使用交换分区。”

页面的其余部分是关于细节、好处、副作用和反馈。

Linux 上用于交换空间的 Zram

使用 zram 作为交换空间的目的是实现与常规基于分区或基于文件的交换空间相同的功能。当内存压力变得过大时,一些最近最少使用的数据会被移动到交换空间。平均而言,它被压缩到其原始大小的约 50%,并放置在 RAM 中的 zram 空间中。这比将这些内存页存储在硬盘驱动器上要快得多,并释放了它占用的 RAM 以供其他用途。

节省交换空间

我试图找到关于如何配置多少交换空间或 zram 交换空间的修订建议。这让我重新评估了交换空间,以及我之前的文章 现代 Linux 系统应该使用多少交换空间? 就我从 RHEL 和 Fedora 的最新文档中了解到的情况来看,建议的交换空间大小没有改变。然而,该文档忽略了 zram 的使用。

但是,当使用不使用 zram 的旧版本 Linux 或在 zram 已被禁用的情况下,之前文章中的表格仍然为交换空间分配提供了一个良好的起点。

我找到的关于 Zram 功能的文档在 zram 如何相对于 RAM 大小分配以及分配给 zram 交换空间的空间量方面是不一致的。

由于缺乏权威文档,我进行了一些实验,以经验性地确定用于分配 zram 交换空间的算法。我使用了我自己的物理和虚拟系统进行此操作。结果很有趣,并且与我目前找到的任何文档都不符。

在所有大到足以支持它的系统上,zram 的默认大小为 8 GB,但在 RAM 容量较小的主机上,它通常会显着减少。在我用于测试的一个虚拟机 (VM) 上,该虚拟机可以访问 4 GB 的 RAM,zram 虚拟交换空间分配为 3.8 GB。我有一台旧的 Dell 电脑包含 8 GB 的 RAM,zram 设置为 7.6 GB。当 RAM 减少到 2 GB 时,Zram 减少到 1.9 GB。

我拥有的所有物理和虚拟主机(RAM 超过 8 GB)都显示正好 8 GB 的 zram。这包括我的主要工作站(配备 64 GB RAM)和其他配备 16 GB 或 32 GB RAM 的主机。

基于这些少量数据点,我可以得出结论,当前默认设置最多为 8 GB 的 zram,并且对于 RAM 容量为 8 GB 或更少的主机,zram 为 RAM 的 95%。

我阅读了一些文章,其中提到了 zram 交换分区的其他大小,甚至高达 RAM 的 100%,但这些似乎都是理论上的,而不是现实。

您的发行版可能有所不同,但以下是 Fedora 和类似发行版的实际 zram 交换分区分配

  • RAM ⇐ 8 GB: 0.95 × RAM

  • RAM > 8 GB: 8 GB

请注意,zram 交换分区大小算法并非基于任何针对任何给定实际系统或应用程序的“最佳”交换分区大小的建议。此 zram 交换分区分配是一种相当概率性的方法,应该可以在各种 Linux 主机上良好运行。但是,最大 zram 交换分区大小配置为 8 GB,并且我一直建议 8 GB 作为传统交换分区的最大容量,我认为我可以认为它反映了 zram 交换分区的最佳大小。

管理 zram 交换分区

Zram 默认值存储在 /usr/lib/systemd/zram-generator.conf 配置文件中。以下内容来自我分配了 5097 GB RAM 的测试虚拟机之一。

# cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# - size - same as available RAM or 8GB, whichever is less
# - compression - most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]
zram-size = min(ram, 8192)

您可以在 zram-generator.conf 配置文件的最后一行中更改默认的 Zram 交换分区大小。我不建议这样做,除非您可以明确地说明这样做的理由,并在进行任何更改后测试您的结果。与 Linux 中的许多其他配置默认值一样,zram 的默认值也经过了充分的测试,并且适用于大多数用例。

监控 zram

zramctl 实用程序可用于查看 zram 的当前状态。

# zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle       4.8G   4K   80B   12K       4 [SWAP]

传统的 swapon 命令也可用于查看交换分区,包括用作交换分区的 zram

# swapon --show
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition 4.8G   0B  100

需要注意的一件事是,当 zramctl 不包含数据时,它不会报告 zram,因此结果包含空输出。诸如 lsblkswapontopfreehtop 等工具即使在 zram 不包含数据时也会显示 zram。

停用 zram

swapoff -a 命令会关闭 zram 交换分区以及用作交换分区的传统 HDD 或 SSD 存储。当 swapon -a 为空时,它不会显示 zram。请改用 zramctl /dev/zram0

# swapon --show
# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0  120G  0 disk
├─sda1          8:1    0    1G  0 part /boot/efi
├─sda2          8:2    0    1G  0 part /boot
└─sda3          8:3    0  118G  0 part
  ├─vg01-root 253:0    0   10G  0 lvm  /
  ├─vg01-swap 253:1    0    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:1    0   30G  0 lvm  /usr
  ├─vg01-home 253:2    0   10G  0 lvm  /home
  ├─vg01-var  253:3    0   30G  0 lvm  /var
  └─vg01-tmp  253:4    0   10G  0 lvm  /tmp
sr0            11:0    1 1024M  0 rom
zram0         252:0    0    0B  0 disk
# zramctl
#
# zramctl /dev/zram0
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle         0B   0B    0B    0B       4

请注意,在 /dev/zram0 用于交换空间之前,它不会在这些命令中显示为交换空间。这让我有些困惑,直到我的实验表明情况确实如此。

创建 Zram 交换分区

Zram 本身已经存在大约 20 年了,但在过去一两年内才在某些发行版中用作交换空间。某些或所有主机上的当前 Linux 安装可能不是使用 zram 作为交换分区创建的。如果是这种情况,可以很容易地补救。

对于 Fedora 32(默认使用 zram 作为交换分区之前的最后一个版本),只需要三个简单的命令。

首先,验证 zram-swap.service 文件是否存在,该文件作为 zram RPM 软件包的一部分安装。

# systemctl status zram-swap
● zram-swap.service - Enable compressed swap in memory using zram
     Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled)
     Active: inactive (dead)

接下来,安装 zram-generator-defaultszram-generator 软件包。

# dnf install zram-generator-defaults zram-generator

启用并启动 zram-swap 服务

# systemctl enable zram-swap.service
# systemctl start zram-swap.service

然后验证 zram0 是否存在,并且是否正在用作交换空间

# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0  120G  0 disk
├─sda1          8:1    0    2G  0 part /boot
└─sda2          8:2    0  118G  0 part
  ├─vg01-root 253:0    0   10G  0 lvm  /
  ├─vg01-swap 253:1    0    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:2    0   35G  0 lvm  /usr
  ├─vg01-tmp  253:3    0   15G  0 lvm  /tmp
  ├─vg01-var  253:4    0   35G  0 lvm  /var
  └─vg01-home 253:5    0   20G  0 lvm  /home
sr0            11:0    1 1024M  0 rom
zram0         252:0    0  7.5G  0 disk [SWAP]

使用 zram 改进交换分区

这就是全部内容。在 Fedora 上很容易。不同的发行版可能同样容易,只是软件包名称和命令方面可能存在一些不同的细节。在您的计算机上试用 zram 交换分区。在我的下一篇文章中,我将演示一些进一步的 zram 选项。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件方面的工作,自 1969 年以来一直从事计算机方面的工作。他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

评论已关闭。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© 2025 open-source.net.cn. All rights reserved.