Tuesday, March 4, 2025

另一种增大内存的方法—zRAM—适合CPU性能过剩但RAM少,硬盘读写不佳(或容量小)的鸡鸡

 https://www.nodeseek.com/post-69126-1

前言

之前在玩幻兽帕鲁,自己用了一个 8核8g 的服务器搭了一个服务器,但是我发现 RAM 只有8g是不够用的,分分钟爆了(这游戏内存泄漏是真的严重。。。。 ac05 )所以就想到了用 Swap 增大内存容量,但是由于我使用的服务器的硬盘用的甚至是机械硬盘,I/O速度堪忧。而 CPU 是8核的,跑分也还行,不压榨白不压榨,所以就想到了用 zRAM 增大内存了。这里以 Debian 系为例,记录一下 zRAM 的开启、挂载、使用、与卸载命令。

具体环境

OS: Debian 12

zRAM 和 Swap 区别

zRAM 和传统的交换空间(Swap)都是 Linux 系统用来增加可用内存的技术,但它们的工作方式和使用场景有所不同。

传统交换空间(Swap):

  • 存储介质: Swap 通常使用硬盘驱动器(HDD)或固态驱动器(SSD)作为交换区。
  • 性能: 因为硬盘速度远慢于 RAM,使用 Swap 可能会显著减慢系统速度,尤其是在内存耗尽时。
  • 可靠性: Swap 在不同的物理介质上,因此不会影响 RAM 的寿命。
  • 用途: 在物理内存用完时,可以作为溢出区域,但由于速度慢,通常只适合非常低的内存压力。

zRAM:

  • 存储介质: zRAM 是一种压缩的 RAM 块设备,它使用内存本身来存储压缩的数据。
  • 性能: zRAM 的读写速度远快于传统 Swap,因为它直接在 RAM 上操作。压缩和解压缩数据需要一定的 CPU 资源,但通常这种开销小于从硬盘读写数据的时间。
  • 可靠性: 由于 zRAM使用的是 RAM,频繁的读写可能会对 RAM 的寿命造成影响,尽管实际影响非常小。
  • 用途: zram 非常适合用于拥有有限 RAM 或需要快速交换区的设备,如嵌入式设备或旧计算机,也常用于Android设备。

总结:

zRAM 提供了一种在不增加物理内存的情况下增加有效内存容量的方式,通过在 RAM 中创建一个压缩块设备来实现。

传统的交换空间(Swap)是硬盘上的一部分,当系统的物理内存不足时,用作虚拟内存使用。

zram 特别适合于内存较小的系统,因为它可以以较小的性能开销增加一些“虚拟”的内存,虽然这会增加 CPU 的负担。

传统 Swap 则适用于有足够硬盘空间且内存压力不是非常大的情况,特别是当系统负载不高,但偶尔需要更大内存时。

最佳实践可能是将 zRAM 和传统 Swap 结合起来使用,以获得更灵活和更优化的性能。在内存紧张时,zRAM 可以提供更快的数据交换,而在 zRAM 也用尽时,传统 Swap 可以作为最后的备份。

开启/加载 zRAM 模块

zRAM 是 Linux 内核的模块,需要使用 modprobe 命令加载 zRAM 模块。具体为 modprobe zram num_devices=1 。

zRAM 模块的参数为num_devices,zram num_devices=1 表示创建一个设备文件,该文件将会保存在设备目录,文件名称是 /dev/zram0。

这里,如果 num_devices 的数值不等于 1,内核就会创建多个 zram 文件,具体为: /dev/zram{0,1,2,3...}。

为了检查 zRAM 是否开启,我们需要使用 lsmod 命令 :使用 lsmod | grep zram 确认是否成功加载,如果成功开启,将会打印类似这样的消息

zram                   40960  2
zsmalloc               32768  1 zram

完整命令:

sudo modprobe zram num_devices=1
lsmod  | grep zram

开机自动开启/加载 zRAM 模块

modprobe 加载的模块仅在当前运行时可用,重新启动计算机后,会消失。为了自动加载 zRAM 模块,需要创建内核模块载入文件和模块的配置文件。

载入 zRAM 模块。需要在 /etc/modules-load.d/ 目录创建文件 zram.conf,运行命令 echo "zram" | sudo tee -a /etc/modules-load.d/zram.conf

