「スワップ」の版間の差分
(→スワップパーティション: 同期) |
(同期) |
||
| (2人の利用者による、間の39版が非表示) | |||
| 1行目: | 1行目: | ||
[[Category:ファイルシステム]] |
[[Category:ファイルシステム]] |
||
| + | [[de:Swap]] |
||
[[en:Swap]] |
[[en:Swap]] |
||
[[es:Swap]] |
[[es:Swap]] |
||
[[fr:Swap]] |
[[fr:Swap]] |
||
[[hu:Swap]] |
[[hu:Swap]] |
||
| − | [[it:Swap]] |
||
[[pt:Swap]] |
[[pt:Swap]] |
||
| + | [[ru:Swap]] |
||
[[zh-hans:Swap]] |
[[zh-hans:Swap]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
| − | {{Related| |
+ | {{Related|fstab}} |
| + | {{Related|ハイバネート}} |
||
| + | {{Related|zswap}} |
||
| + | {{Related|zram}} |
||
{{Related|ビデオメモリにスワップ}} |
{{Related|ビデオメモリにスワップ}} |
||
{{Related|ZFS#スワップボリューム}} |
{{Related|ZFS#スワップボリューム}} |
||
| − | {{Related|fstab}} |
||
| − | {{Related|サスペンドとハイバネート}} |
||
{{Related|Dm-crypt/スワップの暗号化}} |
{{Related|Dm-crypt/スワップの暗号化}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
| − | このページでは GNU/Linux でのスワップとページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。 |
||
| + | このページでは GNU/Linux での[[Wikipedia:ja:ページング方式|スワップ領域とページング]]を紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。 |
||
| − | [https://www.linux.com/news/software/applications/8208-all-about-linux-swap-space All about Linux swap space] より: |
||
| + | |||
| + | [https://www.linux.com/news/all-about-linux-swap-space/ All about Linux swap space] より: |
||
| − | :''Linux は物理 RAM (random access memory) をページと呼ばれるメモリのかたまりに分割します。スワッピングとは、メモリを |
+ | :''Linux は物理 RAM (random access memory) をページと呼ばれるメモリのかたまりに分割します。スワッピングとは、メモリを解放するために、ページがスワップ領域という名の事前設定領域にコピーされることを言います。物理メモリとスワップ領域の合計が利用できる仮想メモリのサイズになります。'' |
スワップのサポートは Linux カーネルにより提供され、ユーザスペースのユーティリティは {{Pkg|util-linux}} パッケージに存在します。 |
スワップのサポートは Linux カーネルにより提供され、ユーザスペースのユーティリティは {{Pkg|util-linux}} パッケージに存在します。 |
||
| 25行目: | 28行目: | ||
== スワップ領域 == |
== スワップ領域 == |
||
| − | スワップ領域は普通ディスクパーティションとして作られますが、ファイルにすることもできます。Arch Linux のインストール中にユーザーはスワップ領域を作成することができ、必要であればインストール後でも作成できます。スワップ領域を作成する理由は2つあります: 仮想メモリを拡張して、搭載している物理メモリ(RAM)より多くするためと、[[サスペンドとハイバネート|suspend-to-disk(ハイバネート)]] をするためです。 |
+ | スワップ領域は普通ディスクパーティションとして作られますが、ファイルにすることもできます。Arch Linux のインストール中にユーザーはスワップ領域を作成することができ、必要であればインストール後でも作成できます。スワップ領域を作成する理由は2つあります: 仮想メモリを拡張して、搭載している物理メモリ(RAM)より多くするためと、[[電源管理/サスペンドとハイバネート|suspend-to-disk(ハイバネート)]] をするためです。 |
| − | スワップを使って仮想メモリを拡張することが利益になるかどうかは搭載している物理メモリの容量によります。必要なプログラムをすべて実行するのに必要な量の物理メモリを搭載していないのであれば、スワップを作成することは''おそらく''利益となるでしょう。これにより、[[Wikipedia:Out of memory|out of memory(メモリ不足)]] を避けることができます。Out of memory とは、Linux カーネルの OOM killer という仕組みが自動的にプロセスを kill してメモリの空き領域を作ろうとしている状態のことを言います。仮想メモリの容量を必要な量まで増やすには、足りない分をスワップ領域として追加してください。 |
+ | スワップを使って仮想メモリを拡張することが利益になるかどうかは搭載している物理メモリの容量により異なります。必要なプログラムをすべて実行するのに必要な量の物理メモリを搭載していないのであれば、スワップを作成することは''おそらく''利益となるでしょう。これにより、[[Wikipedia:Out of memory|out of memory(メモリ不足)]] を避けることができます。Out of memory とは、Linux カーネルの OOM killer という仕組みが自動的にプロセスを kill してメモリの空き領域を作ろうとしている状態のことを言います。仮想メモリの容量を必要な量まで増やすには、足りない分をスワップ領域として追加してください。 |
| − | スワップの最大の欠点はパフォーマンス |
+ | メモリが枯渇しているときにスワップを使用することの最大の欠点は、パフォーマンスが低下することです([[#パフォーマンス]] セクションを見てください)。それゆえ、スワップを有効化するかどうかは個人の好みの問題となります。スワップを有効化するよりメモリが枯渇したときにプロセスが kill されるほうが良いという人もいますし、メモリが枯渇したときにシステムが低速化するがスワップを有効化したほうが良いという人もいます。 |
| − | |||
| − | {{Note|スワップファイルとパーティションにパフォーマンスの違いはありません、どちらも同じように扱われます。}} |
||
スワップの状態を確認するには、次を実行: |
スワップの状態を確認するには、次を実行: |
||
| + | |||
$ swapon --show |
$ swapon --show |
||
| − | もしくは、以下を実行して物理メモリとスワップの使用状況を表示 |
+ | もしくは、以下を実行して物理メモリとスワップの使用状況を表示: |
| + | |||
$ free -h |
$ free -h |
||
== スワップパーティション == |
== スワップパーティション == |
||
| − | + | [[パーティショニング#スワップ|スワップパーティション]]は、ほとんどの GNU/Linux の[[パーティショニングツール]]で作成することができます。スワップパーティションは、GPT 上ではパーティションタイプ GUID {{ic|0657FD6D-A4AB-43C4-84E5-0933C84B4F4F}} が ([[gdisk]] では {{ic|8200}} タイプ、[[fdisk]] では {{ic|swap}} タイプ)、MBR 上ではタイプ ID {{ic|82}} が指定されています。 |
|
| − | Linux のスワップ領域をセットアップする時には、{{ |
+ | Linux のスワップ領域をセットアップする時には、{{man|8|mkswap}} コマンドが使われます。例えば: |
# mkswap /dev/sd''xy'' |
# mkswap /dev/sd''xy'' |
||
| 53行目: | 56行目: | ||
# swapon /dev/sd''xy'' |
# swapon /dev/sd''xy'' |
||
| + | オプションについては {{man|8|swapon}} を参照してください。 |
||
| − | 起動時にスワップパーティションを有効にするには、エントリを {{ic|/etc/fstab}} に追加します: |
||
| + | === 起動時に有効化する === |
||
| − | UUID=''device_UUID'' none swap defaults 0 0 |
||
| + | スワップパーティションをブート時に有効化するには: |
||
| − | {{ic|''device_UUID''}} の部分はスワップ領域の [[UUID]] に変更してください。 |
||
| + | * [[systemd#GPT パーティションの自動マウント]]を使う |
||
| − | ファイルの構文については [[fstab]] を見てください。 |
||
| + | * あるいは、{{ic|/etc/fstab}} にエントリを追加する。例: {{bc|1=UUID=''device_UUID'' none swap defaults 0 0}} |
||
| + | :{{ic|''device_UUID''}} はスワップ領域の [[UUID]] です。 |
||
| − | {{Note|GPT を使用しているデバイス上にスワップパーティションを配置した場合は fstab のエントリを作成するかどうかは任意です。[[#systemd による有効化|次のサブセクション]] を見てください。}} |
||
| + | {{ic|fstab}} ファイルの構文については [[fstab]] を見てください。また、[[systemd#systemd.mount - マウント]] も参照してください。 |
||
| − | {{Warning|swapon を使用している場合、mdadm を使用する RAID セットアップで discard を有効にすると起動時や起動中にシステムがフリーズします。}} |
||
| − | |||
| − | === systemd による有効化 === |
||
| − | |||
| − | [[systemd]] は2つの異なる仕組みを使ってスワップパーティションを有効化します。どちらも実行可能ファイルは {{ic|/usr/lib/systemd/system-generators}} にあります。ジェネレータは起動時に実行され、マウントごとにネイティブの systemd ユニットを作成します。まず {{ic|systemd-fstab-generator}} が fstab を読み込んでユニットを生成します (スワップのユニットも)。次に {{ic|systemd-gpt-auto-generator}} が root ディスクを調査してユニットを生成します。後者は GPT ディスク上でのみ動作し、パーティションのタイプ GUID を見てスワップパーティションかどうかを識別します。さらなる情報については [[systemd#GPT パーティションの自動マウント]] を見てください。 |
||
=== スワップの無効化 === |
=== スワップの無効化 === |
||
| 77行目: | 77行目: | ||
もしくは {{ic|-a}} スイッチを使って全てのスワップ領域を無効化することもできます。 |
もしくは {{ic|-a}} スイッチを使って全てのスワップ領域を無効化することもできます。 |
||
| − | スワップ |
+ | スワップは systemd によって管理されているため、次の起動時にスワップが自動的に有効化されてしまいます。検出されたスワップ領域を自動的に有効化する機能を恒久的に無効にするには、{{ic|systemctl --type swap}} を実行して問題の ''.swap'' ユニットを確認して[[マスク]]してください。 |
== スワップファイル == |
== スワップファイル == |
||
| − | パーティションを作るかわりに、 |
+ | パーティションを作るかわりに、臨機応変にサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。 |
| + | {| class="wikitable sortable" |
||
| − | {{Warning|[[Btrfs]]は、 Linux カーネルバージョン5.0 以降の制限付きのスワップファイルをサポートしています。 詳細については、 [https://wiki.archlinux.jp/index.php/Btrfs#.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB Btrfs#スワップファイル] を参照してください。}} |
||
| + | ! ファイルシステム |
||
| + | ! スワップファイルのサポート |
||
| + | |- |
||
| + | | [[Bcachefs]] |
||
| + | | {{No|https://github.com/koverstreet/bcachefs/issues/368}} |
||
| + | |- |
||
| + | | [[Btrfs]] |
||
| + | | {{G|[[Btrfs#Swap file|Yes]]}} |
||
| + | |- |
||
| + | | [[F2FS]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[ext4]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[JFS]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[Wikipedia:NILFS|NILFS2]] |
||
| + | | {{No}} |
||
| + | |- |
||
| + | | [[NTFS3]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[Wikipedia:ReiserFS|ReiserFS]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[XFS]] |
||
| + | | {{Yes}} |
||
| + | |- |
||
| + | | [[ZFS]] |
||
| + | | {{No}} |
||
| + | |} |
||
| + | === スワップファイルの作成 === |
||
| − | === 手動設定 === |
||
| + | {{Note|[[Btrfs]] については、以下の手順ではなく [[Btrfs#スワップファイル]] で説明されている手順に従ってください。}} |
||
| − | ==== スワップファイルの作成 ==== |
||
| − | + | {{man|8|mkswap}} を使用して、所望のサイズのスワップファイルを作成します (ヒントは [[パーティショニング#スワップ]] を参照してください)。たとえば、4 GiB のスワップファイルを作成します: |
|
| − | # |
+ | # mkswap -U clear --size 4G --file /swapfile |
| − | または: |
||
| − | # dd if=/dev/zero of=/swapfile bs=1M count=512 |
||
| + | スワップファイルを有効化してください: |
||
| − | {{Note|1=[[F2FS]] や [[XFS]] などのファイルシステムでは ''fallocate'' を使うと問題が発生します [https://bugzilla.redhat.com/show_bug.cgi?id=1129205#c3]。}} |
||
| + | # swapon /swapfile |
||
| − | 正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります) |
||
| + | 最後に、fstab 設定を編集してスワップファイルのエントリを追加してください: |
||
| − | # chmod 600 /swapfile |
||
| + | {{hc|/etc/fstab| |
||
| − | 正確なサイズのファイルを作成した後、ファイルをスワップにフォーマット: |
||
| + | /swapfile none swap defaults 0 0 |
||
| + | }} |
||
| + | fstab にエントリを追加する以外に、スワップユニットを作成する方法もあります ({{man|5|systemd.swap}} を参照): |
||
| − | # mkswap /swapfile |
||
| + | {{hc|/etc/systemd/system/swapfile.swap|2= |
||
| − | スワップファイルを有効に: |
||
| + | [Swap] |
||
| + | What=/swapfile |
||
| + | [Install] |
||
| − | # swapon /swapfile |
||
| + | WantedBy=swap.target |
||
| + | }} |
||
| + | 作成後は [[daemon-reload]] を実行し、{{ic|swapfile.swap}} を[[有効化]]してください。 |
||
| − | [[Fstab#ファイル例|fstab]] を編集してスワップファイルのエントリを加えて下さい: |
||
| + | 追加の情報については [[fstab#使用法]] を見てください。 |
||
| − | {{hc|/etc/fstab|/swapfile none swap defaults 0 0}} |
||
| + | |||
| + | {{Note|スワップファイルは、UUID や ラベルではなくファイルシステム上の位置により指定されなければなりません。}} |
||
==== スワップファイルの削除 ==== |
==== スワップファイルの削除 ==== |
||
| − | スワップファイルを削除するには、 |
+ | スワップファイルを削除するには、まずスワップファイルを無効にしなければなりません。その後、スワップファイルを削除できます: |
| − | |||
| − | root 権限で: |
||
| − | |||
| − | # swapoff -a |
||
| − | |||
| − | スワップファイルの削除: |
||
| + | # swapoff /swapfile |
||
# rm -f /swapfile |
# rm -f /swapfile |
||
| − | 最後に {{ic|/etc/fstab}} からエントリを削除し |
+ | 最後に {{ic|/etc/fstab}} から該当するエントリを削除してください。 |
| + | == スワップの暗号化 == |
||
| − | === 自動設定 === |
||
| − | ==== systemd-swap ==== |
||
| + | [[dm-crypt/スワップの暗号化]]を見て下さい。 |
||
| − | systemd-swap は、zram スワップ、スワップファイル、およびスワップパーティションからハイブリッドスワップスペースを作成するためのスクリプトです。 systemd プロジェクトとは提携していません。 |
||
| + | == パフォーマンス == |
||
| − | [[インストール]] は {{pkg|systemd-swap}} パッケージです。 {{ic|/etc/systemd/swap.conf}} の ''スワップファイルチャンク'' セクションで、コメントを解除して {{ic|1=swapfc_enabled=1}} を設定し、 {{ic|systemd-swap}} サービスを [[起動]]・[[有効化]] します。 |
||
| + | 通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。データを保持しておくのに十分な物理メモリが無い場合、スワップアウトできないとファイルシステムキャッシュのためのメモリが足りなくなってしまいます。その結果、ディスクへのアクセスが増加し、負荷が増加します。 |
||
| − | 詳細と設定については、 [https://github.com/Nefelim4ag/systemd-swap authors GitHub] ページにアクセスしてください [https://github.com/Nefelim4ag/systemd-swap/blob/master/README.md# about-構成推奨構成]。 |
||
| + | スワップ値を変えることでパフォーマンスを向上できるかもしれません。 |
||
| − | {{Note| |
||
| − | * ジャーナルに次の警告 {{ic|systemd-swap[..]: WARN: swapFC: ENOSPC}} が表示され続け、スワップファイルが作成されていない場合は、次のコメントを解除して {{ic|1=swapfc_force_preallocated=1}} を {{ic|/etc/systemd/swap.conf}} に設定してください。 |
||
| − | * systemd-swap で作成したスワップファイルは、[https://wiki.archlinux.jp/index.php/%E3%82%B5%E3%82%B9%E3%83%9A%E3%83%B3%E3%83%89%E3%81%A8%E3%83%8F%E3%82%A4%E3%83%90%E3%83%8D%E3%83%BC%E3%83%88#.E3.83.8F.E3.82.A4.E3.83.90.E3.83.8D.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3 ハイバネーション] には簡単に使用できません。 [https://github.com/Nefelim4ag/systemd-swap/issues/85 systemd-swap issue85] を参照してください。 |
||
| − | }} |
||
| + | === Swappiness === |
||
| − | == USB デバイスとスワップ == |
||
| + | メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。 |
||
| − | Linux によるモジュール性のおかげで、私達は他のデバイスにわたる複数のスワップパーティションを使うことができます。あなたがひとつの完全なハードディスクを持っている場合、USB デバイスを一時パーティションとして使うことができます。ただしこのメソッドにはいくつか欠点も存在します: |
||
| − | * USB デバイスはハードディスクより低速です。 |
||
| − | * フラッシュメモリには書き込み回数の上限があります。スワップパーティションとして使うと急速に書き込み可能回数を消費します。 |
||
| − | * 他のデバイスをコンピュータに接続したときに、スワップが使われません。 |
||
| + | ''Swappiness'' [[sysctl]] パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。 |
||
| − | USB デバイスをスワップに加えるには、まず USB フラッシュをスワップパーティションとしてパーティショニングします。Gparted などのグラフィカルツールや fdisk などのコンソールツールが使えます。パーティションテーブルを書き込む前にパーティションをスワップとしてラベル付けすることを忘れないで下さい。 |
||
| − | {{Warning|パーティションの書き込み先のディスクが正しいか確認しましょう!}} |
||
| + | {{Note|Swappiness がメモリの閾値に影響を与えたり、スワップ領域を使用させなくしたりするとよく誤解されます。しかし、この値は、スワップとファイルページのどちらを優先して解放するかだけに影響を与えます。より詳細な説明は[https://www.howtogeek.com/449691/what-is-swapiness-on-linux-and-how-to-change-it/ この記事]を、あるいはこの値が使われている[https://github.com/torvalds/linux/blob/v6.2/mm/vmscan.c#L3000-L3014 カーネルのソースコード]を参照してください。}} |
||
| − | {{Ic|fstab}} を編集してスワップエントリのマウントオプションに以下を追加してください: |
||
| + | 現在の swappiness 値をチェックするには: |
||
| − | pri=0 |
||
| + | $ sysctl vm.swappiness |
||
| − | USB が満杯の時はハードディスクのスワップのみを使うようになります。 |
||
| − | + | 代わりに {{ic|/proc/sys/vm/swappiness}} ファイルを読むことで生の整数値を得ることができます。 |
|
| + | swappiness 値を一時的にセットするには: |
||
| − | == スワップの暗号化 == |
||
| + | # sysctl -w vm.swappiness=35 |
||
| − | [[dm-crypt/スワップの暗号化]]を見て下さい。 |
||
| + | swappiness 値を永続的にセットするには、{{man|5|sysctl.d}} 設定ファイルを作成します。例えば: |
||
| − | == パフォーマンスチューニング == |
||
| + | {{hc|/etc/sysctl.d/99-swappiness.conf|2= |
||
| − | スワップ値を変えることでパフォーマンスを向上できるかもしれません。 |
||
| + | vm.swappiness = 35 |
||
| + | }} |
||
| + | [[ブートローダー]]を使ってカーネルのロード時に swappiness を設定するには、[[カーネルパラメータ]]を追加してください。例えば: {{ic|1=sysctl.vm.swappiness=35}}。 |
||
| − | === Swappiness === |
||
| + | 他の swappiness 値を選択する理由としては以下があります: |
||
| − | ''swappiness'' [[sysctl]] パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 100 の間の値にすることができます。デフォルトの値は60です。このパラメータを低い値に設定すると RAM からのスワッピングが減り、多くのシステムでレスポンスが向上することが知られています。 |
||
| + | * デスクトップの応答性のために swappiness を下げることが[https://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that 提案されている]から。この主張の言わんとしていることは、知覚されるパフォーマンス (応答性) はプログラムがユーザーの入力にいかに速く応答するかによるため、anonymous ページ (プログラムのメモリ) は RAM 内に留めておくべきであり、''実際の''パフォーマンスを多少犠牲にしてでも開いたファイルの解放を優先させるべきというものです。 |
||
| − | 現在の swappiness 値をチェックするには: |
||
| + | ** [https://chrisdown.name/2018/01/02/in-defence-of-swap.html 妥当な swappiness の最小値]は 1 です。Swappiness を 0 にすると、anonymous ページのエビクションに対して極端なバイアスが掛かり、メモリ争奪の極端な状況を除いて anonymous ページを reclaim やスワップするためにスキャンできなくなります。全く使用されていない anonymous ページを reclaim しないことは一般に望ましくありません。 |
||
| + | * 100 以上の高い swappiness に設定することは、スワップする IO コストがファイルからの読み出しコストと同じかより小さい場合に (定義上) 望ましいから。このような状況は[https://lists.ubuntu.com/archives/lubuntu-users/2013-October/005831.html スワップがディスクをバッキングデバイスとして使用していない]場合 (特に [[zram]] を使用している場合) に起こり得ます。また、スワップ IO が [[zswap]] などの低コストなメカニズムによってインターセプト/キャッシュされる場合にも起こり得ます。 |
||
| + | === VFS cache pressure === |
||
| − | $ cat /proc/sys/vm/swappiness |
||
| + | スワップのパフォーマンスに影響を与えるもう1つの ''sysctl'' パラメーターは {{ic|vm.vfs_cache_pressure}} です。このパラメータは、ページキャッシュとスワップと比較して、VFS キャッシュのキャッシングのために使用されているメモリをカーネルが reclaim する優先度を制御します。この値を増やすと、VFS キャッシュが reclaim される割合が上がります。このパラメータの詳細は [https://docs.kernel.org/admin-guide/sysctl/vm.html Linux カーネルのドキュメント]を参照してください。 |
||
| − | swappiness 値を一時的にセットするには: |
||
| + | デフォルトの値は 100 です。この場合、ファイルシステムのキャッシュは他のキャッシュと同じくらい重要ということになり、両方のキャッシュは同じ重みで reclaim されます。デスクトップでは、ファイルシステムのブラウジング時間は操作のレイテンシ (知覚される応答性) に影響を与えるから[https://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that ファイルシステムのキャッシュは他のキャッシュよりも重要である]ため、VFS cache pressure は 50 に設定するべきと主張されています。一方、VFS キャッシュに二度とアクセスされない多くの小さなファイルのメタデータが保持されている場合、より大きな値に設定することが[https://docs.gluster.org/en/main/Administrator-Guide/Linux-Kernel-Tuning/#vmvfs_cache_pressure 提案されています]。このパラメータのチューニングに関する詳細は [https://web.archive.org/web/20171004100853/http://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html#cha.tuning.memory.vm.reclaim OpenSUSE のチューニングガイド]を参照してください (このガイドでは、キャッシュのタイプを {{ic|slaptop}} でチェックし実験することが推奨されています)。 |
||
| − | # sysctl vm.swappiness=10 |
||
| + | === 優先度 === |
||
| − | swappiness 値を永続的にセットするには、''sysctl'' 設定ファイルを編集します: |
||
| + | 複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスクと低速なディスクを持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます: |
||
| − | {{hc|/etc/sysctl.d/99-sysctl.conf|2= |
||
| − | vm.swappiness=10 |
||
| − | }} |
||
| + | UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults,pri=100 0 0 |
||
| − | テストしたり、なぜこれが働くのか知るには、[http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事] を見て下さい。 |
||
| + | UUID=d7eb6062-01c8-4367-ac1d-3bf1167de8bb none swap defaults,pri=10 0 0 |
||
| + | もしくは ''swapon'' の {{Ic|--priority}} パラメータを使います: |
||
| − | [https://askubuntu.com/questions/103915/how-do-i-configure-swappiness この] Q&A には swappiness について多くの情報が載っています。 |
||
| + | # swapon --priority 100 /dev/sda1 |
||
| − | 他にもスワップのパフォーマンスに影響する ''sysctl'' パラメータとして {{ic|vm.vfs_cache_pressure}} が存在します。このパラメータはカーネルがページキャッシュやスワップに対して VFS キャッシュに使用されているメモリを回収する傾向をコントロールします。この値を増やすことで VFS キャッシュの回収がされやすくなります [http://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html#cha.tuning.memory.vm.reclaim]。詳しい情報は、[https://www.kernel.org/doc/Documentation/sysctl/vm.txt Linux カーネルドキュメント] を見て下さい。 |
||
| + | もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。 |
||
| − | === VFS cache pressure === |
||
| + | === ストライピング === |
||
| − | スワップのパフォーマンスに影響を与えるもう1つの ''sysctl'' パラメーターは {{ic|vm.vfs_cache_pressure}} です。これは、ページキャッシュとスワップではなく、 VFS cache のキャッシュに使用されるメモリを再利用するカーネルの傾向を制御します。 この値を増やすと、VFS キャッシュが再利用される速度が上がります。 詳細については、[https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html Linuxカーネルのドキュメント] を参照してください。 |
||
| + | スワップの性能を上げるために [[RAID]] を使う必要はありません。{{ic|/etc/fstab}} ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは [http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO-2.html#ss2.3 The Software-RAID HOWTO] を参照してください。 |
||
| − | === Priority === |
||
| + | === Discard (トリム) === |
||
| − | 複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstab で {{Ic|1=pri}} パラメータを使って設定できます: |
||
| + | [[ソリッドステートドライブ#スワップ]] を参照。 |
||
| − | /dev/sda1 none swap defaults,pri=100 0 0 |
||
| − | /dev/sdb2 none swap defaults,pri=10 0 0 |
||
| + | === RAM 内の圧縮ブロックデバイス === |
||
| − | もしくは swapon の {{Ic|-p}} (もしくは {{Ic|--priority}}) パラメータを使います: |
||
| + | [[パフォーマンスの向上#zram や zswap でのスワップ]] を参照。 |
||
| − | # swapon -p 100 /dev/sda1 |
||
| + | === スワップ領域をハイバーネート専用に使う === |
||
| − | もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。 |
||
| + | スワップをハイバネートイメージストレージ領域としてしか使わない場合、[[zswap]] を使い、そのライトバックを無効化することで、通常のスワップ仕様ではディスク書き込みが起こらないようにすることができます。[[電源管理/サスペンドとハイバネート#Zswap のライトバックを無効化し、スワップ領域をハイバネートのみに使用する]] を参照してください。 |
||
| − | === zswap または zram の使用 === |
||
| + | == 参照 == |
||
| − | [[Zswap]] は、スワップされたページに圧縮されたライトバックキャッシュを提供する Linux カーネル機能です。 これにより、パフォーマンスが向上し、IO 操作が減少します。 |
||
| + | * [https://chrisdown.name/2018/01/02/in-defence-of-swap.html In defence of swap: common misconceptions] (日本語訳: [https://chrisdown.name/ja/2018/01/02/in-defence-of-swap.html スワップの弁護:よくある誤解を解く]) |
||
| − | [[ZRAM]] は、ディスク上のスワップファイルの代わりに、メモリ内に仮想圧縮スワップファイルを作成します。 |
||
| + | {{TranslationStatus|Swap|2025-07-07|839579}} |
||
| − | === ストライピング === |
||
| − | |||
| − | スワップの性能を上げるために [[RAID]] を使う必要はありません。{{ic|/etc/fstab}} ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは [http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO-2.html#ss2.3 The Software-RAID HOWTO] を参照してください。 |
||
2025年7月7日 (月) 18:45時点における最新版
このページでは GNU/Linux でのスワップ領域とページングを紹介します。また、スワップパーティションとスワップファイルの作成と有効化について説明しています。
All about Linux swap space より:
- Linux は物理 RAM (random access memory) をページと呼ばれるメモリのかたまりに分割します。スワッピングとは、メモリを解放するために、ページがスワップ領域という名の事前設定領域にコピーされることを言います。物理メモリとスワップ領域の合計が利用できる仮想メモリのサイズになります。
スワップのサポートは Linux カーネルにより提供され、ユーザスペースのユーティリティは util-linux パッケージに存在します。
目次
スワップ領域
スワップ領域は普通ディスクパーティションとして作られますが、ファイルにすることもできます。Arch Linux のインストール中にユーザーはスワップ領域を作成することができ、必要であればインストール後でも作成できます。スワップ領域を作成する理由は2つあります: 仮想メモリを拡張して、搭載している物理メモリ(RAM)より多くするためと、suspend-to-disk(ハイバネート) をするためです。
スワップを使って仮想メモリを拡張することが利益になるかどうかは搭載している物理メモリの容量により異なります。必要なプログラムをすべて実行するのに必要な量の物理メモリを搭載していないのであれば、スワップを作成することはおそらく利益となるでしょう。これにより、out of memory(メモリ不足) を避けることができます。Out of memory とは、Linux カーネルの OOM killer という仕組みが自動的にプロセスを kill してメモリの空き領域を作ろうとしている状態のことを言います。仮想メモリの容量を必要な量まで増やすには、足りない分をスワップ領域として追加してください。
メモリが枯渇しているときにスワップを使用することの最大の欠点は、パフォーマンスが低下することです(#パフォーマンス セクションを見てください)。それゆえ、スワップを有効化するかどうかは個人の好みの問題となります。スワップを有効化するよりメモリが枯渇したときにプロセスが kill されるほうが良いという人もいますし、メモリが枯渇したときにシステムが低速化するがスワップを有効化したほうが良いという人もいます。
スワップの状態を確認するには、次を実行:
$ swapon --show
もしくは、以下を実行して物理メモリとスワップの使用状況を表示:
$ free -h
スワップパーティション
スワップパーティションは、ほとんどの GNU/Linux のパーティショニングツールで作成することができます。スワップパーティションは、GPT 上ではパーティションタイプ GUID 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F が (gdisk では 8200 タイプ、fdisk では swap タイプ)、MBR 上ではタイプ ID 82 が指定されています。
Linux のスワップ領域をセットアップする時には、mkswap(8) コマンドが使われます。例えば:
# mkswap /dev/sdxy
デバイスのページングを有効にするには:
# swapon /dev/sdxy
オプションについては swapon(8) を参照してください。
起動時に有効化する
スワップパーティションをブート時に有効化するには:
- systemd#GPT パーティションの自動マウントを使う
- あるいは、
/etc/fstabにエントリを追加する。例:UUID=device_UUID none swap defaults 0 0
device_UUIDはスワップ領域の UUID です。
fstab ファイルの構文については fstab を見てください。また、systemd#systemd.mount - マウント も参照してください。
スワップの無効化
特定のスワップ領域を無効にするには:
# swapoff /dev/sda2
もしくは -a スイッチを使って全てのスワップ領域を無効化することもできます。
スワップは systemd によって管理されているため、次の起動時にスワップが自動的に有効化されてしまいます。検出されたスワップ領域を自動的に有効化する機能を恒久的に無効にするには、systemctl --type swap を実行して問題の .swap ユニットを確認してマスクしてください。
スワップファイル
パーティションを作るかわりに、臨機応変にサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。
| ファイルシステム | スワップファイルのサポート |
|---|---|
| Bcachefs | No |
| Btrfs | Yes |
| F2FS | Yes |
| ext4 | Yes |
| JFS | Yes |
| NILFS2 | No |
| NTFS3 | Yes |
| ReiserFS | Yes |
| XFS | Yes |
| ZFS | No |
スワップファイルの作成
mkswap(8) を使用して、所望のサイズのスワップファイルを作成します (ヒントは パーティショニング#スワップ を参照してください)。たとえば、4 GiB のスワップファイルを作成します:
# mkswap -U clear --size 4G --file /swapfile
スワップファイルを有効化してください:
# swapon /swapfile
最後に、fstab 設定を編集してスワップファイルのエントリを追加してください:
/etc/fstab
/swapfile none swap defaults 0 0
fstab にエントリを追加する以外に、スワップユニットを作成する方法もあります (systemd.swap(5) を参照):
/etc/systemd/system/swapfile.swap
[Swap] What=/swapfile [Install] WantedBy=swap.target
作成後は daemon-reload を実行し、swapfile.swap を有効化してください。
追加の情報については fstab#使用法 を見てください。
スワップファイルの削除
スワップファイルを削除するには、まずスワップファイルを無効にしなければなりません。その後、スワップファイルを削除できます:
# swapoff /swapfile # rm -f /swapfile
最後に /etc/fstab から該当するエントリを削除してください。
スワップの暗号化
dm-crypt/スワップの暗号化を見て下さい。
パフォーマンス
通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。データを保持しておくのに十分な物理メモリが無い場合、スワップアウトできないとファイルシステムキャッシュのためのメモリが足りなくなってしまいます。その結果、ディスクへのアクセスが増加し、負荷が増加します。
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
Swappiness
メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。
Swappiness sysctl パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。
現在の swappiness 値をチェックするには:
$ sysctl vm.swappiness
代わりに /proc/sys/vm/swappiness ファイルを読むことで生の整数値を得ることができます。
swappiness 値を一時的にセットするには:
# sysctl -w vm.swappiness=35
swappiness 値を永続的にセットするには、sysctl.d(5) 設定ファイルを作成します。例えば:
/etc/sysctl.d/99-swappiness.conf
vm.swappiness = 35
ブートローダーを使ってカーネルのロード時に swappiness を設定するには、カーネルパラメータを追加してください。例えば: sysctl.vm.swappiness=35。
他の swappiness 値を選択する理由としては以下があります:
- デスクトップの応答性のために swappiness を下げることが提案されているから。この主張の言わんとしていることは、知覚されるパフォーマンス (応答性) はプログラムがユーザーの入力にいかに速く応答するかによるため、anonymous ページ (プログラムのメモリ) は RAM 内に留めておくべきであり、実際のパフォーマンスを多少犠牲にしてでも開いたファイルの解放を優先させるべきというものです。
- 妥当な swappiness の最小値は 1 です。Swappiness を 0 にすると、anonymous ページのエビクションに対して極端なバイアスが掛かり、メモリ争奪の極端な状況を除いて anonymous ページを reclaim やスワップするためにスキャンできなくなります。全く使用されていない anonymous ページを reclaim しないことは一般に望ましくありません。
- 100 以上の高い swappiness に設定することは、スワップする IO コストがファイルからの読み出しコストと同じかより小さい場合に (定義上) 望ましいから。このような状況はスワップがディスクをバッキングデバイスとして使用していない場合 (特に zram を使用している場合) に起こり得ます。また、スワップ IO が zswap などの低コストなメカニズムによってインターセプト/キャッシュされる場合にも起こり得ます。
VFS cache pressure
スワップのパフォーマンスに影響を与えるもう1つの sysctl パラメーターは vm.vfs_cache_pressure です。このパラメータは、ページキャッシュとスワップと比較して、VFS キャッシュのキャッシングのために使用されているメモリをカーネルが reclaim する優先度を制御します。この値を増やすと、VFS キャッシュが reclaim される割合が上がります。このパラメータの詳細は Linux カーネルのドキュメントを参照してください。
デフォルトの値は 100 です。この場合、ファイルシステムのキャッシュは他のキャッシュと同じくらい重要ということになり、両方のキャッシュは同じ重みで reclaim されます。デスクトップでは、ファイルシステムのブラウジング時間は操作のレイテンシ (知覚される応答性) に影響を与えるからファイルシステムのキャッシュは他のキャッシュよりも重要であるため、VFS cache pressure は 50 に設定するべきと主張されています。一方、VFS キャッシュに二度とアクセスされない多くの小さなファイルのメタデータが保持されている場合、より大きな値に設定することが提案されています。このパラメータのチューニングに関する詳細は OpenSUSE のチューニングガイドを参照してください (このガイドでは、キャッシュのタイプを slaptop でチェックし実験することが推奨されています)。
優先度
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスクと低速なディスクを持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstab で pri パラメータを使って設定できます:
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults,pri=100 0 0 UUID=d7eb6062-01c8-4367-ac1d-3bf1167de8bb none swap defaults,pri=10 0 0
もしくは swapon の --priority パラメータを使います:
# swapon --priority 100 /dev/sda1
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。
ストライピング
スワップの性能を上げるために RAID を使う必要はありません。/etc/fstab ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは The Software-RAID HOWTO を参照してください。
Discard (トリム)
ソリッドステートドライブ#スワップ を参照。
RAM 内の圧縮ブロックデバイス
パフォーマンスの向上#zram や zswap でのスワップ を参照。
スワップ領域をハイバーネート専用に使う
スワップをハイバネートイメージストレージ領域としてしか使わない場合、zswap を使い、そのライトバックを無効化することで、通常のスワップ仕様ではディスク書き込みが起こらないようにすることができます。電源管理/サスペンドとハイバネート#Zswap のライトバックを無効化し、スワップ領域をハイバネートのみに使用する を参照してください。