zram是用cpu换减少swap i/o的压缩块设备,非内存扩容;需确认内核支持config_zram=y及lz4,加载模块后设disksize、算法、mkswap并swapon -p 100,配合调低vm.swappiness=10防颠簸,通过mm_stat和stats调优,用systemd服务开机启用。

zRAM 不是“给内存扩容”,而是用 CPU 换取更少的 swap I/O —— 对老机器(尤其是 SATA SSD 或 HDD、CPU 尚可但内存吃紧)效果明显,但盲目设大反而拖慢系统。
确认内核已启用 zRAM 支持
老机器常跑旧内核,得先验证是否内置支持。运行:
grep CONFIG_ZRAM /boot/config-$(uname -r)
必须看到 CONFIG_ZRAM=y,且最好有 CONFIG_ZRAM_LZ4=y(LZ4 压缩/解压快,对老 CPU 更友好)。若全为 CONFIG_ZRAM is not set,说明内核未编译 zRAM,modprobe zram 会失败,此时需升级内核或重编译。
即使配置存在,也需检查模块能否加载:
sudo modprobe zram num_devices=1
成功后应出现 /dev/zram0;若报 Module zram not found,说明模块未安装(常见于某些精简版 CentOS/RHEL 镜像),需装 kernel-modules-extra 或对应包。
设置 zRAM 设备并挂载为高优先级 swap
关键不是“能设多大”,而是“设多大才不抢真实内存”。zRAM 占用的是物理 RAM,压缩后存数据,但解压时仍要临时分配内存。对 4GB 内存的老服务器,建议初始值设为 1G(即物理内存的 25%):
echo 1G | sudo tee /sys/block/zram0/disksize<br>echo lz4 | sudo tee /sys/block/zram0/comp_algorithm<br>mkswap /dev/zram0<br>swapon -p 100 /dev/zram0
-p 100 确保它比所有磁盘 swap(默认优先级 0)先被使用。如果已有磁盘 swap,用 swapon --show 确认优先级顺序;若 zRAM 未排第一,先 swapoff 原 swap,再用 -p 100 启用 zRAM。
常见错误:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
echo 1G > /sys/block/zram0/disksize报-ENOMEM:物理内存不足或已被其他进程占满,需先释放缓存(sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches')或减小目标值(如改用768M) - 没设
comp_algorithm直接swapon:部分内核版本会 fallback 到低效算法(如 lzo),导致 CPU 占用飙升
避免 swap 颠簸:调整 vm.swappiness 和 zRAM 大小策略
老机器内存小,vm.swappiness=60(默认)太激进,容易把刚读进 cache 的页又压进 zRAM,徒增 CPU 开销。建议调低:
sudo sysctl vm.swappiness=10
这个值意味着:仅当可用内存低于约 10% 时,内核才开始积极 swap —— 给 page cache 留足空间,减少无谓压缩/解压循环。
zRAM 大小不是固定值。观察实际使用情况再调整:
- 看压缩率:
cat /sys/block/zram0/mm_stat中第 5 字段是「原始数据大小」,第 6 字段是「压缩后大小」,比值越接近 2.0 越理想 - 看命中率:
cat /sys/block/zram0/stats中num_reads和num_writes若长期接近,说明 zRAM 正在高频周转,可能偏小;若num_writes极低但num_reads高,说明压缩率好、复用强 - 若
num_writes持续 > 1000/s 且 CPU%sy(system time)超过 20%,说明 LZ4 已扛不住,要么换更轻量的lzo,要么减小 zRAM 容量、依赖磁盘 swap 承担冷数据
开机自动启用:用 systemd 服务而非 rc.local
rc.local 在现代 systemd 系统中不可靠,尤其涉及块设备初始化顺序。正确做法是写一个 service:
sudo tee /etc/systemd/system/zram-swap.service [Unit]<br>Description=Setup zRAM swap<br>After=multi-user.target<br><br>[Service]<br>Type=oneshot<br>ExecStart=/bin/sh -c 'echo 1G > /sys/block/zram0/disksize && echo lz4 > /sys/block/zram0/comp_algorithm && mkswap /dev/zram0 && swapon -p 100 /dev/zram0'<br>RemainAfterExit=yes<br><br>[Install]<br>WantedBy=multi-user.target<br>EOF
然后启用:sudo systemctl daemon-reload && sudo systemctl enable zram-swap。
注意:不要在 ExecStart 里写 modprobe —— 必须确保 zram 模块在 service 启动前已加载。推荐在 /etc/modules 中追加一行 zram,或用 modprobe.d 配置文件固化 num_devices=1。
最易被忽略的一点:zRAM 设备一旦初始化(disksize 写入后),多数参数就不可再改,包括大小和算法 —— 修改前必须先 echo 1 > /sys/block/zram0/reset,否则会返回 -EBUSY。










