首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

NixOS 上的 Swap、ZRAM、Zswap 和 Hibernate

摘要

Note: I'm going to NixCon 2026 , say hello if you're going as well! Oh no, I'm going to talk about swap, zram, zswap... Whether to use swap is a perennial fight online. The conversation is often muddl...

swap the use hibernate going for and The you when
2026-09-24 1 阅读 约7分钟阅读 speckx
分享:
字号:
注意:我要去 NixCon 2026,如果你也去的话,打个招呼!哦不,我要说的是swap、zram、zswap……是否使用swap是网上常年争论的话题。当人们将对服务器的建议与对工作站的建议混为一谈时,对话常常会变得混乱。就我而言,我将重点关注台式机和笔记本电脑。我使用交换是因为我喜欢先挂起后休眠,或者在 KDE 设置中“待机,然后休眠”: ![[粘贴图像 20260917120542.png]] 这将首先将 ACPI S3 挂起到 RAM,然后在延迟后进入 S4 休眠。我认为这达到了一个很好的平衡:如果我离开一会儿,我不必等待事情启动,但我也不必担心是否忘记完全关闭我的机器。要使用休眠,您需要交换来将系统状态保存到磁盘。让我们火上浇油吧 关于交换文件与交换分区也存在争论。我最想指出的是,交换文件会使休眠变得复杂。这是因为当您从休眠状态恢复时,initramfs 需要在安装文件系统之前知道交换空间的位置。在 UEFI 系统上,当休眠开始时,详细信息将保存到 EFI 变量中。我使用简单的交换分区设置桌面: swapDevices = [ {device = "/dev/disk/by-uuid/f2fc399a-9703-450b-88df-5671b776fc71";} ];我使用 LUKS 加密和交换文件设置了笔记本电脑: fileSystems."/.swapvol" = {​​ device = "/dev/disk/by-uuid/33682d1d-87c4-4166-8d3b-66d900387e42"; fsType = "btrfs";选项 = ["subvol=swap"]; }; ... swapDevices = [ { device = "/.swapvol/swapfile";大小=32*1024; } ];这是基于disco luks-btrfs-subvolumes 模板。好消息是,现在 NixOS 已经了解了休眠在交换文件上的细微差别,并且可以计算出偏移量。我当前使用的配置如果我要使用交换,我想确保我正确使用它。 《捍卫 Swap》一文和后续的《揭穿 zswap 和 zram 神话》提供了许多重要的背景信息。作为起点,Chris Down 建议使用 zswap 和磁盘支持的交换。所以我当前的配置很简单: boot.zswap.enable = true; boot.kernel.sysctl."vm.swappiness" = 100;是的,字面上就是这样。我喜欢这样一个事实:配置不长也不复杂。仅仅因为它只有几行,并不会降低它的重要性。为什么有这个特定的交换值? Swappiness 控制交换和文件系统分页的相对成本,因此它将取决于您的特定硬件。 Chris 建议,100 的 swappiness 在配备 SSD 的系统上效果很好,但“仅凭直觉调整此值并非易事”,您应该测试不同的值。内核文档对此表示同意,并表示您甚至可以在 SSD 上走得更高。然而,我还没有在任何地方找到关于如何测试和比较不同交换值的明确说明,特别是对于工作站的使用。如果您有任何建议,我将不胜感激。目前,100 对我的 SSD 来说效果很好。我一路上犯的错误 在阅读 Chris 的第二篇文章之前,我正在使用 zramSwap.enable,因为我认为这是他所提倡的。然而,我错了,事实恰恰相反。直到今年四月添加了 boot.zswap 后我才意识到这一点。澄清一下, zramSwap 就是通常所说的 zram 。使用基于磁盘的交换时,这可能不是您想要的。就我而言,我想要冬眠,所以这是错误的选择。在我意识到之后,我删除了 zramSwap.enable 并开始使用 boot.zswap : boot.initrd.systemd.enable = true; boot.zswap = { 启用 = true;压缩器=“lz4”; }; boot.kernel.sysctl."vm.swappiness" = 100;您会注意到 zswap 的压缩算法可以通过 boot.zswap.compressor 进行控制。 Linux 内核默认使用 lzo,因为它在速度和压缩之间取得了良好的平衡。而 NixOS 默认使用 zstd,原因是它具有最佳压缩比并且有利于 Nix 构建。直到最近我还在运行 lz4,它具有最快的压缩速度和最低的延迟。我在阅读了主要使用它作为压缩器的 ArchWiki 后做出了决定。实际上,当您处理内存溢出到磁盘时,压缩速度通常不是限制。更好的压缩比可以让您将更多页面放入内存中的压缩池中,从而减少对磁盘的使用。所以现在我使用 NixOS 默认的 zstd 。另外,当我添加配置 lz4 需要 boot.initrd.systemd.enable 。该设置现在默认为 true,因此我也可以删除该行。这样我们就只剩下两行配置了。我写了各种各样的项目、事件和想法,但它们都有一个共同点:我学到了一些东西,并想与他人分享我的经验。没有垃圾邮件,没有分享给第三方。只有你和我。
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