インフラ・DevOps
NixOSにおけるスワップ、ZRAM、Zswap、およびハイバネーション
Swap, ZRAM, Zswap and Hibernate on NixOS (blog.matthewbrunelle.com)
要約
この記事は、NixOS環境におけるスワップ、ZRAM、Zswap、およびハイバネーションの設定について解説しています。著者は、デスクトップやラップトップでの「サスペンド・アンド・ハイバネート」機能のためにスワップを利用しており、スワップファイルとパーティションの違い、ハイバネーション時の注意点、そしてNixOSでの具体的な設定方法を共有しています。特に、zswapの有効化とswappinessの値設定に焦点を当て、自身の経験に基づいた設定の変遷と推奨設定を紹介しています。
全文翻訳
この記事を、私の「あまり知られていないNixOS設定」の一部から独立した投稿として取り上げました。ああ、スワップ、zram、zswapについて話すことになります…スワップを使うべきかどうかは、オンラインで絶えず議論されています。サーバー向けとワークステーション向けの推奨事項を混同すると、議論はしばしば混乱します。私の場合は、デスクトップとラップトップに焦点を当てます。
私はサスペンド・アンド・ハイバネート、または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を使用していました。しかし、それは間違いで、実際には逆でした。今年4月にboot.zswapが追加されるまで、このことに気づきませんでした。したがって、明確にすると、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行になります。
私は様々なプロジェクト、イベント、考えについて書いていますが、それらすべてに共通する側面があります。それは、何かを学び、その経験を他の人と共有したいということです。
サブスクライブ
メール送信済み。受信トレイを確認してください!スパムや第三者への共有はありません。あなたと私だけです。
あまり知られていないNixオプション
NixOSインストールガイドに従った後、次は?Nixオプションの海の中で、あなたの設定で何が欠けていますか?
18 Sep
より良いドッグカメラの構築 パート1 - Raspberry PiとNixOS
最初に言っておきますが、このパートは2回目の試みに移る前に未完成でした。
15 Sep
私のSteamマシンは50フィートのHDMIケーブル
非常に長いHDMIケーブル、Steam Controller 2、そして2台目のドライブのBazziteがあれば、快適なソファゲーミング体験に必要なすべてであることが判明しました。
22 Jun
こんにちはWalter!ESP32でRustを学ぶ
WalterはLTE-MとGPSを備えたESP32-S3モジュールです。私のBeaconDBワードライディング実験に文字通り最適です。現在、Embassyをそれにセットアップしました。
28 Feb
Thunderbird Appointmentを試す
招待を辛抱強く待っている間
OK、実際には、Thunderbirdチームによる新しいオープンソースのスケジュール予約ツールを、Thunderbird Proの一部となるのを少し辛抱強く待っています。
09 Feb