標準的なNixOSのデプロイはリソースを消費することが多く、Out-Of-Memory (OOM) エラーに遭遇せずにシステムのリビルドを完了させるには、多くの場合1GB以上のRAMが必要となります。512MBのRAMなど、限られたリソースしか持たない低スペックの仮想プライベートサーバー(VPS)を実行するユーザーにとって、これらの要件は大きな障壁となる可能性があります。カーネルとユーザーランドのコンポーネントを積極的に最適化することで、アイドル時のフットプリントを約96MBまで削減し、512MBの制限内で`nixos-rebuild`プロセスを正常に完了させることが可能になります。
最適化プロセスは、KVMゲストにとって無関係なハードウェアサポートを削り取るカーネルレベルから始まります。これには、フロッピーディスク、USBデバイス、および様々な入力方法のドライバーをブラックリストに入れることや、カーネルプロファイリングおよび監査スレッドを無効にすることが含まれます。重要なステップとして、カーネルモジュールツリーの整理があります。カスタム派生(derivation)を使用して、サウンド、GPU、および物理NICのドライバーを削除することで、ディスク上のモジュールツリーを162MBから45MBに削減できます。さらに、Transparent Huge Pages (THP) を無効にすることで、かなりの量の予約メモリを解放できます。一部のテストでは、`vm.min_free_kbytes`のしきい値を下げることで、これだけで50MB以上の非キャッシュメモリが解放されました。
ユーザーランドでは、重いsystemdサービスを軽量な代替手段に置き換えることでメモリを節約します。例えば、`systemd-resolved`(約8.3MBのレジデントメモリを使用)を単純な`resolv.conf`に置き換え、`systemd-timesyncd`を`busybox ntpd`のワンショットタイマーに置き換えることで、永続的なメモリオーバーヘッドを削減します。さらに、SSHのソケットアクティベーションを有効にすることで、SSHデーモンがアクティブな接続が確立された時のみメモリを消費するようにします。リビルド中のメモリスパイクに対処するために、システムは`zstd`圧縮を伴う`zram`を使用でき、これに`vm.swappiness = 180`や調整された`watermark_scale_factor`などの特定のカーネルチューニングを組み合わせることで、カーネルがページキャッシュを破棄するのではなく、コールドページを圧縮することを優先するようにします。
これらの最適化により、安定した日常的な運用と標準的なアップデートが可能になりますが、特定の制限も導入されます。最も顕著な制約は、メジャーリリースのジャンプ(例:ある安定リリースから不安定ブランチへの移行)を実行することの難しさです。これらのジャンプはビルドプロセス中に大規模なピークメモリスパイクを引き起こす可能性があるため、512MBのシステムでは依然としてOOMエラーを誘発する可能性があります。そのような場合、ユーザーは一時的に追加のRAMを提供するか、複数の段階に分けてアップデートを実行する必要があるかもしれません。なぜなら、フルリリースのジャンプに必要なピークメモリは、高度に削り取られた環境の容量を超える可能性があるためです。
