飞牛NAS内存压缩实战:8G内存秒变12.5G,小内存NAS的免费扩容方案
摘要
飞牛NAS近期上线了基于 zram 的内存压缩功能,通过将不活跃数据压缩后保留在内存中而非写入硬盘交换分区,有效缓解小内存NAS的内存瓶颈。本文详细介绍了该功能的适用场景、完整开启步骤、实际效果,以及完整的卸载还原教程。无需加装物理内存,零成本提升系统流畅度。
前言
折腾 NAS 的朋友应该都有这个体会——Docker 容器越装越多,影视服务、下载工具一开,内存条就开始捉襟见肘。尤其是 4G、8G 内存的机器,跑着跑着系统就开始卡顿,打开个管理页面都要转半天圈。
好消息是,飞牛 NAS(fnOS)最近终于上了**"内存压缩"功能**。它不用你花钱加内存条,纯软件层面就能把可用内存"撑大"不少。今天我就手把手教你把它开起来,看看小内存 NAS 怎么免费"扩容"。
原理:一句话说清内存压缩
内存压缩的原理,一句话就能说清楚:
系统把暂时不活跃的数据压缩后继续放在内存里,而不是丢到硬盘的交换分区去。
为什么要这么做?因为内存的读写速度比硬盘快了不止一个数量级。与其把不用的数据写到慢吞吞的硬盘 swap,不如在内存里用 CPU 算力压缩一下、原地放好。等要用的时候再解压回来。这么一搞,系统卡顿会明显减少,多任务切换也更流畅——毕竟从内存解压比从硬盘读回来快太多了。
简单说就是:拿一点 CPU 算力,换更大的有效内存和更流畅的体验。
先把"扩容"这件事说准确
网上讲内存压缩的文章,常见一句"8G 变 12.5G",这话对,但容易让人产生误解——好像凭空多了 4.5G 物理内存。实际情况值得花两分钟搞清楚,否则你对它的预期会跑偏。
zram 到底是什么? 它是 Linux 内核提供的一个内存块设备:系统划出一块"逻辑上等于磁盘上的交换分区"的空间,但这块空间实际存放在内存里。往它写数据时,内核先把数据压缩,再把压缩后的结果存在内存中。
所以关键在于压缩率:
概念 | 含义 |
|---|---|
zram 逻辑容量 | 配置里 |
实际占用物理内存 | 写进去的数据压缩后占的内存,通常远小于逻辑容量 |
能塞多少数据 | 取决于数据本身的压缩率 |
举个例子:一个 4.5G 的 zram,实际可能只占用 1.5-2G 物理内存,因为它装的是压缩后的内容。所以"12.5G"是"等效可用空间"的说法,不是说你的物理内存真的变成了 12.5G。
压缩率取决于存的是什么。 文本、日志、代码、JSON 这类结构化数据压缩比很高(3-5 倍很常见);而已经压缩过的数据——图片、视频、压缩包、加密文件——几乎压不动。这带来一个很实际的结论:
zram 适合"吃内存但不吃带宽"的场景(比如多个小容器的运行时、数据库缓存、系统缓存),不适合当"大文件缓存池"。如果你 NAS 上跑的是影音转码类的服务,缓存里全是视频数据,那 zram 基本帮不上忙——因为压不动。
它和另外两个概念的区别,顺便理一下:
方案 | 数据放在哪 | 特点 |
|---|---|---|
swapfile / swap 分区 | 硬盘 | 容量大、速度慢,这就是我们想避免的 |
zram(本文方案) | 内存(压缩后) | 速度快、容量受内存限制 |
zswap | 内存 + 硬盘 | 先压缩放内存,不够再落到硬盘,多一层缓冲 |
哪些人适合开?
先对号入座,看看你的内存情况该不该折腾:
内存大小 | 建议 |
|---|---|
4GB | 强烈建议开,效果立竿见影 |
8GB | 推荐开启 |
16GB(跑了很多 Docker/虚拟机) | 可以开 |
32GB 以上、日常占用不到 50% | 不建议,感知不到差别,还白耗一点 CPU |
还有一种情况建议先别开:内存长期爆满、swap 一直在被频繁读写。这种状态说明你的实际需求已经超过了机器能力,压缩只能缓解、不能解决——就像把箱子里的衣服叠得更紧一点,箱子还是那个箱子。这种情况该考虑的是加内存或者减服务,别指望 zram 续命。
开启教程
目前飞牛还没给内存压缩做可视化 UI,需要进终端用命令行操作,用 SSH 连接飞牛 NAS 执行下面的命令。
第一步:禁用默认的 swapfile
先别急着装 zram,要把系统自带的硬盘交换分区关掉,不然它跟 zram 会"打架"。
编辑 fstab 文件:
找到下面这一行,在行首加个 # 注释掉:
保存退出:先按 Ctrl + s 保存,再按 Ctrl + X 退出。

