Debian/Ubuntu 开启 zRAM 内存压缩

Author Avatar
青枫 一天前
  • 在其它设备中阅读本文章

在运行内存较小的 VPS(如 512MB、1GB)、树莓派,或者老旧笔记本时,内存不足(OOM)是一个让人头疼的问题。传统的 Swap(交换分区)虽然能缓解内存压力,但磁盘 I/O 极其缓慢,会导致系统严重卡顿,并加速 SSD 的磨损。

本文将介绍一种现代且优雅的解决方案:zRAM。带你在 Debian/Ubuntu 系统上,以 业界最佳实践 的方式配置和调优 zRAM。


什么是 zRAM?为什么需要它?

zRAM 是 Linux 内核的一个模块,它会在内存中划出一块区域作为虚拟的 Swap 分区。当系统内存紧张时,操作系统不会把数据写到缓慢的硬盘上,而是 将内存数据压缩后存放在 zRAM 中 。需要使用时再解压出来。

核心优势:

  1. 速度极快: 内存的读写速度远超 NVMe SSD 和 HDD。
  2. 保护硬盘: 大幅减少对硬盘的频繁读写,延长 SSD 和 SD 卡寿命。
  3. 提升容量: 凭借现代压缩算法(如 zstd),1GB 的物理内存通常可以存放 2GB~3GB 的压缩数据。

最佳实践配置指南

网上有很多通过自定义脚本开启 zRAM 的教程,但这往往不够稳定。在 Debian/Ubuntu 下,最佳实践是使用官方源中提供的 zram-tools,并配合内核参数调优。

步骤 1:安装 zram-tools

首先,更新软件包列表并安装 zram-tools

apt update
apt install zram-tools -y

步骤 2:配置 zRAM 参数

安装完成后,默认的配置比较保守。我们需要修改配置文件以达到最佳效果。

打开配置文件:

nano /etc/default/zramswap

将文件内容修改为如下配置(或取消对应行的注释并修改):

# 压缩算法:强烈建议使用 zstd。
# zstd 在压缩率和解压速度之间取得了目前最好的平衡,是现代 Linux 的首选。
ALGO=zstd

# zRAM 分配的物理内存比例:建议设置为 50。
# 这表示 zRAM 最多可以使用系统总物理内存的 50%。
# 注意:这并不意味着它会立刻占用 50% 的内存,而是随着需要动态增长的上限。
PERCENT=50

# Swap 优先级:设置为最高优先级(比如 100)。
# 如果你的系统同时存在硬盘 Swap,这能确保系统优先使用 zRAM。
PRIORITY=100

保存并退出(在 Nano 中按 Ctrl+O 存盘,Enter 确认,Ctrl+X 退出)。

应用更改并重启服务:

systemctl restart zramswap
systemctl enable zramswap

步骤 3:验证 zRAM 是否生效

使用以下命令查看当前的 Swap 状态:

swapon --show

你会看到类似下面的输出,注意 TYPEpartition,并且 PRIO100

NAME       TYPE       SIZE USED PRIO
/dev/zram0 partition  488M   0B  100

还可以使用 zramctl 命令查看更详细的压缩统计信息:

zramctl

输出示例:

NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd          488M   4K   73B   12K       2 [SWAP]

进阶操作:内核参数调优

开启了 zRAM 后,Swap 变成了高速内存。因此,传统的 Linux 针对硬盘 Swap 设定的内核参数就不再适用了。需要对其进行调优。

创建或编辑 sysctl 配置文件:

sudo nano /etc/sysctl.d/99-zram.conf

填入以下 最佳实践参数

# 1. 提高使用 Swap 的积极性 (默认通常是 60)
# 因为 zRAM 速度很快,我们希望系统更积极地把冷数据压缩到 zRAM 中,腾出物理内存给文件缓存。
# 推荐值:100 - 150 之间。
vm.swappiness = 150

# 2. 禁用页簇 (Page Cluster)
# 传统的 Swap 每次会连带读取相邻的内存页(因为磁盘顺序读取比随机读取快)。
# 但 zRAM 是在内存中操作,连带读取反而会增加 CPU 计算解压的负担。
# 将其设置为 0,表示每次只交换需要的页面。
vm.page-cluster = 0

# 3. 调整缓存压力阈值
# 稍微降低系统回收 VFS 缓存(目录和 inode)的倾向。
vm.vfs_cache_pressure = 50

保存文件后,应用内核参数使其立即生效:

sysctl --system

常见问题解答 (FAQ)

Q1:我还需要保留硬盘的 Swap 文件 / 分区吗?
答: 根据你的内存大小决定。如果你的内存极小(< 1GB),建议保留少量的硬盘 Swap 以防万一(内核会自动优先使用 zRAM)。如果内存 > 2GB,通常建议直接关闭硬盘 Swap(使用 sudo swapoff -a 然后在 /etc/fstab 中注释掉),完全依靠 zRAM。

Q2:开启 zRAM 会导致 CPU 占用过高吗?
答: 现代 CPU(即使是树莓派的 ARM 芯片)处理 zstd 压缩的开销微乎其微。相比于内存不足时频繁读写硬盘导致的 IO 阻塞死机,消耗一点点 CPU 性能换取系统流畅度是绝对划算的。

Q3:zRAM 会立刻占用我设定的内存大小吗?
答: 不会。它是动态分配的。设置的只是“上限”(例如系统内存的 50%),里面没有数据时,它几乎不占用你的物理内存。

总结

在 Debian/Ubuntu 上开启并调优 zRAM,是极具性价比的系统优化手段。通过 zram-tools 配合 zstd 算法,并修改 swappinesspage-cluster 两个关键内核参数,你可以让小内存机器焕发第二春,让大内存机器装下更多的应用。