「スワップ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎スワップ領域: Note の削除)
(同期)
 
(他の1人の利用者による、間の11版が非表示)
10行目: 10行目:
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|fstab}}
 
{{Related|fstab}}
  +
{{Related|ハイバネート}}
 
{{Related|zswap}}
 
{{Related|zswap}}
 
{{Related|zram}}
 
{{Related|zram}}
29行目: 30行目:
 
スワップ領域は普通ディスクパーティションとして作られますが、ファイルにすることもできます。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 されるほうが良いという人もいますし、メモリが枯渇したときにシステムが低速化するがスワップを有効化したほうが良いという人もいます。
+
メモリが枯渇しているときにスワップを使用することの最大の欠点はパフォーマンス下することです([[#パフォーマンス]] セクションを見てください)。それゆえ、スワップを有効化するかどうかは個人の好みの問題となります。スワップを有効化するよりメモリが枯渇したときにプロセスが kill されるほうが良いという人もいますし、メモリが枯渇したときにシステムが低速化するがスワップを有効化したほうが良いという人もいます。
   
 
スワップの状態を確認するには、次を実行:
 
スワップの状態を確認するには、次を実行:
  +
 
$ swapon --show
 
$ swapon --show
   
もしくは、以下を実行して物理メモリとスワップの使用状況を表示
+
もしくは、以下を実行して物理メモリとスワップの使用状況を表示:
  +
 
$ free -h
 
$ free -h
   
 
== スワップパーティション ==
 
== スワップパーティション ==
   
ほとんどの GNU/Linux の [[パーティショニング#パーティショグツール|パーティショニングツール]] スワップパーティションの作成ができます。スワップパーティションタイプは、MBR で {{ic|82}}、GPT で {{ic|0657FD6D-A4AB-43C4-84E5-0933C84B4F4F}} が割り当てられています。
+
[[パーティショニング#スワップ|スワップパーティション]]は、ほとんどの GNU/Linux の[[パーティショニングツール]]で作成することができます。スワップパーティションは、GPT 上ではパーティションタイプ GUID {{ic|0657FD6D-A4AB-43C4-84E5-0933C84B4F4F}} が ([[gdisk]] で {{ic|8200}} タイプ[[fdisk]] {{ic|swap}} タイプ)MBR はタイプ ID {{ic|82}} が指定されています。
   
 
Linux のスワップ領域をセットアップする時には、{{man|8|mkswap}} コマンドが使われます。例えば:
 
Linux のスワップ領域をセットアップする時には、{{man|8|mkswap}} コマンドが使われます。例えば:
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 パーティションの自動マウント]] を見てください。
 
   
 
=== スワップの無効化 ===
 
=== スワップの無効化 ===
82行目: 82行目:
   
 
パーティションを作るかわりに、臨機応変にサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。
 
パーティションを作るかわりに、臨機応変にサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の SSD) はこちらが理想的でしょう。
  +
  +
{| class="wikitable sortable"
  +
! ファイルシステム
  +
! スワップファイルのサポート
  +
|-
  +
| [[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}}
  +
|}
   
 
=== スワップファイルの作成 ===
 
=== スワップファイルの作成 ===
87行目: 122行目:
 
{{Note|[[Btrfs]] については、以下の手順ではなく [[Btrfs#スワップファイル]] で説明されている手順に従ってください。}}
 
{{Note|[[Btrfs]] については、以下の手順ではなく [[Btrfs#スワップファイル]] で説明されている手順に従ってください。}}
   
[[dd]] を使のサイズのスワップファイルを作成してください。えば、8 GiB のスワップファイルを作成するには:
+
{{man|8|mkswap}} を使用し、所望のサイズのスワップファイルを作成します (ヒントは [[パーティショニング#スワップ]] を参照してください)たとえば、4 GiB のスワップファイルを作成します:
 
# dd if=/dev/zero of=/swapfile bs=1M count=8k status=progress
 
 
{{Note|''dd'' はスワップファイルを作成する手段として最も移植性の高い方法です。詳細は {{man|8|swapon|Files with holes}} を見てください。}}
 
   
  +
# mkswap -U clear --size 4G --file /swapfile
正しい[[ファイルのパーミッションと属性|パーミッション]]を設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります):
 
 
# chmod 600 /swapfile
 
 
正しいサイズのファイルを作成した後、ファイルをスワップにフォーマットしてください:
 
 
# mkswap -U clear /swapfile
 
   
 
スワップファイルを有効化してください:
 
スワップファイルを有効化してください:
124行目: 149行目:
   
 
最後に {{ic|/etc/fstab}} から該当するエントリを削除してください。
 
最後に {{ic|/etc/fstab}} から該当するエントリを削除してください。
 
== RAM 内の圧縮ブロックデバイス ==
 
 
スワップファイルやスワップパーティションを使用している場合、[[zswap]] がデフォルトで利用可能になっていますが、[[zram]] を使用して RAM 内で圧縮ブロックデバイスを使うことにより、スワップファイルやスワップパーティションの使用を完全に避けることができます。[[zram]] と [[zswap]] の違いについての詳細は [[パフォーマンスの向上#Zram または zswap]] を参照してください。
 
   
 
== スワップの暗号化 ==
 
== スワップの暗号化 ==
135行目: 156行目:
 
== パフォーマンス ==
 
== パフォーマンス ==
   
通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。スワップを無効化する仮想ファイルシステム(VFS)のキャッシュに利用できるメモリが、コストの高いディスクへのアクセスが増加するからです。
+
通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。データを保持しておくのに十分な物理メモリが無い場合、スワップアウトできないとファイルシステムキャッシュのためのメモリがなくなってしまます。その結果、ディスクへのアクセスが増加し、負荷が増加します。
   
 
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
 
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
143行目: 164行目:
 
メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。
 
メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。
   
''Swappiness'' [[sysctl]] パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。十分なメモリを積んでいる場合に低い値を使うと、4.0 より前のカーネルを実行しているシステムではレスポンスが向上することが知られています。
+
''Swappiness'' [[sysctl]] パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。
   
 
{{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 カーネルのソースコード]を参照してください。}}
 
{{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 カーネルのソースコード]を参照してください。}}
151行目: 172行目:
 
$ sysctl vm.swappiness
 
$ sysctl vm.swappiness
   
代わりに {{ic|/sys/fs/cgroup/memory/memory.swappiness}} (cgroup v1 固有) や {{ic|/proc/sys/vm/swappiness}} を読むことで生の整数値を得ることができます。
+
代わりに {{ic|/proc/sys/vm/swappiness}} ファイルを読むことで生の整数値を得ることができます。
   
 
swappiness 値を一時的にセットするには:
 
swappiness 値を一時的にセットするには:
   
# sysctl -w vm.swappiness=10
+
# sysctl -w vm.swappiness=35
   
 
swappiness 値を永続的にセットするには、{{man|5|sysctl.d}} 設定ファイルを作成します。例えば:
 
swappiness 値を永続的にセットするには、{{man|5|sysctl.d}} 設定ファイルを作成します。例えば:
   
 
{{hc|/etc/sysctl.d/99-swappiness.conf|2=
 
{{hc|/etc/sysctl.d/99-swappiness.conf|2=
vm.swappiness = 10
+
vm.swappiness = 35
 
}}
 
}}
   
[[ブートローダー]]を使ってカーネルのロード時に swappiness を設定するには、[[カーネルパラメータ]]を追加してください。例えば: {{ic|1=sysctl.vm.swappiness=10}}。
+
[[ブートローダー]]を使ってカーネルのロード時に swappiness を設定するには、[[カーネルパラメータ]]を追加してください。例えば: {{ic|1=sysctl.vm.swappiness=35}}。
   
 
テストしたり、なぜこれが機能するのか知るには、[https://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事]を見てください。より最近の反論は、[https://chrisdown.name/2018/01/02/in-defence-of-swap.html この記事] ([https://chrisdown.name/ja/2018/01/02/in-defence-of-swap.html 日本語訳]) を見てください。
 
テストしたり、なぜこれが機能するのか知るには、[https://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事]を見てください。より最近の反論は、[https://chrisdown.name/2018/01/02/in-defence-of-swap.html この記事] ([https://chrisdown.name/ja/2018/01/02/in-defence-of-swap.html 日本語訳]) を見てください。
171行目: 192行目:
 
スワップのパフォーマンスに影響を与えるもう1つの ''sysctl'' パラメーターは {{ic|vm.vfs_cache_pressure}} です。これは、VFS cache のキャッシングに使用されるメモリをページキャッシュとスワップに対して再利用するカーネルの傾向を制御します。この値を増やすと、VFS キャッシュが再利用される割合が上がります[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]。詳細については [https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html Linux カーネルドキュメント] を参照してください。
 
スワップのパフォーマンスに影響を与えるもう1つの ''sysctl'' パラメーターは {{ic|vm.vfs_cache_pressure}} です。これは、VFS cache のキャッシングに使用されるメモリをページキャッシュとスワップに対して再利用するカーネルの傾向を制御します。この値を増やすと、VFS キャッシュが再利用される割合が上がります[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]。詳細については [https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html Linux カーネルドキュメント] を参照してください。
   
=== Priority ===
+
=== 優先度 ===
   
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます:
+
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスクと低速なディスクを持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます:
   
/dev/sda1 none swap defaults,pri=100 0 0
+
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults,pri=100 0 0
/dev/sdb2 none swap defaults,pri=10 0 0
+
UUID=d7eb6062-01c8-4367-ac1d-3bf1167de8bb none swap defaults,pri=10 0 0
   
 
もしくは ''swapon'' の {{Ic|--priority}} パラメータを使います:
 
もしくは ''swapon'' の {{Ic|--priority}} パラメータを使います:
182行目: 203行目:
 
# swapon --priority 100 /dev/sda1
 
# swapon --priority 100 /dev/sda1
   
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。
+
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。
   
 
=== ストライピング ===
 
=== ストライピング ===
   
 
スワップの性能を上げるために [[RAID]] を使う必要はありません。{{ic|/etc/fstab}} ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは [http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO-2.html#ss2.3 The Software-RAID HOWTO] を参照してください。
 
スワップの性能を上げるために [[RAID]] を使う必要はありません。{{ic|/etc/fstab}} ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは [http://unthought.net/Software-RAID.HOWTO/Software-RAID.HOWTO-2.html#ss2.3 The Software-RAID HOWTO] を参照してください。
  +
  +
=== Discard (トリム) ===
  +
  +
[[ソリッドステートドライブ#スワップ]] を参照。
  +
  +
=== RAM 内の圧縮ブロックデバイス ===
  +
  +
[[パフォーマンスの向上#Zram または zswap]] を参照。
  +
  +
=== スワップ領域をハイバーネート専用に使う ===
  +
  +
スワップをハイバネートイメージストレージ領域としてしか使わない場合、[[zswap]] を使い、そのライトバックを無効化することで、通常のスワップ仕様ではディスク書き込みが起こらないようにすることができます。[[電源管理/サスペンドとハイバネート#Zswap のライトバックを無効化し、スワップ領域をハイバネートのみに使用する]] を参照してください。
   
 
== 参照 ==
 
== 参照 ==
192行目: 225行目:
 
* [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 スワップの弁護:よくある誤解を解く])
 
* [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 スワップの弁護:よくある誤解を解く])
   
{{TranslationStatus|Swap|2023-05-29|777587}}
+
{{TranslationStatus|Swap|2025-03-31|826122}}

2025年3月31日 (月) 09:18時点における最新版

関連記事

このページでは 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) を参照してください。

起動時に有効化する

スワップパーティションをブート時に有効化するには:

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

スワップファイルの作成

ノート: Btrfs については、以下の手順ではなく Btrfs#スワップファイル で説明されている手順に従ってください。

mkswap(8) を使用して、所望のサイズのスワップファイルを作成します (ヒントは パーティショニング#スワップ を参照してください)。たとえば、4 GiB のスワップファイルを作成します:

# mkswap -U clear --size 4G --file /swapfile

スワップファイルを有効化してください:

# swapon /swapfile

最後に、fstab 設定を編集してスワップファイルのエントリを追加してください:

/etc/fstab
/swapfile none swap defaults 0 0

追加の情報については fstab#使用法 を見てください。

ノート: スワップファイルは、UUID や ラベルではなくファイルシステム上の位置により指定されなければなりません。

スワップファイルの削除

スワップファイルを削除するには、まずスワップファイルを無効にしなければなりません。その後、スワップファイルを削除できます:

# swapoff /swapfile
# rm -f /swapfile

最後に /etc/fstab から該当するエントリを削除してください。

スワップの暗号化

dm-crypt/スワップの暗号化を見て下さい。

パフォーマンス

通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。データを保持しておくのに十分な物理メモリが無い場合、スワップアウトできないとファイルシステムキャッシュのためのメモリが足りなくなってしまいます。その結果、ディスクへのアクセスが増加し、負荷が増加します。

スワップ値を変えることでパフォーマンスを向上できるかもしれません。

Swappiness

メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。

Swappiness sysctl パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。

ノート: Swappiness がメモリの閾値に影響を与えたり、スワップ領域を使用させなくしたりするとよく誤解されます。しかし、この値は、スワップとファイルページのどちらを優先して解放するかだけに影響を与えます。より詳細な説明はこの記事を、あるいはこの値が使われているカーネルのソースコードを参照してください。

現在の 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

テストしたり、なぜこれが機能するのか知るには、この記事を見てください。より最近の反論は、この記事 (日本語訳) を見てください。

VFS cache pressure

スワップのパフォーマンスに影響を与えるもう1つの sysctl パラメーターは vm.vfs_cache_pressure です。これは、VFS cache のキャッシングに使用されるメモリをページキャッシュとスワップに対して再利用するカーネルの傾向を制御します。この値を増やすと、VFS キャッシュが再利用される割合が上がります[1]。詳細については Linux カーネルドキュメント を参照してください。

優先度

複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスクと低速なディスクを持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstabpri パラメータを使って設定できます:

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 のライトバックを無効化し、スワップ領域をハイバネートのみに使用する を参照してください。

参照

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