「Zswap」の版間の差分
(→zswap のカスタマイズ: 同期) |
(同期) |
||
(同じ利用者による、間の7版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
[[en:Zswap]] |
[[en:Zswap]] |
||
+ | [[pt:Zswap]] |
||
+ | [[ru:Zswap]] |
||
+ | [[zh-hans:Zswap]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|カーネルパラメータ}} |
{{Related|カーネルパラメータ}} |
||
{{Related|Mkinitcpio}} |
{{Related|Mkinitcpio}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | [[Wikipedia:zswap|Wikipedia]] より: |
||
− | :"Zswap はスワップされたページのライトバックキャッシュを圧縮する Linux カーネルの機能です。スワップアウトされたときにメモリページをスワップデバイスに移動する代わりに、zswap は圧縮を行なってシステムの RAM 内のメモリプールに動的に保存します。" |
||
− | zswap はスワップ |
+ | [[Wikipedia:ja:zswap|zswap]] は、スワップページ用の圧縮された RAM キャッシュを提供する、カーネルの機能です。ページをディスクにスワップアウトしてしまうのではなく、RAM 内のメモリプールに圧縮して保存します。プールが満タンになったり RAM が枯渇したりすると、最近使用されていない ([[Wikipedia:Cache replacement policies#Least recently_used (LRU)|LRU]]) ページを解凍して (まるでインターセプトされなかったかのように) ディスクに書き込みます。ページがスワップキャッシュへ解凍された後、プール内の圧縮された方を解放できます。 |
+ | [[zram]] と異なる点は、''zram'' に作成されたスワップはそれ自体が RAM 内のスワップデバイスとして働いてバッキングスワップデバイスを必要としないのに対し、''zswap'' は[[スワップ]]デバイスと組み合わさって動作することです。 |
||
− | 要するに、zswap を使用するには[[スワップ]]デバイスを設定する必要があるということです。 |
||
== zswap を切り替える == |
== zswap を切り替える == |
||
− | + | すべての[[カーネル#公式サポートカーネル|公式にサポートされているカーネル]]で ''zswap'' はデフォルトで有効化されています。このことは、{{ic|zgrep CONFIG_ZSWAP_DEFAULT_ON /proc/config.gz}} を実行することで確認できます。 |
|
− | zswap を実行時に無効化するには、以下のコマンドを実行してください: |
+ | ''zswap'' を実行時に無効化するには、以下のコマンドを実行してください: |
# echo 0 > /sys/module/zswap/parameters/enabled |
# echo 0 > /sys/module/zswap/parameters/enabled |
||
− | zswap を永続的に無効化するには、{{ic|1=zswap.enabled=0}} を[[カーネルパラメータ]]に追加してください。 |
+ | ''zswap'' を永続的に無効化するには、{{ic|1=zswap.enabled=0}} を[[カーネルパラメータ]]に追加してください。 |
== zswap のカスタマイズ == |
== zswap のカスタマイズ == |
||
26行目: | 28行目: | ||
=== 現在のパラメータ === |
=== 現在のパラメータ === |
||
− | + | ''zswap'' には、カスタマイズ可能なパラメーターがいくつかあります。現在の設定は、次を使用して表示できます: |
|
− | {{hc|$ grep - |
+ | {{hc|$ grep -r . /sys/module/zswap/parameters/| |
/sys/module/zswap/parameters/same_filled_pages_enabled:Y |
/sys/module/zswap/parameters/same_filled_pages_enabled:Y |
||
/sys/module/zswap/parameters/enabled:Y |
/sys/module/zswap/parameters/enabled:Y |
||
/sys/module/zswap/parameters/max_pool_percent:20 |
/sys/module/zswap/parameters/max_pool_percent:20 |
||
− | /sys/module/zswap/parameters/compressor: |
+ | /sys/module/zswap/parameters/compressor:zstd |
− | /sys/module/zswap/parameters/ |
+ | /sys/module/zswap/parameters/non_same_filled_pages_enabled:Y |
+ | /sys/module/zswap/parameters/zpool:zsmalloc |
||
+ | /sys/module/zswap/parameters/exclusive_loads:N |
||
/sys/module/zswap/parameters/accept_threshold_percent:90 |
/sys/module/zswap/parameters/accept_threshold_percent:90 |
||
}} |
}} |
||
様々なパラメーターの説明については、[https://docs.kernel.org/admin-guide/mm/zswap.html zswap のドキュメント]を参照してください。 |
様々なパラメーターの説明については、[https://docs.kernel.org/admin-guide/mm/zswap.html zswap のドキュメント]を参照してください。 |
||
+ | |||
+ | {{ic|exclusive_loads}} パラメータ (現在 ''zswap'' のドキュメントには記述されていません) に関する詳細は [https://github.com/torvalds/linux/blob/9ed22ae6be817d7a3f5c15ca22cbc9d3963b481d/mm/Kconfig#L48 Linux カーネルのソースコード内にあるこのコメント]を見てください。 |
||
初期構成を示すブート時ロードメッセージは、次のコマンドで取得できます: |
初期構成を示すブート時ロードメッセージは、次のコマンドで取得できます: |
||
{{hc|# dmesg {{!}} grep zswap:| |
{{hc|# dmesg {{!}} grep zswap:| |
||
− | [ 0.317569] zswap: loaded using pool |
+ | [ 0.317569] zswap: loaded using pool zstd/zsmalloc |
}} |
}} |
||
60行目: | 66行目: | ||
ブートパラメータを介して圧縮アルゴリズムを変更する場合、対応する圧縮モジュールがブートの早い段階でロードされていることを確認する必要があります ([[#圧縮アルゴリズム]] を参照)。 |
ブートパラメータを介して圧縮アルゴリズムを変更する場合、対応する圧縮モジュールがブートの早い段階でロードされていることを確認する必要があります ([[#圧縮アルゴリズム]] を参照)。 |
||
− | |||
− | ==== systemd-swap の使用 ==== |
||
− | |||
− | {{Note|(systemd-swap の) 作者は、代わりに {{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-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| |
||
− | * ジャーナルに {{ic|systemd-swap[..]: WARN: swapFC: ENOSPC}} という警告が表示され続け、スワップファイルが作成されない場合、{{ic|/etc/systemd/swap.conf}} 内の {{ic|1=swapfc_force_preallocated=1}} をアンコメント・設定する必要があります。 |
||
− | * systemd-swap によって作成されるスワップファイルは、簡単には[[ハイバネート]]に使用できません。[https://github.com/Nefelim4ag/systemd-swap/issues/85 systemd-swap issue 85] を参照してください。 |
||
− | }} |
||
=== 最大プールサイズ === |
=== 最大プールサイズ === |
||
82行目: | 73行目: | ||
=== 圧縮メモリプールアロケータ === |
=== 圧縮メモリプールアロケータ === |
||
− | ''zpool'' パラメータは |
+ | ''zpool'' パラメータは圧縮メモリプールの管理を制御します。 |
''zbud'' データアロケーターを使用すると、2つの圧縮オブジェクトが1ページに格納され、圧縮率が2以下に制限されます。 |
''zbud'' データアロケーターを使用すると、2つの圧縮オブジェクトが1ページに格納され、圧縮率が2以下に制限されます。 |
||
− | + | [https://docs.kernel.org/mm/z3fold.html z3fold] アロケーターでは、ページごとに最大3つの圧縮オブジェクトを使用できます。''z3fold'' の圧縮率は通常平均2.7ですが、''zbud'' の圧縮率は1.7です。 |
|
− | タイプ ''z3fold'' の ''zpool'' がデフォルトで作成されます。カーネルパラメータ {{ic|zswap.zpool}} を使用して、起動時に別の |
+ | タイプ ''z3fold'' の ''zpool'' がデフォルトで作成されます。カーネルパラメータ {{ic|zswap.zpool}} を使用して、起動時に別のアロケータを選択してください。データアロケータは、''sysfs'' インターフェースを介して後の段階で変更することもできます。 |
+ | |||
+ | より最近のカーネル (6.3.arch1-1 以降) では、[https://docs.kernel.org/mm/zsmalloc.html zsmalloc] アロケータが追加されています。これは、メモリが少ない状況で良く動作するとされており、より多くのメモリを削減します。 |
||
=== 圧縮アルゴリズム === |
=== 圧縮アルゴリズム === |
||
+ | {{Out of date|{{Pkg|linux}} 6.3.arch1-1+ では {{ic|1=CONFIG_ZSWAP_COMPRESSOR_DEFAULT="zstd"}} が設定されています。[https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/blob/main/config]}} |
||
− | ページ圧縮の場合、zswap はカーネルの暗号化 API によって提供されるコンプレッサーモジュールを使用します。デフォルトでは ''lz4'' 圧縮アルゴリズムを使用しますが、これは起動時に {{ic|1=zswap.compressor}} で変更できます。その他のオプションには、''deflate''、''lz4hc''、''lzo''、''lzo-rle''、''842''、''zstd'' があります。 |
||
+ | ページ圧縮の場合、''zswap'' はカーネルの暗号化 API によって提供されるコンプレッサーモジュールを使用します。デフォルトでは ''lz4'' 圧縮アルゴリズムを使用しますが、これは起動時に {{ic|1=zswap.compressor}} で変更できます。その他のオプションには、''deflate''、''lz4hc''、''lzo''、''lzo-rle''、''842''、''zstd'' があります。 |
||
− | 実行中に ''sysfs'' または ''systemd-swap'' を使用して圧縮を変更することに問題はありませんが、この場合、 zswap は ''lz4'' で開始し、後の段階で定義されたアルゴリズムに切り替わります。別のアルゴリズムで zswap をすぐに開始するには、これをカーネルのブートパラメータを介して設定し、対応するモジュールをカーネルによって早期にロードする必要があります。これは、次の手順に従って実行できます: |
||
+ | |||
+ | 実行中に ''sysfs'' を使用して圧縮を変更することに問題はありませんが、この場合、 ''zswap'' は ''lz4'' で開始し、後の段階で定義されたアルゴリズムに切り替わります。別のアルゴリズムで ''zswap'' をすぐに開始するには、これをカーネルのブートパラメータを介して設定し、対応するモジュールをカーネルによって早期にロードする必要があります。これは、次の手順に従って実行できます: |
||
# 選んだコンプレッサーに関連するモジュールを [[mkinitcpio#MODULES]] 配列に追加する。 |
# 選んだコンプレッサーに関連するモジュールを [[mkinitcpio#MODULES]] 配列に追加する。 |
||
100行目: | 95行目: | ||
# [[カーネルパラメータ]] で {{ic|1=zswap.compressor}} をあなたの選んだアルゴリズムに設定します。 |
# [[カーネルパラメータ]] で {{ic|1=zswap.compressor}} をあなたの選んだアルゴリズムに設定します。 |
||
− | 次回の起動時に、[[#現在のパラメータ]] を参照して、zswap が要求されたコンプレッサーを使用するかどうかを確認してください。 |
+ | 次回の起動時に、[[#現在のパラメータ]] を参照して、''zswap'' が要求されたコンプレッサーを使用するかどうかを確認してください。 |
+ | |||
+ | == Zswap の統計 == |
||
+ | |||
+ | ''zswap'' の統計を見るには、以下を実行してください: |
||
+ | |||
+ | {{hc|# grep -r . /sys/kernel/debug/zswap| |
||
+ | duplicate_entry:0 |
||
+ | pool_limit_hit:13404213 |
||
+ | pool_total_size:6184960 (pool size in total in pages) |
||
+ | reject_alloc_fail:5 |
||
+ | reject_compress_poor:0 |
||
+ | reject_kmemcache_fail:0 |
||
+ | reject_reclaim_fail:13404213 |
||
+ | stored_pages:4251 (pool size after compression) |
||
+ | written_back_pages:0 |
||
+ | }} |
||
== 参照 == |
== 参照 == |
||
106行目: | 117行目: | ||
* [https://lore.kernel.org/lkml/1674223.HVFdAhB7u5@merkaba/ zswap: How to determine whether it is compressing swap pages?]。 |
* [https://lore.kernel.org/lkml/1674223.HVFdAhB7u5@merkaba/ zswap: How to determine whether it is compressing swap pages?]。 |
||
* [https://www.ibm.com/support/pages/new-linux-zswap-compression-functionality IBM Support 記事 "New Linux zswap compression functionality" (ベンチマーク画像がロードされず)]。 |
* [https://www.ibm.com/support/pages/new-linux-zswap-compression-functionality IBM Support 記事 "New Linux zswap compression functionality" (ベンチマーク画像がロードされず)]。 |
||
− | * [https://askubuntu.com/questions/471912/zram-vs-zswap-vs-zcache-ultimate-guide-when-to-use-which-one Ask Ubuntu: zram vs. zswap vs. zcache]。 |
+ | * [https://askubuntu.com/questions/471912/zram-vs-zswap-vs-zcache-ultimate-guide-when-to-use-which-one Ask Ubuntu: zram vs. zswap vs. zcache]。(zcache は非推奨です) |
* [https://bbs.archlinux.org/viewtopic.php?id=169585 Arch Linux フォーラムスレッド]。 |
* [https://bbs.archlinux.org/viewtopic.php?id=169585 Arch Linux フォーラムスレッド]。 |
||
* [https://lwn.net/Articles/537422/ zswap のメイン開発者による LWN.net 技術記事]。 |
* [https://lwn.net/Articles/537422/ zswap のメイン開発者による LWN.net 技術記事]。 |
||
+ | |||
+ | {{TranslationStatus|Zswap|2023-10-03|788810}} |
2023年10月3日 (火) 13:52時点における最新版
関連記事
zswap は、スワップページ用の圧縮された RAM キャッシュを提供する、カーネルの機能です。ページをディスクにスワップアウトしてしまうのではなく、RAM 内のメモリプールに圧縮して保存します。プールが満タンになったり RAM が枯渇したりすると、最近使用されていない (LRU) ページを解凍して (まるでインターセプトされなかったかのように) ディスクに書き込みます。ページがスワップキャッシュへ解凍された後、プール内の圧縮された方を解放できます。
zram と異なる点は、zram に作成されたスワップはそれ自体が RAM 内のスワップデバイスとして働いてバッキングスワップデバイスを必要としないのに対し、zswap はスワップデバイスと組み合わさって動作することです。
目次
zswap を切り替える
すべての公式にサポートされているカーネルで zswap はデフォルトで有効化されています。このことは、zgrep CONFIG_ZSWAP_DEFAULT_ON /proc/config.gz
を実行することで確認できます。
zswap を実行時に無効化するには、以下のコマンドを実行してください:
# echo 0 > /sys/module/zswap/parameters/enabled
zswap を永続的に無効化するには、zswap.enabled=0
をカーネルパラメータに追加してください。
zswap のカスタマイズ
現在のパラメータ
zswap には、カスタマイズ可能なパラメーターがいくつかあります。現在の設定は、次を使用して表示できます:
$ grep -r . /sys/module/zswap/parameters/
/sys/module/zswap/parameters/same_filled_pages_enabled:Y /sys/module/zswap/parameters/enabled:Y /sys/module/zswap/parameters/max_pool_percent:20 /sys/module/zswap/parameters/compressor:zstd /sys/module/zswap/parameters/non_same_filled_pages_enabled:Y /sys/module/zswap/parameters/zpool:zsmalloc /sys/module/zswap/parameters/exclusive_loads:N /sys/module/zswap/parameters/accept_threshold_percent:90
様々なパラメーターの説明については、zswap のドキュメントを参照してください。
exclusive_loads
パラメータ (現在 zswap のドキュメントには記述されていません) に関する詳細は Linux カーネルのソースコード内にあるこのコメントを見てください。
初期構成を示すブート時ロードメッセージは、次のコマンドで取得できます:
# dmesg | grep zswap:
[ 0.317569] zswap: loaded using pool zstd/zsmalloc
パラメータの設定
sysfs の使用
各設定は、sysfs インターフェースを介して実行中に変更できます。例えば、compressor
パラメータを変更するには:
# echo lz4 > /sys/module/zswap/parameters/compressor
カーネルブートパラメータの使用
パラメータの変更を永続化するには、対応するオプション (例えば zswap.compressor=lz4
など) をカーネルブートパラメータに追加する必要があります。したがって、上記のすべての設定を永続的に設定するには、次のカーネルパラメータを追加する必要があります:
zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold
ブートパラメータを介して圧縮アルゴリズムを変更する場合、対応する圧縮モジュールがブートの早い段階でロードされていることを確認する必要があります (#圧縮アルゴリズム を参照)。
最大プールサイズ
メモリプールは事前に割り当てられません。使用可能な合計メモリのパーセンテージによる特定の制限まで (デフォルトでは合計 RAM の最大20%まで) 拡張できます。このしきい値に達すると、ページはプールからスワップデバイスに追い出されます。圧縮されたプールの最大サイズは、パラメーター max_pool_percent
で制御されます。
圧縮メモリプールアロケータ
zpool パラメータは圧縮メモリプールの管理を制御します。
zbud データアロケーターを使用すると、2つの圧縮オブジェクトが1ページに格納され、圧縮率が2以下に制限されます。
z3fold アロケーターでは、ページごとに最大3つの圧縮オブジェクトを使用できます。z3fold の圧縮率は通常平均2.7ですが、zbud の圧縮率は1.7です。
タイプ z3fold の zpool がデフォルトで作成されます。カーネルパラメータ zswap.zpool
を使用して、起動時に別のアロケータを選択してください。データアロケータは、sysfs インターフェースを介して後の段階で変更することもできます。
より最近のカーネル (6.3.arch1-1 以降) では、zsmalloc アロケータが追加されています。これは、メモリが少ない状況で良く動作するとされており、より多くのメモリを削減します。
圧縮アルゴリズム
ページ圧縮の場合、zswap はカーネルの暗号化 API によって提供されるコンプレッサーモジュールを使用します。デフォルトでは lz4 圧縮アルゴリズムを使用しますが、これは起動時に zswap.compressor
で変更できます。その他のオプションには、deflate、lz4hc、lzo、lzo-rle、842、zstd があります。
実行中に sysfs を使用して圧縮を変更することに問題はありませんが、この場合、 zswap は lz4 で開始し、後の段階で定義されたアルゴリズムに切り替わります。別のアルゴリズムで zswap をすぐに開始するには、これをカーネルのブートパラメータを介して設定し、対応するモジュールをカーネルによって早期にロードする必要があります。これは、次の手順に従って実行できます:
- 選んだコンプレッサーに関連するモジュールを mkinitcpio#MODULES 配列に追加する。
- mkinitcpio の設定を変更した後、RAM ディスク環境を再生成する。mkinitcpio#イメージ作成とアクティベーション を参照してください。
- カーネルパラメータ で
zswap.compressor
をあなたの選んだアルゴリズムに設定します。
次回の起動時に、#現在のパラメータ を参照して、zswap が要求されたコンプレッサーを使用するかどうかを確認してください。
Zswap の統計
zswap の統計を見るには、以下を実行してください:
# grep -r . /sys/kernel/debug/zswap
duplicate_entry:0 pool_limit_hit:13404213 pool_total_size:6184960 (pool size in total in pages) reject_alloc_fail:5 reject_compress_poor:0 reject_kmemcache_fail:0 reject_reclaim_fail:13404213 stored_pages:4251 (pool size after compression) written_back_pages:0