HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

NixOSにおけるスワップ、ZRAM、Zswap、およびハイバネーション

Swap, ZRAM, Zswap and Hibernate on NixOS (blog.matthewbrunelle.com)

55 pointsby speckx15 コメント

要約

この記事は、NixOS環境におけるスワップ、ZRAM、Zswap、およびハイバネーションの設定について解説しています。著者は、デスクトップやラップトップでの「サスペンド・アンド・ハイバネート」機能のためにスワップを利用しており、スワップファイルとパーティションの違い、ハイバネーション時の注意点、そしてNixOSでの具体的な設定方法を共有しています。特に、zswapの有効化とswappinessの値設定に焦点を当て、自身の経験に基づいた設定の変遷と推奨設定を紹介しています。

全文翻訳

NixOSにおけるSwap、ZRAM、Zswap、およびハイバネーション

この記事は、私の非自明なNixOS設定の断片から独立させたものです。

注: 私はNixCon 2026に参加します。もし参加される方がいれば、ぜひ声をかけてください!

ああ、スワップ、zram、zswapについて話すことになるなんて…

スワップを使うべきかどうかは、オンラインで常に議論の的となります。サーバー向けとワークステーション向けの推奨事項を混同すると、議論はしばしば混乱します。私の場合は、デスクトップとラップトップに焦点を当てます。

私は、KDEの設定にある「サスペンド・トゥ・ハイバネーション」、または「スタンバイ、そしてハイバネーション」を使用するためにスワップを使っています。

![[画像: KDEの設定画面で「サスペンド・トゥ・ハイバネーション」が選択されている様子]]

これはまず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";
    options = ["subvol=swap"];
  };
  
  ... 
    swapDevices = [
    {
      device = "/.swapvol/swapfile";
      size = 32 * 1024;
    }
  ];

これはdiskoのluks-btrfs-subvolumesテンプレートに基づいています。

良いニュースは、NixOSはしばらく前からスワップファイル上でのハイバネーションのニュアンスを理解しており、オフセットの特定を処理できるようになったことです。


現在使用している設定

スワップを使用するなら、正しく使いたいものです。In Defence of Swapという記事とその続編であるDebunking zswap and zram mythsは、多くの重要な文脈を提供しています。出発点として、Chris Downはディスクベースのスワップとzswapの併用を推奨しています。

したがって、私の現在設定は非常にシンプルです。

  boot.zswap.enable = true;
  boot.kernel.sysctl."vm.swappiness" = 100;

はい、文字通りこれだけです。設定が長くて複雑でないところが気に入っています。数行だからといって、その重要性が低いわけではありません。

なぜその特定のswappiness値なのか? Swappinessは、スワッピングとファイルシステムページングの相対的なコストを制御するため、特定のハードウェアに依存します。Chrisは、SSDを搭載したシステムではswappiness 100がうまく機能すると示唆していますが、「直感だけでこの値を調整するのは簡単ではない」とも述べており、異なる値をテストすべきだと述べています。カーネルドキュメントも同様に、SSDではさらに高くすることも可能だと述べています。

しかし、特にワークステーション用途で、異なるswappiness値をテストおよび比較する方法について、明確な指示はどこにも見つかっていません。もし何か推奨事項があれば、ぜひ教えていただきたいです。今のところ、SSDでは100でうまくいっています。


これまで犯した間違い

Chrisの2番目の記事を読む前は、彼がそれを推奨していると思っていたのでzramSwap.enableを使用していました。しかし、それは間違いで、実際には逆でした。boot.zswapが追加された今年の4月まで、このことに気づいていませんでした。したがって、明確にしておくと、zramSwapは通常zramと呼ばれるものです。ディスクベースのスワップを使用している場合は、おそらくこれは望ましくないでしょう。私の場合はハイバネーションが必要だったので、これは間違った選択でした。

この間違いに気づいた後、zramSwap.enableを削除し、boot.zswapを使用し始めました。

  boot.initrd.systemd.enable = true;
  boot.zswap = {
    enable = true;
    compressor = "lz4";
  };
  boot.kernel.sysctl."vm.swappiness" = 100;

zswapの圧縮アルゴリズムはboot.zswap.compressorを通じて制御できることがわかります。Linuxカーネルは、速度と圧縮のバランスが良いlzoをデフォルトとしています。一方、NixOSは、最高の圧縮率を持ち、Nixビルドにも適しているという理由でzstdをデフォルトとしています。

最近まで、最も高速な圧縮と低遅延を持つlz4を実行していました。ArchWikiを読んで、主にそれをコンプレッサーとして使用していることを知った後、この決定を下しました。しかし現実には、メモリがディスクにスピルオーバーしている場合、圧縮速度が制限要因となることはめったにありません。より良い圧縮率により、メモリ内の圧縮プールにより多くのページを収めることができ、ディスクの使用頻度が減ります。

そのため、現在はNixOSのデフォルトであるzstdを使用しています。また、その設定を追加したとき、lz4はboot.initrd.systemd.enableを必要としました。この設定は現在デフォルトでtrueになっているため、その行は削除できます。これにより、設定はわずか2行になります。

私は様々なプロジェクト、イベント、考えについて書いていますが、それらすべてに共通する側面があります。それは、私が何かを学び、その経験を他の人と共有したいということです。

スパムなし、第三者への共有なし。あなたと私だけです。