「Zram」の版間の差分
(TranslationStatus) |
(同期) |
||
(同じ利用者による、間の12版が非表示) | |||
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}} |
||
− | [ |
+ | [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 を無効化する === |
||
+ | Zstd の圧縮率が 1/2 までしか達しないと仮定したとしても (実際には圧縮率は 1/3 に達することが多いです)、zram は、メモリ圧縮を用いない場合より多くのデータを RAM 上に保管することができます。 |
||
− | zswap はデフォルトで有効化されているため、zram の前に zswap がスワップのキャッシュとして振る舞うことを防ぐために、[[Zswap#zswap を切り替える|zswap を無効化]]してください。また、両方を有効化すると、zram がほとんど使用されないため、{{man|8|zramctl}} 統計が不正確になってしまいます。これは、zswap が、スワップアウトされたメモリページを zram への到達前にインターセプトし圧縮してしまうためです。 |
||
+ | {{Note| |
||
− | === 自動的に === |
||
+ | * Zram を設定する際、zram デバイスのサイズは格納可能な未圧縮データの最大サイズであり、圧縮後の最大サイズではないことに注意してください。Zram のサイズは、圧縮後のサイズがシステムの物理 RAM 容量を超えない限り、システムの物理 RAM 容量より大きくすることができます。 |
||
− | |||
+ | * [[zswap]] 関連のカーネル機能が有効化されたままだと、zram が効果的に使用されなくなってしまいます。これは、zswap が zram より前にスワップキャッシュとして機能し、追い出されたメモリページを zram への到達前にンターセプトして圧縮するからです。{{man|8|zramctl}} の出力結果にも関わらず、この状況では zswap のほとんどが使用されていません。そのため、起動前にカーネルパラメータか sysfs の設定で[[zswap#zswap を切り替える|zswap を永続的に無効化しておく]]ことが推奨されます。 |
||
− | [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}} を参照してください。 |
||
+ | * zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。''logind'' は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。 |
||
− | |||
− | 例えば、{{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 |
||
}} |
}} |
||
+ | {{Tip|Zram が圧縮後のデータを格納するために使用できる最大メモリ量は {{ic|mem_limit}} パラメータで指定できます。}} |
||
− | 再起動し、{{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}} ユニットを有効化することで、起動時に開始できます。 |
||
=== 手動で === |
=== 手動で === |
||
− | + | システムメモリの半分の容量を持ち、通常より高い優先度の、zstd で圧縮された zram デバイスを (現在のセッション限定で) セットアップするには: |
|
# modprobe zram |
# modprobe zram |
||
+ | # zramctl /dev/zram0 --algorithm zstd --size "$(($(grep -Po 'MemTotal:\s*\K\d+' /proc/meminfo)/2))KiB" |
||
− | # echo lz4 > /sys/block/zram0/comp_algorithm |
||
− | # |
+ | # mkswap -U clear /dev/zram0 |
− | # |
+ | # swapon --discard --priority 100 /dev/zram0 |
− | # swapon --priority 100 /dev/zram0 |
||
無効化するには、再起動するか、以下を実行してください: |
無効化するには、再起動するか、以下を実行してください: |
||
# swapoff /dev/zram0 |
# swapoff /dev/zram0 |
||
− | # |
+ | # 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 上にスワップをセットアップする方法を示しています。これを行うために、追加のパッケージは必要ないはずです。 |
||
58行目: | 56行目: | ||
}} |
}} |
||
− | 必要 |
+ | 以下の [[udev ルール]]を作成してください。必要に応じて {{ic|disksize}} 属性を調整してください: |
− | {{hc|/etc/ |
+ | {{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/ |
+ | {{hc|/etc/fstab|2= |
+ | /dev/zram0 none swap defaults,discard,pri=100 0 0 |
||
− | KERNEL=="zram0", ATTR{disksize}="512M" RUN="/usr/bin/mkswap /dev/zram0", TAG+="systemd" |
||
− | KERNEL=="zram1", ATTR{disksize}="512M" RUN="/usr/bin/mkswap /dev/zram1", 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 |
||
+ | {{Pkg|zram-generator}} は、zram デバイスを自動的に初期化する {{ic|systemd-zram-setup@zram''N''.service}} ユニットを提供しています。ユーザーはこのテンプレートまたはインスタンスを手動で[[有効化/起動]]する必要はありません。{{man|8|zram-generator}} を参照してください。 |
||
− | /dev/zram1 none swap defaults 0 0 |
||
+ | |||
+ | Zram-generator を使うには、{{Pkg|zram-generator}} を[[インストール]]し、以下のような {{ic|/etc/systemd/zram-generator.conf}} を作成してください: |
||
+ | |||
+ | {{hc|/etc/systemd/zram-generator.conf|2= |
||
+ | [zram0] |
||
+ | zram-size = min(ram / 2, 4096) |
||
+ | compression-algorithm = zstd |
||
}} |
}} |
||
+ | {{ic|zram-size}} は zram デバイスのサイズ ({{ic|MiB}}) です。{{ic|ram}} という識別子でメモリ全体の容量を表すことができます。 |
||
− | {{TranslationStatus|zram|2023-01-14|764081}} |
||
+ | |||
+ | {{ic|compression-algorithm}} は zram デバイスでの圧縮に使用するアルゴリズムを指定します。{{ic|cat /sys/block/zram0/comp_algorithm}} を実行すれば、利用可能な圧縮アルゴリズムが列挙されます (現在利用されているものはカッコで囲われます)。 |
||
+ | {{man|5|zram-generator.conf}} を参照してください。 |
||
+ | |||
+ | 次に、[[daemon-reload]] を実行し、{{ic|systemd-zram-setup@zram''N''.service}} インスタンスを[[開始]]します ({{ic|''N''}} はインスタンス ID です。この例では {{ic|systemd-zram-setup@zram0.service}} となります。)。 |
||
+ | |||
+ | {{ic|systemd-zram-setup@zram''N''.service}} インスタンスの[[ユニットステータス]]を見るか、{{man|8|zramctl}} か {{man|8|swapon}} を使うことで {{ic|/dev/zram''N''}} デバイスの [[スワップ#スワップ領域|swap 状態]]を確認することができます。 |
||
+ | |||
+ | === 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 デバイスに対するランダム I/O は、ファイルシステムに対する I/O よりも桁違いに高速であるため、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-11-04|819848}} |
2024年11月4日 (月) 18:09時点における最新版
zram (以前は compcache と呼ばれていました) は、RAM 内に圧縮ブロックデバイスを作成するための Linux カーネルモジュールです。つまり、オンザフライのディスク圧縮を用いる RAM ディスクです。zram で作成されたブロックデバイスは、スワップとして使ったり、汎用 RAM ディスクとして使ったりすることができます。zram の最も一般的な2つの使用法は、一時ファイル (/tmp
) のストレージとスワップデバイスです。初期の zram には後者の機能しか存在しておらず、ゆえに元の名前は "compcache" ("compressed cache") でした。
目次
スワップとしての使用
最初の段階では、作成された zram ブロックデバイスは RAM を予約したり使用したりしません。ファイルをスワップアウトする必要が生じた場合にのみ、そのファイルは圧縮され、zram ブロックデバイスへ移動されます。zram ブロックデバイスは必要に応じて動的に拡大/縮小します。
Zstd の圧縮率が 1/2 までしか達しないと仮定したとしても (実際には圧縮率は 1/3 に達することが多いです)、zram は、メモリ圧縮を用いない場合より多くのデータを RAM 上に保管することができます。
まず最初に、システムメモリの半分の容量で設定してみましょう。
手動で
システムメモリの半分の容量を持ち、通常より高い優先度の、zstd で圧縮された zram デバイスを (現在のセッション限定で) セットアップするには:
# modprobe zram # zramctl /dev/zram0 --algorithm zstd --size "$(($(grep -Po 'MemTotal:\s*\K\d+' /proc/meminfo)/2))KiB" # mkswap -U clear /dev/zram0 # swapon --discard --priority 100 /dev/zram0
無効化するには、再起動するか、以下を実行してください:
# swapoff /dev/zram0 # modprobe -r zram # echo 1 > /sys/module/zswap/parameters/enabled
すべての手順、オプション、および潜在的な問題の詳細な説明は 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/zram
をfstab に追加し、デフォルトよりも高い優先度を割り当ててください:
/etc/fstab
/dev/zram0 none swap defaults,discard,pri=100 0 0
zram-generator を使う
zram-generator は、zram デバイスを自動的に初期化する systemd-zram-setup@zramN.service
ユニットを提供しています。ユーザーはこのテンプレートまたはインスタンスを手動で有効化/起動する必要はありません。zram-generator(8) を参照してください。
Zram-generator を使うには、zram-generator をインストールし、以下のような /etc/systemd/zram-generator.conf
を作成してください:
/etc/systemd/zram-generator.conf
[zram0] zram-size = min(ram / 2, 4096) compression-algorithm = zstd
zram-size
は zram デバイスのサイズ (MiB
) です。ram
という識別子でメモリ全体の容量を表すことができます。
compression-algorithm
は zram デバイスでの圧縮に使用するアルゴリズムを指定します。cat /sys/block/zram0/comp_algorithm
を実行すれば、利用可能な圧縮アルゴリズムが列挙されます (現在利用されているものはカッコで囲われます)。
zram-generator.conf(5) を参照してください。
次に、daemon-reload を実行し、systemd-zram-setup@zramN.service
インスタンスを開始します (N
はインスタンス ID です。この例では systemd-zram-setup@zram0.service
となります。)。
systemd-zram-setup@zramN.service
インスタンスのユニットステータスを見るか、zramctl(8) か swapon(8) を使うことで /dev/zramN
デバイスの swap 状態を確認することができます。
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 デバイスに対するランダム I/O は、ファイルシステムに対する I/O よりも桁違いに高速であるため、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
に書き込んでください:
# 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