zram与swap交换内存
介绍
zRAM 和传统的交换空间(Swap)都是 Linux 系统用来增加可用内存的技术,但它们的工作方式和使用场景有所不同。
一般来说,能用ZRAM更好,但是有些VPS的cpu配置不行那就不要开zram了。
-
ZRAM:
- 存储介质: zRAM 是一种压缩的 RAM 块设备,它使用内存本身来存储压缩的数据。
- 性能: zRAM 的读写速度远快于传统 Swap,因为它直接在 RAM 上操作。压缩和解压缩数据需要一定的 CPU 资源,但通常这种开销小于从硬盘读写数据的时间。
- 可靠性: 由于 zRAM使用的是 RAM,频繁的读写可能会对 RAM 的寿命造成影响,尽管实际影响非常小。
- 用途: zram 非常适合用于拥有有限 RAM 或需要快速交换区的设备,如嵌入式设备或旧计算机,也常用于Android设备。
-
传统交换空间(Swap):
- 存储介质: Swap 通常使用硬盘驱动器(HDD)或固态驱动器(SSD)作为交换区。
- 性能: 因为硬盘速度远慢于 RAM,使用 Swap 可能会显著减慢系统速度,尤其是在内存耗尽时。
- 可靠性: Swap 在不同的物理介质上,因此不会影响 RAM 的寿命。
- 用途: 在物理内存用完时,可以作为溢出区域,但由于速度慢,通常只适合非常低的内存压力。
zram
- 可以同时保留硬盘的 Swap 文件 / 分区,视内存而定,设置优先使用 ZRAM即可
- ZRAM 不会立刻占用设定的内存大小,它是动态分配的,设置的只是“上限”
-
安装
zram-tools1
2apt update
apt install zram-tools -
配置 zRAM 参数
默认的配置比较保守,可以修改配置文件以达到更好效果
打开配置文件:
1
nano /etc/default/zramswap
将文件内容修改为如下配置(或取消对应行的注释并修改):
1
2
3
4
5
6
7
8
9
10
11
12
13
14#可以查看自己系统还支持哪些压缩算法:cat /sys/block/zram0/comp_algorithm
# 压缩算法:推荐使用 zstd;也可以选择lz4,它比zstd速度快,但相应的压缩率更低
# zstd 在压缩率和解压速度之间取得了目前最好的平衡,是现代 Linux 的首选。
ALGO=zstd
# zRAM 分配的物理内存比例:建议设置为 50,这表示 zRAM 最多可以使用系统总物理内存的 50%(若物理内存 ≤ 512MB,50% 可能过大(CPU 负担重),可以试着改为 25%~30%)。
# 注意:这并不意味着它会立刻占用 50% 的内存,而是随着需要动态增长的上限。
PERCENT=50
# Swap 优先级:设置为最高优先级(比如 100)。
# 如果你的系统同时存在硬盘 Swap,这能确保系统优先使用 zRAM。
PRIORITY=100保存并退出(在 Nano 中按
Ctrl+O存盘,Enter确认,Ctrl+X退出)。应用更改并重启服务:
1
2systemctl restart zramswap
systemctl enable zramswap -
验证
使用以下命令查看当前的 Swap 状态:
1
swapon --show
你会看到类似下面的输出,注意
TYPE为partition,并且PRIO是100。1
2NAME TYPE SIZE USED PRIO
/dev/zram0 partition 488M 0B 100还可以使用
zramctl命令查看更详细的压缩统计信息:1
zramctl
输出示例:
1
2NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 488M 4K 73B 12K 2 [SWAP] -
进阶操作:参数调优
创建或编辑 sysctl 配置文件:
1
sudo nano /etc/sysctl.d/99-zram.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 1. 提高使用 Swap 的积极性 (默认通常是 60)
# 因为 zRAM 速度很快,我们希望系统更积极地把冷数据压缩到 zRAM 中,腾出物理内存给文件缓存。
# 推荐值:100 - 150 之间。
vm.swappiness = 100
# 2. 禁用页簇 (Page Cluster)
# 传统的 Swap 每次会连带读取相邻的内存页(因为磁盘顺序读取比随机读取快)。
# 但 zRAM 是在内存中操作,连带读取反而会增加 CPU 计算解压的负担。
# 将其设置为 0,表示每次只交换需要的页面。
vm.page-cluster = 0
# 3. 调整缓存压力阈值
# 稍微降低系统回收 VFS 缓存(目录和 inode)的倾向。
vm.vfs_cache_pressure = 50
# 提前触发后台内存回收,适度防止内存突发紧张(若 CPU 经常飙到 100%,可考虑调低到 30 或 20)
vm.watermark_scale_factor = 50
# 禁用水位提升,避免 kswapd 瞬间大量占用 CPU 进行压缩
vm.watermark_boost_factor = 0保存文件后,应用内核参数使其立即生效:
1
sysctl --system
-
删除
停止并禁用 zram 服务:
1
2sudo systemctl stop zramswap
sudo systemctl disable zramswap彻底卸载 zram-tools(可选,如果以后不再需要)
1
sudo apt remove --purge zram-tools
清理配置文件(可选)
1
sudo rm -f /etc/default/zramswap
-
参考与鸣谢
- https://www.vdj.me/archives/315.html
- https://www.nodeseek.com/post-726942-1
- https://www.nodeseek.com/post-69126-1
swap
创建swap交换分区
-
此命令将显示当前正在使用的所有交换分区及其相关信息,包括标签和 UUID。
1
sudo swapon --show
-
创建交换空间大小1G,可自行修改:
根据自己vps内存修改,2G以下建议实际内存2倍,2-4G建议1.5倍
1
sudo fallocate -l 1G /swapfile
-
授予权限
1
chmod 600 /swapfile
-
启用交换内存
1
2
3
4mkswap /swapfile
swapon /swapfile
#如果需要 显式设置低优先级,确保硬盘 Swap 始终排在 ZRAM 之后,即先使用ZRAM,可以设置优先级(此命令设置优先级为 10):swapon -p 10 /swapfile -
开机启用交换空间
1
2
3echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
#如果需要 显式设置低优先级,确保硬盘 Swap 始终排在 ZRAM 之后,即先使用ZRAM,可以设置优先级(此命令设置优先级为 10):echo '/swapfile none swap sw,pri=10 0 0' | sudo tee -a /etc/fstab
删除swap交换分区
-
此命令将显示当前正在使用的所有交换分区及其相关信息,包括标签和 UUID。
1
sudo swapon --show
-
关闭要删除的交换分区。 运行以下命令:
1
sudo swapoff -L {swap_label}
将 “{swap_label}” 替换为要删除的交换分区的标签。 如果您知道它的 UUID,请使用以下命令:
1
sudo swapoff -U {swap_uuid}
将 “{swap_uuid}” 替换为要删除的交换分区的 UUID。
-
删除交换分区文件。如果您使用的是文件作为交换分区的话,运行以下命令:
1
sudo rm {swap_file}
将 “{swap_file}” 替换为包含交换分区的文件路径和名称。
-
更新 /etc/fstab 文件。 打开 /etc/fstab 文件,并找到包含要删除的交换分区的行。 在此行上添加 “#” 符号(无引号),以将其注释掉,或者直接将该行从文件中删除。 保存更改。完成以上步骤后,即可成功删除指定的交换分区。


