banner
约 2,100 字
7 分钟

飞牛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 逻辑容量

配置里 PERCENT 算出来的那个数(比如 4.5G)——它相当于一个"虚拟硬盘"的标称大小

实际占用物理内存

写进去的数据压缩后占的内存,通常远小于逻辑容量

能塞多少数据

取决于数据本身的压缩率

举个例子:一个 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 文件:

bash
sudo nano /etc/fstab

找到下面这一行,在行首加个 # 注释掉:

纯文本
# /swapfile none swap sw 0 0

保存退出:先按 Ctrl + s 保存,再按 Ctrl + X 退出。

编辑 fstab 注释掉 swapfile

确认改好了没有:

bash
cat /etc/fstab

确认那行确实带 # 后,重启 NAS,让改动生效。

⚠️ 这一步有个容易被忽略的风险,务必留意:注释掉 swapfile 之后、zram 还没装起来的这段时间里,系统是完全没有任何交换空间的。这时候如果某个容器突然吃满内存,系统没有缓冲余地,可能直接触发 OOM 把进程杀掉——表现是"某个服务莫名其妙自己退出了"。

所以建议的做法是:尽量挑系统空闲的时候操作,并在重启前先把吃内存的大户(转码、下载)停掉;重启回来后尽快完成第二步。别在跑着重要任务的时候做这个改动。

另外提醒一句/etc/fstab 是系统级配置文件,改之前先执行一次 sudo cp /etc/fstab /etc/fstab.bak 留个备份。改错 fstab 可能导致系统起不来——虽然飞牛的配置比较简单,但备份的成本是零。

第二步:安装并配置 zram

重启回来后,依次执行以下命令:

bash
# 更新软件源
sudo apt update

# 安装 zram-tools
sudo apt install -y zram-tools

# 设置压缩算法和压缩比例
echo -e "ALGO=lzo-rle\nPERCENT=60" | sudo tee /etc/default/zramswap

# 重新加载配置
sudo service zramswap reload

# 重启服务
sudo systemctl restart zramswap.service

# 查看运行状态
systemctl status zramswap.service

# 验证 zram 是否生效
swapon --show

几个关键参数说明一下:

  • lzo-rle:压缩算法,速度和压缩率比较均衡。飞牛公测版目前只支持这个;如果你是内测用户,可以换成 zstd(压缩率更高,但对 CPU 要求也略高)。

  • 60:表示拿物理内存的 60% 来创建压缩空间。比如 4G 内存就会分出约 2.3G 的 zram 空间。

PERCENT 这个值怎么定?我的建议是别贪大。 它决定了 zram 这个"虚拟交换区"的容量上限,而放进去的数据终究要占物理内存。设得太高(比如 100%),理论容量是大了,但真到用满的时候,压缩数据本身会挤占掉大量可用内存,反而把你逼到更危险的状态。

实际经验值:4G 机器设 50-60%、8G 机器设 40-60% 都比较稳妥。原文这个 60% 是适合 8G 机器的值——如果你是 8G 内存、又跑了转码类服务,建议往 50% 调低一点,留出更多"不做压缩的余地"给大文件缓存。

配置 zram 服务

swapon --show 输出里该看什么? 正常生效会看到一行 /dev/zram0TYPEpartitionPRIO 通常是 100(比硬盘 swap 优先级高,说明系统会优先用它)。如果这一行没有出现,说明服务没起来——回去看 systemctl status zramswap.service 的具体报错。

实际效果

以我这台 8G 内存的 NAS 为例,开启后系统自动创建了大约 4.5GB 的 zram 压缩交换空间,算下来相当于 8G 变成了约 12.5G 的有效可用。

4G 内存的机器同理,开启后 zram 空间约 2.5GB,相当于 4G 变约 6.5GB

对 Docker 大户来说,多出来的这几 G"隐性内存",往往就是容器能不能再多开几个、系统会不会卡顿的关键差异。

想验证它到底有没有在工作,可以看这两个地方:

bash
# 看 zram 设备的使用情况(数据量、压缩前后体积)
cat /sys/block/zram0/mm_stat

# 看整体内存与交换空间
free -h

mm_stat 的各列依次是:原始数据大小、压缩后大小、已用内存、……"压缩后 / 原始"就是当前的实际压缩率。如果这个比值接近 1(比如 0.95),说明里面存的主要是压不动的数据(图片、视频),此时 zram 的收益就有限——这也印证了前面"它不适合当大文件缓存池"的结论。

如何卸载 zram 并还原?

万一用着不爽,或者想恢复出厂状态,反操作也很简单,三步搞定。

第一步:停止并卸载 zram 服务

bash
# 停止服务
sudo systemctl stop zramswap.service

# 禁用开机自启
sudo systemctl disable zramswap.service

# 卸载 zram-tools
sudo apt remove --purge -y zram-tools

第二步:恢复 swapfile

把之前注释掉的那行改回来。编辑 fstab:

bash
sudo nano /etc/fstab

把这行前面的 # 去掉,恢复成:

纯文本
/swapfile none swap sw 0 0

保存退出:Ctrl + s,再 Ctrl + X

第三步:重启并验证

重启 NAS,回来后确认 swapfile 已恢复:

bash
swapon --show

看到 /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/fstabzram-tools 的安装属于系统层面的改动,一般不会因为应用层升级而丢失。但大版本升级确实存在被覆盖的可能——建议把这份配置记在自己的笔记里,升级后跑一次 swapon --show 确认 zram 还在。"改完系统配置后留个记录",是自托管玩家最省事的一个习惯。

Q:8G 内存能靠这个方案开更多容器吗?

能,但要看容器类型。跑小服务(面板、监控、笔记同步、轻量 Web 应用)效果很好——它们的内存占用以文本和小对象为主,压缩率高。跑转码、AI 推理、大型数据库这类吃大块连续内存的服务,收益很有限——这些场景该加内存还是得加。别指望用 zram 撑起一台本该 16G 的机器。

END