zram

提供: ArchWiki
2023年7月13日 (木) 13:23時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎zram でのスワップを最適化する: セクション名を修正)
ナビゲーションに移動 検索に移動

関連記事

zram (以前は compcache と呼ばれていました) は、RAM 内に圧縮ブロックデバイスを作成するための Linux カーネルモジュールです。つまり、オンザフライのディスク圧縮を用いる RAM ディスクです。zram で作成されたブロックデバイスは、スワップとして使ったり、汎用 RAM ディスクとして使ったりすることができます。zram の最も一般的な2つの使用法は、一時ファイル (/tmp) のストレージとスワップデバイスです。初期の zram には前者の機能しか存在しておらず、ゆえに元の名前は "compcache" ("compressed cache") でした。

スワップとしての使用

最初の段階では、作成された zram ブロックデバイスは RAM を予約したり使用したりしません。ファイルをスワップアウトする必要が生じた場合にのみ、そのファイルは圧縮され、zram ブロックデバイスへ移動されます。zram ブロックデバイスは必要に応じて動的に拡大/縮小します。

例 (システムは 32 GiB RAM を搭載し、zram は (最大で) 16 GiB RAM を使うように設定されており、圧縮比は 1:4 と仮定します):

  • 最悪ケース (RAM と zram が完全に”一杯になった”): 16 GiB RAM + 64 GiB zram
  • スワップの発生しない通常の使用: 32 GiB RAM + 0 GiB zram
  • 軽いスワップが発生する通常の使用: 30 GiB RAM + 8 GiB zram
  • zram 無し: 32 GiB RAM

このように、RAM 内により多くの内容を保存できるという利点を常に提供します。

ノート:
  • デフォルトで有効化されている zswap を無効化してください。zram の前に zswap がスワップのキャッシュとして振る舞うことを防ぐためです。また、zram と zswap の両方を有効化すると、zram がほとんど使用されないため、zramctl(8) の統計が不正確になってしまいます。これは、zswap が、スワップアウトされたメモリページを zram への到達前にインターセプトし圧縮してしまうためです。
  • zram デバイスに対して設定されるサイズは、格納できる圧縮前データのサイズの最大値であり、圧縮後のサイズではありません。zram のサイズはシステムの物理 RAM 容量以上に設定することができます。
  • zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。logind は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。

手動で

32GiB の容量を持ち、通常より高い優先度の、zstd で圧縮された zram デバイスを (現在のセッション限定で) セットアップするには:

# modprobe zram
# zramctl /dev/zram0 --algorithm zstd --size 32G
# mkswap -U clear /dev/zram0
# swapon --priority 100 /dev/zram0

無効化するには、再起動するか、以下を実行してください:

# swapoff /dev/zram0
# modprobe -r zram

すべての手順、オプション、および潜在的な問題の詳細な説明は zram モジュールの公式ドキュメント で見られます。

zram を永続的に設定するには、以下のいずれかのセクションの方法を取ってください。

udev ルールを使う

以下の例は、1つの udev ルールを使って起動時に自動的に zram 上にスワップをセットアップする方法を示しています。これを行うために、追加のパッケージは必要ないはずです。

明示的に起動時にモジュールをロードしてください:

/etc/modules-load.d/zram.conf
zram

以下の udev ルールを作成してください。必要に応じて disksize 属性を調整してください:

/etc/udev/rules.d/99-zram.rules
ACTION=="add", KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="4G", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd"

/dev/zramfstab に追加し、デフォルトよりも高い優先度を割り当ててください:

/etc/fstab
/dev/zram0 none swap defaults,pri=100 0 0
ノート: zram 上のスワップ領域は fstab から LABEL や UUID で参照することはできません。udev は zram デバイスに対する /dev/disk/by-label/* シンボリックリンクと /dev/disk/by-uuid/* シンボリックリンクを作成しないからです。

zram-generator を使う

zram-generator は、zram デバイスを自動的に初期化する systemd-zram-setup@.service ユニットを提供します。ユーザがテンプレートやインスタンスを起動/有効化する必要はありません。zram-generator(8)zram-generator.conf(5) を参照してください。

例えば、zstd と利用可能な ram 全体を使用する zram スワップデバイスを作成するには、zram-generatorインストールし、/etc/systemd/zram-generator.conf を以下の内容で作成してください:

/etc/systemd/zram-generator.conf
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100
fs-type = swap

daemon-reload を実行し、そして設定した systemd-zram-setup@zramN.service インスタンスを起動してください。

systemd-zram-setup@zramN.service インスタンスのユニットステータスを見るか zramctl(8) を使用して、設定した /dev/zramN デバイスのスワップ状態を確認することができます。

zramswap を使う

zramswapAUR は、システム RAM の 20% のサイズをデフォルトで持つ、高い優先度のスワップをセットアップするための自動化されたスクリプトを提供します。起動毎にこれを自動的に行うには、zramswap.service有効化してください。

zramd を使う

zramdAUR は、デフォルトで zstd 圧縮アルゴリズムを使う zram を自動的にセットアップします。設定は /etc/default/zramd で変更できます。zramd.service ユニットを有効化することで、ブート時に zramd を起動できます。

ヒントとテクニック

zram の統計を確認する

zramctl(8) を使用してください。例えば:

$ zramctl
NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd           32G  1.9G 318.6M 424.9M      16 [SWAP]
  • DISKSIZE = 32G: この zram デバイスには圧縮前のデータを 32G まで格納できます。
  • DATA = 1.9G: 現在、1.9G (圧縮前) のデータがこの zram デバイスに格納されています。
  • COMPR = 318.6M: 圧縮前データ 1.9G が 318.6M に圧縮されています。
  • TOTAL = 424.9M: メータデータを含めて、圧縮前データ 1.9G は物理メモリ内の 424.9M を占めています。

複数の zram デバイス

デフォルトでは、zram モジュールをロードすると単一の /dev/zram0 デバイスが作成されます。

複数の /dev/zram デバイスが必要である場合は、num_devices カーネルモジュールパラメータ を使って数を指定するか、後で必要に応じて追加してください

zram 上のスワップを最適化する

zram はディスクスワップとは異なる挙動をするため、システムのスワップを設定することで zram の利点を最大限活用することができます:

/etc/sysctl.d/99-vm-zram-parameters.conf
vm.swappiness = 180
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0

この設定の説明:

これらの値は Pop!_OS が使用しているものです。Pop!_OS の GitHub PR には、r/Fedora のユーザによるテスト結果へのリンクもあります。このテストでは vm.page-cluster = 0 が理想的であると判断されました。また、swappiness を高い値にすることも良いこと分かりました。このことは、カーネルのドキュメントで提案されていることとも合致します:

"デフォルトの値は 60 です。zram や zswap といったメモリ内のスワップの場合や、ファイルシステムよりも高速なデバイス上にスワップが存在するハイブリッドなセットアップの場合では、100 以上の値を検討することができます。例えば、スワップデバイスに対するランダム IO がファイルシステムに対する IO よりも平均して 2 倍速いのならば、swappiness は 133 とするべきでしょう (x + 2x = 200, 2x = 133.33)。"

ハードドライブのあるシステムでは、zswap デバイスに対するランダム IO は、ファイルシステムに対する IO よりも桁違いに高速であるため、swappiness はだいたい 200 とすべきでしょう。高速な SSD のあるシステムでも、swappiness の値を高くすることが理想的である場合があります。

参照

翻訳ステータス: このページは en:zram の翻訳バージョンです。最後の翻訳日は 2023-07-13 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。