然后创建模块的配置文件 zram.conf。这个文件需要在目录 /etc/modules-load.d/,运行命令 echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf 。

完整命令:

echo "zram" | sudo tee -a /etc/modules-load.d/zram.conf

echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf

配置 zRAM

通常 zRAM 最常见的配置是大小 disksize 和压缩算法 comp_algorithm。

控制 zRAM 的大小的文件是 /sys/block/zram0/disksize ,压缩算法文件是 /sys/block/zram0/comp_algorithm 。

可以运行 cat 命令查看两个文件来确定 zRAM 文件的大小和压缩算法,例如命令 cat /sys/block/zram0/disksize 查看 zRAM 大小。(zRAM 大小以实际 RAM 的 1-1.5倍 为宜,当然可以更大)

同样也可以通过两个文件设置 zRAM 文件的大小和压缩算法,例如命令 echo "8G" | sudo tee /sys/block/zram0/disksize 修改 zRAM 的大小。(对于压缩算法这里推荐zstd压缩算法,各种算法区别具体可以Google)

注意: 请务必先选择压缩算法再选择 zRAM 文件大小,不然会出现设备繁忙的问题,也就是无法修改压缩算法了,需要卸载 zRAM 后重新配置。

完整命令:

cat /sys/block/zram0/disksize
cat /sys/block/zram0/comp_algorithm

echo "zstd" | sudo tee /sys/block/zram0/comp_algorithm
echo "8G" | sudo tee /sys/block/zram0/disksize

自动进行 zRAM 配置

由于 /sys 目录是基于内存的文件系统,因此同样的,重启系统后,我们设置的 zRAM 参数将不再存在。为了实现开机自动加载 zRAM 的参数,需要使用 udev 进行设置。

udev 是一个用户空间系统(我的理解是,它就是 Linux 设备管理器)。它使操作系统管理员能够为设备事件运行用户指定的程序或者脚本,也可以在添加设备时指定设备参数。

要设置 zRAM 的大小,可以在 udev 规则文件的 ATTR 指定 zRAM 大小 disksize,ATTR{disksize}="8G" 表示设置 zRAM 的大小是 8G。

要设置 zRAM 的其它属性,可以在 udev 规则文件指定多个 ATTR 属性设置设备参数。例如设置 zRAM 压缩算法 ,可以添加属性 ATTR{comp_algorithm}="zstd"。

完整命令:

echo 'KERNEL=="zram0", ATTR{disksize}="8G",TAG+="systemd"' | sudo tee  /etc/udev/rules.d/99-zram.rules

echo 'KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="8G", TAG+="systemd"' | sudo tee  /etc/udev/rules.d/99-zram.rules

挂载 zRAM

要在当前运行时挂载 zRAM ,使用方式类似于 Swap 。首先需要将 zRAM 文件进行格式化,运行命令 sudo mkswap /dev/zram0 。

当格式化完成后,为了让系统识别 zRAM 文件,因此还需要启用 zRAM 文件。可以运行命令 sudo swapon /dev/zram0 启用 zRAM 文件。

如果你系统已经存在 Swap ,那么总的交换空间的大小是zRAM的大小加 Swap 的大小。

完整命令:

sudo mkswap /dev/zram0
sudo swapon /dev/zram0

自动挂载 zRAM

同样的,为了避免重启后 zRAM 没有自动挂载,我们需要使用 systemd 命令,在系统启动时自动激活 zRAM 文件并作为交换空间挂载。

使用你喜欢的方式创建文件 /etc/systemd/system/zram.service 并且编辑它。由于我是 vim 党,所以这里我使用vim 创建并编辑文件 SystemD 单元文件。

编辑完成后,保存文件并退出 vim 编辑器,然后运行命令 sudo systemctl enable zram 启用 zram 服务,最后重启计算机。

完整命令:

sudo vim /etc/systemd/system/zram.service
sudo systemctl enable zram

zram.service内容:

[Unit]
Description=Swap with zram
After=multi-user.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon /dev/zram0
ExecStop=/sbin/swapoff /dev/zram0

[Install]
WantedBy=multi-user.target

停止并禁用 zram 的服务

