「Zram」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(同期)
 
(同じ利用者による、間の9版が非表示)
1行目: 1行目:
 
{{Lowercase title}}
 
{{Lowercase title}}
 
[[en:zram]]
 
[[en:zram]]
  +
[[ru:Zram]]
  +
[[zh-hans:Zram]]
 
[[Category:カーネル]]
 
[[Category:カーネル]]
 
{{Related articles start}}
 
{{Related articles start}}
7行目: 9行目:
 
{{Related articles end}}
 
{{Related articles end}}
   
[[wikipedia:ja:zram|Zram]] (以前は compcache と呼ばれていました) は、RAM 内に圧縮ブロックデバイスを作成するための Linux カーネルモジュールです。つまり、オンザフライのディスク圧縮 RAM ディスクです。zram で作成されたブロックデバイスは、スワップとして使ったり、汎用 RAM ディスクとして使ったりすることができます。zram の最も一般的な2つの使用法は、一時ファイルのストレージ (/tmp) とスワップデバイスです。初期の zram には者の機能しか存在しておらず、ゆえに元の名前は "compcache" ("compressed cache") でした。
+
[https://docs.kernel.org/admin-guide/blockdev/zram.html zram] (以前は compcache と呼ばれていました) は、RAM 内に圧縮ブロックデバイスを作成するための Linux カーネルモジュールです。つまり、オンザフライのディスク圧縮を用いる RAM ディスクです。zram で作成されたブロックデバイスは、スワップとして使ったり、汎用 RAM ディスクとして使ったりすることができます。zram の最も一般的な2つの使用法は、一時ファイル ({{ic|/tmp}}) のストレージとスワップデバイスです。初期の zram には者の機能しか存在しておらず、ゆえに元の名前は "compcache" ("compressed cache") でした。
   
 
== スワップとしての使用 ==
 
== スワップとしての使用 ==
   
  +
最初の段階では、作成された zram ブロックデバイスは RAM を予約したり使用したりしません。ファイルをスワップアウトする必要が生じた場合にのみ、そのファイルは圧縮され、zram ブロックデバイスへ移動されます。zram ブロックデバイスは必要に応じて動的に拡大/縮小します。
=== zswap を無効化する ===
 
   
  +
例として、32 GiB RAM を搭載し、64 GiB の容量を持つ zram が設定されているシステムを考えてみましょう。zstd の圧縮比は 1:4 であると仮定し、zram が満タンになったときの物理 RAM 上の圧縮された zram ブロックサイズは約 16 GiB になるとします。このとき:
zswap はデフォルトで有効化されているため、zram の前に zswap がスワップのキャッシュとして振る舞うことを防ぐために、[[Zswap#zswap を切り替える|zswap を無効化]]してください。また、両方を有効化すると、zram がほとんど使用されないため、{{man|8|zramctl}} 統計が不正確になってしまいます。これは、zswap が、スワップアウトされたメモリページを zram への到達前にインターセプトし圧縮してしまうためです。
 
   
  +
* RAM と zram が完全に満タン: 16 GiB RAM + 64 GiB zram (RAM 内では約 16 GiB)
=== 自動的に ===
 
  +
* スワップの発生しない通常の使用時: 32 GiB RAM + 0 GiB zram
  +
* 軽いスワップの発生している通常の使用時: 30 GiB RAM + 8 GiB zram (RAM 内では約 2 GiB)
  +
* zram 無し: 32 GiB RAM
   
  +
このように、RAM 内により多くの内容を保存できるという利点を常に提供します。
[https://github.com/systemd/zram-generator/blob/main/README.md zram-generator] は {{ic|systemd-zram-setup@.service}} ユニットを提供します。これは、ユーザがテンプレートやインスタンスを[[起動/有効化]]する必要なしに zram デバイスを自動的に初期化します。{{man|8|zram-generator}} と {{man|5|zram-generator.conf}} を参照してください。
 
 
例えば、{{ic|zstd}} と利用可能な ram 全体を使用する zram スワップデバイスを作成するには、{{Pkg|zram-generator}} を[[インストール]]し、{{ic|/etc/systemd/zram-generator.conf}} を以下の内容で作成してください:
 
 
{{hc|/etc/systemd/zram-generator.conf|2=
 
[zram0]
 
zram-size = ram
 
compression-algorithm = zstd
 
}}
 
 
再起動し、{{ic|systemd-zram-setup@zram''N''.service}} インスタンスの[[systemd#ユニットを使う|ユニットステータス]]を見るか {{man|8|zramctl}} を使用して、設定した {{ic|/dev/zram''N''}} デバイスの[[スワップ#スワップ領域|スワップ状態を確認してください]]。
 
 
また、{{AUR|zramswap}} も、高優先度でシステムの RAM の 20% をデフォルトサイズとして持つスワップをセットアップするための自動化されたスクリプトを提供します。起動のたびにこれを自動的に行うには、{{ic|zramswap.service}} を[[有効化]]してください。{{AUR|zramd}} は、デフォルトで zstd 圧縮を使用して zram を自動的にセットアップできるようにします。設定は {{ic|/etc/default/zramd}} で変更できます。{{ic|zramd.service}} ユニットを有効化することで、起動時に開始できます。
 
 
==== systemd-swap を使う ====
 
 
{{Note|systemd-swap はコミット頻度が低く、[[zram]] がほとんどのユーザのニーズを満たしているため、作者は、{{Pkg|zram-generator}} を代わりに使用することを[https://github.com/Nefelim4ag/systemd-swap#%EF%B8%8F-current-code-quality-and-commit-frequency-is-low-%EF%B8%8F 推奨しています]。}}
 
 
systemd-swap は、[[zram]] スワップ、スワップファイル、スワップパーティションからハイブリッドスワップ領域を作成するためのスクリプトです。Systemd プロジェクトには参加していません。
 
 
{{pkg|systemd-swap}} パッケージを[[インストール]]してください。{{ic|/etc/systemd/swap.conf}} の ''Swap File Chunked'' セクション内の {{ic|1=swapfc_enabled=1}} をアンコメント・設定してください。{{ic|systemd-swap}} を[[起動/有効化]]してください。
 
 
詳細や [https://github.com/Nefelim4ag/systemd-swap/blob/master/README.md#about-configuration 推奨される設定]については [https://github.com/Nefelim4ag/systemd-swap 作者の GitHub] ページを見てください。
 
   
 
{{Note|
 
{{Note|
  +
* [[zswap]] 関連のカーネル機能が有効化されたままだと、zram が効果的に使用されなくなってしまいます。これは、zswap が zram より前にスワップキャッシュとして機能し、追い出されたメモリページを zram への到達前にンターセプトして圧縮するからです。{{man|8|zramctl}} の出力結果にも関わらず、この状況では zswap のほとんどが使用されていません。
* Journal が {{ic|systemd-swap[..]: WARN: swapFC: ENOSPC}} という警告を表示し続け、スワップファイルが作成されない場合、{{ic|/etc/systemd/swap.conf}} 内の {{ic|1=swapfc_force_preallocated=1}} をアンコメント・設定する必要があります。
 
  +
* 上記の通り、zram の設定に際して、zram デバイスのサイズは zram に格納できるデータの圧縮前の最大サイズであり、圧縮後の最大サイズではありません。zram サイズは、物理 RAM 上における圧縮後のサイズがシステムの物理 RAM 容量を超えない限り、システムの物理 RAM 容量以上に設定することができます。
* systemd-swap によって作成されたスワップファイルは、簡単には[[ハイバネート]]に使用できません。[https://github.com/Nefelim4ag/systemd-swap/issues/85 systemd-swap issue 85] を見てください。
 
  +
* zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。''logind'' は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。
 
}}
 
}}
   
 
=== 手動で ===
 
=== 手動で ===
   
  +
まず、sysfs から [[Zswap#zswap を切り替える|zswap を無効化]]してください:
32GiB の容量を持ち、通常より高い優先度の、lz4 で圧縮された zram デバイスを (現在のセッションに対してのみ) セットアップするには:
 
  +
  +
# echo 0 > /sys/module/zswap/parameters/enabled
  +
  +
そして、32GiB の容量を持ち、通常より高い優先度の、zstd で圧縮された zram デバイスを (現在のセッション限定で) セットアップするには:
   
 
# modprobe zram
 
# modprobe zram
  +
# zramctl /dev/zram0 --algorithm zstd --size 32G
# echo lz4 > /sys/block/zram0/comp_algorithm
 
# echo 32G > /sys/block/zram0/disksize
+
# mkswap -U clear /dev/zram0
# mkswap --label zram0 /dev/zram0
 
 
# swapon --priority 100 /dev/zram0
 
# swapon --priority 100 /dev/zram0
   
60行目: 47行目:
 
# swapoff /dev/zram0
 
# swapoff /dev/zram0
 
# modprobe -r zram
 
# modprobe -r zram
  +
# echo 1 > /sys/module/zswap/parameters/enabled
   
すべての手順、オプション、および潜在的な問題の詳細な説明は [https://docs.kernel.org/admin-guide/blockdev/zram.html zram モジュールの公式ドキュメント]で見られます。
+
すべての手順、オプション、および潜在的な問題の詳細な説明は [https://docs.kernel.org/admin-guide/blockdev/zram.html zram モジュールの公式ドキュメント] で見られます。
   
  +
zram を永続的に設定するには、以下のいずれかのセクションの方法を取ってください。
==== udev ルールを使って zram 上にスワップする ====
 
  +
  +
=== udev ルールを使う ===
   
 
以下の例は、1つの udev ルールを使って起動時に自動的に zram 上にスワップをセットアップする方法を示しています。これを行うために、追加のパッケージは必要ないはずです。
 
以下の例は、1つの udev ルールを使って起動時に自動的に zram 上にスワップをセットアップする方法を示しています。これを行うために、追加のパッケージは必要ないはずです。
  +
  +
始める前に、カーネルパラメータか sysctl knob を使って永続的に [[Zswap#zswap を切り替える|zswap を無効化]]してください。
   
 
明示的に[[カーネルモジュール#モジュールの自動ロード|起動時にモジュールをロードしてください]]:
 
明示的に[[カーネルモジュール#モジュールの自動ロード|起動時にモジュールをロードしてください]]:
73行目: 65行目:
 
}}
 
}}
   
必要 {{ic|/dev/zram}} ノードの数設定してください:
+
以下の [[udev ルール]]を作成してください。必要に応じて {{ic|disksize}} 属性調整してください:
   
{{hc|/etc/modprobe.d/zram.conf|2=
+
{{hc|/etc/udev/rules.d/99-zram.rules|2=
  +
ACTION=="add", KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="4G", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd"
options zram num_devices=2
 
 
}}
 
}}
   
  +
{{ic|/dev/zram}} を[[fstab]] に追加し、デフォルトよりも高い優先度を割り当ててください:
以下の例のように [[udev#udev ルールについて|udev ルール]]を作成してください:
 
   
{{hc|/etc/udev/rules.d/99-zram.rules|2=
+
{{hc|/etc/fstab|2=
  +
/dev/zram0 none swap defaults,pri=100 0 0
ACTION=="add", KERNEL=="zram[0-1]", ATTR{comp_algorithm}="zstd", ATTR{disksize}="512M", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd"
 
 
}}
 
}}
   
  +
{{Note|zram 上のスワップ領域は fstab から LABEL や UUID で参照することはできません。[[udev]] は zram デバイスに対する {{ic|/dev/disk/by-label/*}} シンボリックリンクと {{ic|/dev/disk/by-uuid/*}} シンボリックリンクを作成しないからです。}}
fstab に {{ic|/dev/zram}} を追加してください。
 
   
  +
=== zram-generator を使う ===
{{hc|/etc/fstab|
 
  +
/dev/zram0 none swap defaults 0 0
 
  +
[https://github.com/systemd/zram-generator/blob/main/README.md zram-generator] は、zram デバイスを自動的に初期化する {{ic|systemd-zram-setup@.service}} ユニットを提供します。ユーザがテンプレートやインスタンスを[[起動/有効化]]する必要はありません。{{man|8|zram-generator}} と {{man|5|zram-generator.conf}} を参照してください。
/dev/zram1 none swap defaults 0 0
 
  +
  +
始める前に、カーネルパラメータか sysctl knob を使って永続的に [[Zswap#zswap を切り替える|zswap を無効化]]してください。[https://github.com/systemd/zram-generator/issues/156]
  +
  +
{{ic|zstd}} と利用可能な ram 全体を使用する zram スワップデバイスを作成するには、{{Pkg|zram-generator}} を[[インストール]]し、{{ic|/etc/systemd/zram-generator.conf}} を以下の内容で作成してください:
  +
  +
{{hc|/etc/systemd/zram-generator.conf|2=
  +
[zram0]
  +
zram-size = ram / 2
  +
compression-algorithm = zstd
  +
swap-priority = 100
  +
fs-type = swap
 
}}
 
}}
   
  +
[[daemon-reload]] を実行し、そして設定した {{ic|systemd-zram-setup@zram''N''.service}} インスタンスを[[起動]]してください。
{{TranslationStatus|zram|2023-02-19|767704}}
 
  +
  +
{{ic|systemd-zram-setup@zram''N''.service}} インスタンスの[[ユニットステータス]]を見るか {{man|8|zramctl}} を使用して、設定した {{ic|/dev/zram''N''}} デバイスの[[スワップ#スワップ領域|スワップ状態を確認]]することができます。
  +
  +
=== zramswap を使う ===
  +
  +
{{AUR|zramswap}} は、システム RAM の 20% のサイズをデフォルトで持つ、高い優先度のスワップをセットアップするための自動化されたスクリプトを提供します。起動毎にこれを自動的に行うには、{{ic|zramswap.service}} を[[有効化]]してください。
  +
  +
=== zramd を使う ===
  +
  +
{{AUR|zramd}} は、デフォルトで zstd 圧縮アルゴリズムを使う zram を自動的にセットアップします。設定は {{ic|/etc/default/zramd}} で変更できます。{{ic|zramd.service}} ユニットを有効化することで、ブート時に zramd を起動できます。
  +
  +
== ヒントとテクニック ==
  +
  +
=== zram の統計を確認する ===
  +
  +
{{man|8|zramctl}} を使用してください。例えば:
  +
  +
{{hc|$ zramctl|
  +
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
  +
/dev/zram0 zstd 32G 1.9G 318.6M 424.9M 16 [SWAP]
  +
}}
  +
  +
* DISKSIZE = 32G: この zram デバイスには圧縮前のデータを 32 GiB まで格納できます。
  +
* DATA = 1.9G: 現在、1.9 GiB (圧縮前) のデータがこの zram デバイスに格納されています。
  +
* COMPR = 318.6M: 圧縮前データ 1.9 GiB が 318.6 MiB に圧縮されています。
  +
* TOTAL = 424.9M: メータデータを含めて、圧縮前データ 1.9 GiB は物理メモリ内の 424.9 MiB を占めています。
  +
  +
=== 複数の zram デバイス ===
  +
  +
デフォルトでは、{{ic|zram}} モジュールをロードすると単一の {{ic|/dev/zram0}} デバイスが作成されます。
  +
  +
複数の {{ic|/dev/zram}} デバイスが必要である場合は、{{ic|num_devices}} [[カーネルモジュールパラメータ]] を使って数を指定するか、[https://docs.kernel.org/admin-guide/blockdev/zram.html#add-remove-zram-devices 後で必要に応じて追加してください]。
  +
  +
=== zram 上のスワップを最適化する ===
  +
  +
zram はディスクスワップとは異なる挙動をするため、システムのスワップを設定することで zram の利点を最大限活用することができます:
  +
  +
{{hc|/etc/sysctl.d/99-vm-zram-parameters.conf|2=
  +
vm.swappiness = 180
  +
vm.watermark_boost_factor = 0
  +
vm.watermark_scale_factor = 125
  +
vm.page-cluster = 0
  +
}}
  +
  +
この設定の説明:
  +
  +
これらの値は [https://github.com/pop-os/default-settings/pull/163 Pop!_OS が使用しているものです]。Pop!_OS の GitHub プルリクエストには、[https://old.reddit.com/r/Fedora/comments/mzun99/new_zram_tuning_benchmarks/ r/Fedora のユーザによるテスト結果]へのリンクもあります。このテストでは {{ic|1=vm.page-cluster = 0}} が理想的であると判断されました。また、swappiness を高い値にすることも良いこと分かりました。このことは、[https://docs.kernel.org/admin-guide/sysctl/vm.html カーネルのドキュメント]で提案されていることとも合致します:
  +
  +
"デフォルトの値は 60 です。zram や zswap といったメモリ内のスワップの場合や、ファイルシステムよりも高速なデバイス上にスワップが存在するハイブリッドなセットアップの場合では、100 以上の値を検討することができます。例えば、スワップデバイスに対するランダム IO がファイルシステムに対する IO よりも平均して 2 倍速いのならば、swappiness は 133 とするべきでしょう (x + 2x = 200, 2x = 133.33)。"
  +
  +
ハードドライブのあるシステムでは、zswap デバイスに対するランダム IO は、ファイルシステムに対する IO よりも桁違いに高速であるため、swappiness はだいたい 200 とすべきでしょう。高速な SSD のあるシステムでも、swappiness の値を高くすることが理想的である場合があります。
  +
  +
=== zram ブロックデバイスでバッキングデバイスを有効化する ===
  +
  +
zram では、高メモリ負荷な状況で、指定したブロックデバイスに圧縮できないページを保存することができます。
  +
  +
バッキングデバイスを手動で追加するには:
  +
  +
# echo /dev/''sdX'' > /sys/block/zram0/backing_dev
  +
  +
''zram-generator'' を使って zram ブロックデバイスにバッキングデバイスを追加するには、{{ic|/etc/systemd/zram-generator.conf}} の {{ic|[zram''X'']}} (バッキングデバイスを追加したいデバイス) セクション内に以下の記述を追加してください:
  +
  +
{{hc|/etc/systemd/zram-generator.conf|2=
  +
writeback-device=/dev/disk/by-partuuid/''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX''
  +
}}
  +
  +
=== zram をスワップ以外の目的で使う ===
  +
  +
zram は RAM 上の汎用ブロックデバイスとして使うこともできます。単なる RAM ディスクと比べて物理メモリの使用量は少なくなりますが、パフォーマンスがわずかに低下します。ただし、いくつかの注意点があります:
  +
  +
* パーティションテーブルのサポートはありません ({{ic|/dev/zram''x''p''y''}} ファイルは自動的に作成されません)。
  +
* ブロックサイズは 4 kiB に固定されます。
  +
  +
これらの問題を回避する方法は、zram に対してループバックデバイスを使用することです。''losetup'' を使い、{{ic|-b}} オプションでブロックサイズを指定し、{{ic|-P}} オプションでパーティションテーブルの再スキャンを行って zram のパーティションループバックデバイスを自動的に作成します。
  +
  +
{{hc|# zramctl -f -s ''N''G|/dev/zram''x''}}
  +
  +
ディスクイメージを新しい {{ic|/dev/zram}} に書き込んでください:
  +
  +
{{Accuracy|以下でブロックサイズを 512 バイトに設定している理由は?}}
  +
  +
# losetup -f -b 512 -P /dev/zram''x''
  +
  +
{{hc|# ls /dev/loop*|/dev/loop0 /dev/loop0p1 /dev/loop0p2}}
  +
  +
# mount /dev/loop0p1 /mnt/boot
  +
# mount /dev/loop0p2 /mnt/root
  +
  +
{{Note|
  +
* Zram デバイスの番号は既存の zram デバイスに依存します。また、zram はディスクイメージを保持できるサイズである必要があります。
  +
* {{ic|ls /dev/loop*}} の出力はディスクイメージのコンテンツに依存します。
  +
}}
  +
  +
== 参照 ==
  +
  +
* [[Wikipedia:ja:zram]]
  +
* https://github.com/pop-os/default-settings/pull/163
  +
* https://www.reddit.com/r/pop_os/comments/znh9n6/help_test_a_zram_optimization_for_pop_os/
  +
  +
{{TranslationStatus|zram|2024-01-02|795603}}

2024年1月2日 (火) 08:06時点における最新版

関連記事

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

スワップとしての使用

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

例として、32 GiB RAM を搭載し、64 GiB の容量を持つ zram が設定されているシステムを考えてみましょう。zstd の圧縮比は 1:4 であると仮定し、zram が満タンになったときの物理 RAM 上の圧縮された zram ブロックサイズは約 16 GiB になるとします。このとき:

  • RAM と zram が完全に満タン: 16 GiB RAM + 64 GiB zram (RAM 内では約 16 GiB)
  • スワップの発生しない通常の使用時: 32 GiB RAM + 0 GiB zram
  • 軽いスワップの発生している通常の使用時: 30 GiB RAM + 8 GiB zram (RAM 内では約 2 GiB)
  • zram 無し: 32 GiB RAM

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

ノート:
  • zswap 関連のカーネル機能が有効化されたままだと、zram が効果的に使用されなくなってしまいます。これは、zswap が zram より前にスワップキャッシュとして機能し、追い出されたメモリページを zram への到達前にンターセプトして圧縮するからです。zramctl(8) の出力結果にも関わらず、この状況では zswap のほとんどが使用されていません。
  • 上記の通り、zram の設定に際して、zram デバイスのサイズは zram に格納できるデータの圧縮前の最大サイズであり、圧縮後の最大サイズではありません。zram サイズは、物理 RAM 上における圧縮後のサイズがシステムの物理 RAM 容量を超えない限り、システムの物理 RAM 容量以上に設定することができます。
  • zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。logind は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。

手動で

まず、sysfs から zswap を無効化してください:

# echo 0 > /sys/module/zswap/parameters/enabled

そして、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
# echo 1 > /sys/module/zswap/parameters/enabled

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

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

udev ルールを使う

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

始める前に、カーネルパラメータか sysctl knob を使って永続的に zswap を無効化してください。

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

/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) を参照してください。

始める前に、カーネルパラメータか sysctl knob を使って永続的に zswap を無効化してください。[1]

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 デバイスには圧縮前のデータを 32 GiB まで格納できます。
  • DATA = 1.9G: 現在、1.9 GiB (圧縮前) のデータがこの zram デバイスに格納されています。
  • COMPR = 318.6M: 圧縮前データ 1.9 GiB が 318.6 MiB に圧縮されています。
  • TOTAL = 424.9M: メータデータを含めて、圧縮前データ 1.9 GiB は物理メモリ内の 424.9 MiB を占めています。

複数の 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 プルリクエストには、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 の値を高くすることが理想的である場合があります。

zram ブロックデバイスでバッキングデバイスを有効化する

zram では、高メモリ負荷な状況で、指定したブロックデバイスに圧縮できないページを保存することができます。

バッキングデバイスを手動で追加するには:

# echo /dev/sdX > /sys/block/zram0/backing_dev

zram-generator を使って zram ブロックデバイスにバッキングデバイスを追加するには、/etc/systemd/zram-generator.conf[zramX] (バッキングデバイスを追加したいデバイス) セクション内に以下の記述を追加してください:

/etc/systemd/zram-generator.conf
writeback-device=/dev/disk/by-partuuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

zram をスワップ以外の目的で使う

zram は RAM 上の汎用ブロックデバイスとして使うこともできます。単なる RAM ディスクと比べて物理メモリの使用量は少なくなりますが、パフォーマンスがわずかに低下します。ただし、いくつかの注意点があります:

  • パーティションテーブルのサポートはありません (/dev/zramxpy ファイルは自動的に作成されません)。
  • ブロックサイズは 4 kiB に固定されます。

これらの問題を回避する方法は、zram に対してループバックデバイスを使用することです。losetup を使い、-b オプションでブロックサイズを指定し、-P オプションでパーティションテーブルの再スキャンを行って zram のパーティションループバックデバイスを自動的に作成します。

# zramctl -f -s NG
/dev/zramx

ディスクイメージを新しい /dev/zram に書き込んでください:

この記事またはセクションの正確性には問題があります。
理由: 以下でブロックサイズを 512 バイトに設定している理由は? (議論: トーク:Zram#)
# losetup -f -b 512 -P /dev/zramx
# ls /dev/loop*
/dev/loop0 /dev/loop0p1 /dev/loop0p2
# mount /dev/loop0p1 /mnt/boot
# mount /dev/loop0p2 /mnt/root
ノート:
  • Zram デバイスの番号は既存の zram デバイスに依存します。また、zram はディスクイメージを保持できるサイズである必要があります。
  • ls /dev/loop* の出力はディスクイメージのコンテンツに依存します。

参照

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