在 Linux 上用 zram 替代传统交换空间

2023-09-29 12:19
使用ZRAM替换Linux上的传统交换空间 {IMG_0: Ahr0chm6ly9Zoc41MWN0BN0BY5JB20VB3NZLZIWMS8YOC9JNTIYNJU2TM0MDUXZDU4NZKNZIXMWNJMJRK OGFKOS5QCGC =/} 使用ZRAM 充当交换空间,并与常规的基于分区或基于文件的交换空间执行相同的操作。当内存压力过高时,一些最近最少使用的数据将被移动到交换空间。平均来说,它会被压缩到原来的大小 大约50%并且被放置在内存的zram空间中。这比将这些内存页面存储在硬盘上要快得多,并且可以释放其用于其他用途的内存。

保存交换空间

我正在尝试查找有关要配置多少交换空间或 zram 交换空间的摘要建议。这让我回到交换空间设置,以及我之前的文章《​​现代 Linux 系统的正确交换空间是多少?​​》。据我从 RHEL 和 Fedora 的最新文档来看,建议的交换空间量没有改变。但是,文档忽略了 zram 的使用。

但是,上一篇文章中的表仍然为不使用 zram 或禁用 zram 的旧版本 Linux 中的交换空间分配提供了一个很好的起点。

我发现的有关 zram 功能的文档在 zram 如何根据内存大小分配空间以及分配给 zram 的交换空间量方面不一致。

由于缺乏权威文档,我进行了一些实验来凭经验确定用于分配zram交换空间的算法。为此,我使用自己的物理和虚拟系统。结果很有趣,并且与我迄今为止找到的任何文档不一致。

在所有足够大的系统上,zram 的默认大小为 8GB,但在内存较少的主机上通常要小得多。在我用于测试的虚拟机 (VM) 之一上,我可以访问 4GB内存,zram虚拟交换空间分配为3.8GB。我有一台旧的戴尔计算机,内存为 8GB,zram 设置为 7.6GB。当内存减少到2GB时,zram减少到1.9GB。

我拥有超过 8GB RAM 的所有物理和虚拟主机均显示 8GB zram。这包括我的具有 64GB RAM 的主工作站和具有 16GB 或 32GB RAM 的其他主机。

根据这几个数据点,我可以得出结论,当前默认的 zram 最多为 8GB,在 8GB 或更少的主机上,zram 占用了 95% 的内存。

我读过一些文章,提到了其他大小的 zram 交换空间,甚至高达 100% 的内存,但这些似乎更理论化而不是现实。

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

  • 内存 ⇐ 8 GB:0.95 × 内存
  • 内存 > 8 GB:8 GB

请注意,zram 交换空间大小调整算法不基于任何给定的实际系统或应用程序。“最佳”交换尺寸建议。这种zram 交换空间的分配是一种相当概率的方法,应该适用于各种 Linux 主机。但是,最大 zram 交换空间大小配置为 8GB,我一直推荐8GB作为传统交换空间的最大大小,我想我可以说它反映了zram交换空间的最佳大小。

管理 zram 交换空间

zram 的默认值保存在​​/usr/lib/systemd/zram-generator.conf​​配置文件中。下面是我的测试虚拟机之一,分配了 5097GB 内存。

# cat /usr/lib/systemd/zram-generator.conf# 此配置文件使用默认设置启用 /dev/zram0 设备:# - 大小 - 与可用 RAM 或 8GB 相同,以较小者为准# - 压缩- 最有可能的是 lzo-rle## 要禁用,卸载 zram-generator-defaults 或创建空# /etc/systemd/zram-generator.conf 文件。[zram0]zram-size= min(ram, 8192)

You您可以在​​zram-generator.conf​​配置文件的最后一行更改默认的 zram 交换空间大小。但我建议不要这样做,除非您能清楚地说明这样做的原因并在进行任何更改后测试您的结果。与 Linux 中的许多其他默认配置一样,zram 的默认配置经过了充分测试,适合大多数用例。

监控zram

您可以使用​​zramctl​​工具查看zram当前状态。

#zramctlname算法磁盘磁盘数据compr compr total streams mountpoint/dev/zram0 lzo-rle 4.8g 4k 80b 12k 4 [swap]

传统swapon the Swapon command也可以使用视图。交易所,包括用作交易所的zram:

# swapon --showNAME TYPE SIZE USED PRIO/dev/zram0 分区 4.8G 0B 100

需要注意的是​​zramctl​​在不包含数据时不会报告zram ,因此结果将包含空输出。就像​​lsblk​​、​​交换​​、​​顶部​​、​免费​ ​、 ​​htop​​等工具即使不包含数据也会显示zram。

禁用 zram

​swapoff -a​​ 该命令关闭 zram 交换空间以及用作交换的传统 HDD 或 SSD 存储。 ​​swapon -a​​命令在zram为空时不显示zram,可以使用​​zramctl /dev/zram0​​代替。

# swapon --show# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:00 120G 0 磁盘├─sda1 8:10 1G 0 部分 /boot/efi├─sda2 8:20 1G 0 部分 /boot└─ sda3 8:30 118G 0 部分 ├─vg01-root 253:00 10G 0 lvm / ├─vg01-swap 253:10 3G 0 lvm [SWAP] ├─vg01-usr 253:10 30G 0 lvm /usr ├─vg01- home 253:20 10G 0 lvm /home ├─vg01-var 253:30 30G 0 lvm /var └─vg01-tmp 253:40 10G 0 lvm /tmpsr0 11:01 1024M 0 romzram0 252:00 0B 0 磁盘# zramctl# # zramctl /dev/zram0NAME 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 - 使用 zram 启用内存中的压缩交换已加载:已加载(/usr/lib/systemd/system/zram-swap.service;已禁用;供应商预设:已禁用)活动:不活动(死)

接下来,安装​​zram-generator-defaults​​和​​zram-generator​​包:

# dnf install zram-generator-defaults zram-generator

启用并启动​​zram-swap​​服务:

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

然后验证​​zram0​​是否存在并用作交换空间:

# lsblkNAME MAJ:最小 RM 大小 RO 类型挂载点sda 8:00 120G 0 磁盘├─sda1 8:10 2G 0 部分 /boot└─sda2 8:20 118G 0 部分├─vg01-root 253:00 10G 0 lvm / ├─vg01-swap 253:10 3G 0 lvm [交换] ├─vg01-usr 253:20 35G 0 lvm /usr ├─vg01-tmp 253:30 15G 0 lvm /tmp ├─vg01-var 253:40 35G0 lvm /var └─vg01-home 253:50 20G 0 lvm /homesr0 11:01 1024M 0 romzram0 252:00 7.5G 0 disk [SWAP]

使用zram提高交换空间

就这样了。这在 Fedora 上很容易。不同的发行版可能同样简单,只是包名和命令的细节可能不同。尝试计算机上的 zram 交换空间。在我的下一篇文章中,我将进一步演示一些 zram 选项。