标准的 NixOS 部署可能非常消耗资源,通常需要超过 1GB 的 RAM 才能在不遇到内存不足(OOM)错误的情况下完成系统重构。对于在资源受限的低端虚拟专用服务器(VPS)上运行的用户(例如仅有 512MB RAM),这些要求可能是一个巨大的障碍。通过积极优化内核和用户态组件,可以将空闲占用降低到约 96MB,并确保 `nixos-rebuild` 过程能在 512MB 的限制内成功完成。
优化过程从内核层面开始,通过剥离与 KVM 虚拟机无关的硬件支持。这包括将软驱、USB 设备和各种输入方法的驱动程序列入黑名单,并禁用内核剖析和审计线程。一个关键步骤涉及修剪内核模块树;通过使用自定义派生(derivation)来移除声音、GPU 和物理网卡的驱动程序,可以将磁盘上的模块树从 162MB 减少到 45MB。此外,禁用透明大页(THP)可以释放大量的预留内存——在某些测试中,仅通过降低 `vm.min_free_kbytes` 阈值,就释放了超过 50MB 的非缓存内存。
在用户态,通过将沉重的 systemd 服务替换为轻量级替代方案来节省内存。例如,用简单的 `resolv.conf` 替换 `systemd-resolved`(它占用约 8.3MB 的常驻内存),并用 `busybox ntpd` 单次任务计时器替换 `systemd-timesyncd`,可以减少持久内存开销。此外,为 SSH 启用套接字激活(socket activation)可确保 SSH 守护进程仅在建立活动连接时消耗内存。为了处理重构期间的内存峰值,系统可以使用带有 `zstd` 压缩的 `zram`,并配合特定的内核调优,如 `vm.swappiness = 180` 和调整后的 `watermark_scale_factor`,以确保内核优先压缩冷页面而非丢弃页面缓存。
虽然这些优化允许稳定的日常运行和标准更新,但它们也会引入特定的限制。最显著的限制是执行重大版本跳跃(例如从一个稳定版本移动到不稳定分支)的困难。由于这些跳跃在构建过程中可能导致巨大的峰值内存飙升,它们在 512MB 系统上仍可能触发 OOM 错误。在这种情况下,用户可能需要临时提供额外的 RAM 或分多个阶段执行更新,因为全版本跳跃所需的峰值内存可能会超过高度精简环境的容量。