说完了基本使用,接下俩就要讲讲停用与卸载。(我最讨厌那些讲了怎么使用但是不讲怎么卸载的教程了,让我觉得体验很差想要卸载的时候不知道自己卸载是否彻底,让我这个对硬盘有极端控制欲的人很难受 ac05 )

我们上面将 zram 作为服务运行,所以可以通过 systemd 进行控制。以下命令可以停止并禁用 zram 服务:

sudo systemctl stop zramswap.service
sudo systemctl disable zramswap.service

卸载 zram 模块

可以使用 rmmod命令完全卸载zram模块。首先,确保没有任何 zram 设备在使用中:

sudo swapoff /dev/zram0

然后,卸载 zram 内核模块:

sudo rmmod zram

移除/注释相关的 fstab 条目

如果 /etc/fstab 文件中有关于 zram 的条目,应该将其注释掉或删除。打开 /etc/fstab 文件:

sudo vim /etc/fstab

找到类似下面的行:

/dev/zram0 none swap defaults 0 0

将其注释掉(在行首添加 #)或删除。

参考文献

好多前人的智慧,这里略了 xhj007
【Linux内核工具】zram的开启、挂载与使用

==========================================================

一键开启 zram 内存脚本,解决硬盘读写不佳 (或容量小) 的鸡鸡


https://blog.taoshuge.eu.org/p/422/

系统:debian12,claw-jp 测试通过

前言

根据友佬 @crzax 的帖子 https://www.nodeseek.com/post-69126-1

制作的一键开启 zram 脚本

脚本

curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/zram_manager.sh && chmod +x zram_manager.sh && ./zram_manager.sh

预览:

===== zRAM 管理工具 =====
1. 安装并配置zRAM
2. 卸载zRAM
3. 查看系统状态
4. 验证zRAM运行状态
0. 退出
请选择操作 [0-4]: 

查看状态:

===== 系统状态 =====

>> 物理内存大小:0GB

>> SWAP状态:
NAME       TYPE       SIZE USED PRIO
/swapfile  file      1024M   0B   -2
/dev/zram0 partition  923M   0B  100

>> 块设备信息:
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
zram0   252:0    0  923M  0 disk [SWAP]
vda     254:0    0   20G  0 disk 
├─vda1  254:1    0 19.9G  0 part /
├─vda14 254:14   0    3M  0 part 
└─vda15 254:15   0  124M  0 part /boot/efi

>> zRAM压缩算法:
lzo lzo-rle lz4 lz4hc [zstd] 

>> zRAM大小:
923MB

>> 内存使用情况:
               total        used        free      shared  buff/cache   available
Mem:           923Mi       266Mi       685Mi       496Ki        82Mi       657Mi
Swap:          1.9Gi          0B       1.9Gi

按回车键继续...

解释:

  • /swapfile file 1024M 0B -2
  • /dev/zram0 partition 923M 0B 100
  • 默认使用 zstd 算法

100 代表最高优先级,优先使用 zram

swap+zram 的总和是 1.9G 大小

测压

安装 stress 工具

sudo apt install stress

测试

stress --vm 1 --vm-bytes 1G --timeout 60s

这将启动一个 stress 进程,它会尝试分配 1GB 的内存并保持该状态持续 60 秒

因为我的物理内存是 1G, 所以我使用 1G 测试,当 zram 耗尽时,就会启用 swap

可以另外开一个窗口,使用 top 命令查看系统状态

分析

zramctl --output-all

结果

root@s26417:~# zramctl --output-all
NAME       DISKSIZE  DATA COMPR ALGORITHM STREAMS ZERO-PAGES TOTAL MEM-LIMIT MEM-USED MIGRATED MOUNTPOINT
/dev/zram0       1G 61.4M  9.6M zstd            1       4326 10.5M        0B    13.2M     1.3K [SWAP]
root@s26417:~# 

分析

从数据可以看出:
压缩效果很好:61.4MB 的数据压缩后只占用 9.6MB,压缩率约为 6.4:1
这个 zram 设备被配置为交换分区使用
系统实际使用了 13.2MB 内存来管理这个 zram 设备
这表明 zram 正在有效地工作,通过内存压缩来提供额外的交换空间。

完结


No comments:

YouTube Channel