确认改好了没有:
确认那行确实带 # 后,重启 NAS,让改动生效。
⚠️ 这一步有个容易被忽略的风险,务必留意:注释掉 swapfile 之后、zram 还没装起来的这段时间里,系统是完全没有任何交换空间的。这时候如果某个容器突然吃满内存,系统没有缓冲余地,可能直接触发 OOM 把进程杀掉——表现是"某个服务莫名其妙自己退出了"。
所以建议的做法是:尽量挑系统空闲的时候操作,并在重启前先把吃内存的大户(转码、下载)停掉;重启回来后尽快完成第二步。别在跑着重要任务的时候做这个改动。
另外提醒一句:
/etc/fstab是系统级配置文件,改之前先执行一次sudo cp /etc/fstab /etc/fstab.bak留个备份。改错 fstab 可能导致系统起不来——虽然飞牛的配置比较简单,但备份的成本是零。
第二步:安装并配置 zram
重启回来后,依次执行以下命令:
几个关键参数说明一下:
lzo-rle:压缩算法,速度和压缩率比较均衡。飞牛公测版目前只支持这个;如果你是内测用户,可以换成zstd(压缩率更高,但对 CPU 要求也略高)。60:表示拿物理内存的 60% 来创建压缩空间。比如 4G 内存就会分出约 2.3G 的 zram 空间。
PERCENT这个值怎么定?我的建议是别贪大。 它决定了 zram 这个"虚拟交换区"的容量上限,而放进去的数据终究要占物理内存。设得太高(比如 100%),理论容量是大了,但真到用满的时候,压缩数据本身会挤占掉大量可用内存,反而把你逼到更危险的状态。实际经验值:4G 机器设 50-60%、8G 机器设 40-60% 都比较稳妥。原文这个 60% 是适合 8G 机器的值——如果你是 8G 内存、又跑了转码类服务,建议往 50% 调低一点,留出更多"不做压缩的余地"给大文件缓存。

swapon --show输出里该看什么? 正常生效会看到一行/dev/zram0,TYPE是partition,PRIO通常是 100(比硬盘 swap 优先级高,说明系统会优先用它)。如果这一行没有出现,说明服务没起来——回去看systemctl status zramswap.service的具体报错。
实际效果
以我这台 8G 内存的 NAS 为例,开启后系统自动创建了大约 4.5GB 的 zram 压缩交换空间,算下来相当于 8G 变成了约 12.5G 的有效可用。
4G 内存的机器同理,开启后 zram 空间约 2.5GB,相当于 4G 变约 6.5GB。
对 Docker 大户来说,多出来的这几 G"隐性内存",往往就是容器能不能再多开几个、系统会不会卡顿的关键差异。
想验证它到底有没有在工作,可以看这两个地方:
bash
mm_stat的各列依次是:原始数据大小、压缩后大小、已用内存、……"压缩后 / 原始"就是当前的实际压缩率。如果这个比值接近 1(比如 0.95),说明里面存的主要是压不动的数据(图片、视频),此时 zram 的收益就有限——这也印证了前面"它不适合当大文件缓存池"的结论。
如何卸载 zram 并还原?
万一用着不爽,或者想恢复出厂状态,反操作也很简单,三步搞定。
第一步:停止并卸载 zram 服务
第二步:恢复 swapfile
把之前注释掉的那行改回来。编辑 fstab:
把这行前面的 # 去掉,恢复成:
保存退出:Ctrl + s,再 Ctrl + X。
第三步:重启并验证
重启 NAS,回来后确认 swapfile 已恢复:
看到 /swapfile 出现在输出里,就说明还原成功了。
小提示:卸载后建议跑一下
free -h看看内存状态,确保交换分区正常挂载、没有残留的 zram 设备。如果swapon --show里还能看到 zram,手动执行sudo swapoff /dev/zram0关掉它就行。注意还原的顺序和开启时是相反的:开启时先关硬盘 swap 再装 zram,还原时要先停 zram、再恢复 swapfile。中间同样会有一小段"没有交换空间"的窗口,所以还是那句——挑空闲时间做,重启前别跑重负载任务。
小结
内存压缩本质上是拿 CPU 算力换内存空间,所以开启后 CPU 负载会略微上升——但换来的是系统流畅度的大幅提升,绝对值。它当然不能替代真正的物理内存升级,但对小内存 NAS 来说,这绝对是零成本的最优解。如果你那台 4G/8G 的小 NAS 也经常卡,不妨照这篇开一下,感受会非常直观。
常见问题
Q:开启后 CPU 占用变高了,正常吗?
正常,这是它的工作原理决定的——压缩和解压都要 CPU 参与。轻微上升(几个百分点)是预期内的。但如果 CPU 长期被压满、系统反而更卡了,说明你把 PERCENT 设得太高、或者里面存的数据压缩收益太低,建议调低比例或者干脆关掉。
Q:能不能只装 zram、不停用原来的 swapfile?
不推荐。两者并存时,系统会按优先级选用交换空间,可能出现"数据被写进慢速硬盘 swap 而不是快速的 zram",等于白折腾。要么用 zram、要么用硬盘 swap,别混着来——这也是原文第一步要先注释掉 swapfile 的原因。
Q:飞牛系统升级后,这些配置会丢吗?
/etc/fstab 和 zram-tools 的安装属于系统层面的改动,一般不会因为应用层升级而丢失。但大版本升级确实存在被覆盖的可能——建议把这份配置记在自己的笔记里,升级后跑一次 swapon --show 确认 zram 还在。"改完系统配置后留个记录",是自托管玩家最省事的一个习惯。
Q:8G 内存能靠这个方案开更多容器吗?
能,但要看容器类型。跑小服务(面板、监控、笔记同步、轻量 Web 应用)效果很好——它们的内存占用以文本和小对象为主,压缩率高。跑转码、AI 推理、大型数据库这类吃大块连续内存的服务,收益很有限——这些场景该加内存还是得加。别指望用 zram 撑起一台本该 16G 的机器。