「スワップ」の版間の差分
細 (リンクを修正) |
Kusanaginoturugi (トーク | 投稿記録) (関連記事を追加) |
||
(同じ利用者による、間の12版が非表示) | |||
10行目: | 10行目: | ||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|fstab}} |
{{Related|fstab}} |
||
− | {{Related| |
+ | {{Related|ハイバネート}} |
{{Related|zswap}} |
{{Related|zswap}} |
||
{{Related|zram}} |
{{Related|zram}} |
||
30行目: | 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 されるほうが良いという人もいますし、メモリが枯渇したときにシステムが低速化するがスワップを有効化したほうが良いという人もいます。 |
− | |||
− | {{Note|{{Accuracy|1=[https://lore.kernel.org/lkml/CAHk-=wjnzdLSP3oDxhf9eMTYo7GF-QjaNLBUH1Zk3c4A7X75YA@mail.gmail.com/ Linus Torvalds 氏はスワップパーティションの方が望ましいと発言しています]: 「正直なところ、スワップファイルは (スワップパーティションよりも) 遅くなる傾向にあり、他の様々な複雑さの問題も抱えている。それゆえ、全ての通常のディストリビューションでスワップファイルではなくスワップパーティションがセットアップされる。」}}スワップファイルとパーティションにパフォーマンスの違いはありません、どちらも同じように扱われます。}} |
||
スワップの状態を確認するには、次を実行: |
スワップの状態を確認するには、次を実行: |
||
85行目: | 83行目: | ||
パーティションを作るかわりに、臨機応変にサイズを変えたり簡単に削除できるものとしてスワップファイルが選択肢になりえます。特にディスク容量が貴重な場合 (例: 小容量の 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}} |
||
+ | |} |
||
=== スワップファイルの作成 === |
=== スワップファイルの作成 === |
||
90行目: | 123行目: | ||
{{Note|[[Btrfs]] については、以下の手順ではなく [[Btrfs#スワップファイル]] で説明されている手順に従ってください。}} |
{{Note|[[Btrfs]] については、以下の手順ではなく [[Btrfs#スワップファイル]] で説明されている手順に従ってください。}} |
||
− | + | {{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}} を見てください。}} |
||
− | |||
− | 正しい[[ファイルのパーミッションと属性|パーミッション]]を設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります): |
||
− | |||
− | # chmod 600 /swapfile |
||
− | |||
− | 正しいサイズのファイルを作成した後、ファイルをスワップにフォーマットしてください: |
||
− | # mkswap -U clear /swapfile |
+ | # mkswap -U clear --size 4G --file /swapfile |
スワップファイルを有効化してください: |
スワップファイルを有効化してください: |
||
174行目: | 197行目: | ||
スワップのパフォーマンスに影響を与えるもう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 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます: |
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます: |
||
185行目: | 208行目: | ||
# swapon --priority 100 /dev/sda1 |
# swapon --priority 100 /dev/sda1 |
||
− | もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド |
+ | もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。 |
=== ストライピング === |
=== ストライピング === |
||
195行目: | 218行目: | ||
* [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| |
+ | {{TranslationStatus|Swap|2024-05-30|809163}} |
2024年5月30日 (木) 19:06時点における最新版
このページでは 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 の パーティショニングツール でスワップパーティションの作成ができます。スワップパーティションのタイプは、MBR で 82
、GPT で 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
が割り当てられています。
Linux のスワップ領域をセットアップする時には、mkswap(8) コマンドが使われます。例えば:
# mkswap /dev/sdxy
デバイスのページングを有効にするには:
# swapon /dev/sdxy
起動時にスワップパーティションを有効にするには、エントリを /etc/fstab
に追加します:
UUID=device_UUID none swap defaults 0 0
device_UUID
の部分はスワップ領域の UUID に変更してください。
ファイルの構文については fstab を見てください。
systemd による有効化
systemd は2つの異なる仕組みを使ってスワップパーティションを有効化します。どちらも実行可能ファイルは /usr/lib/systemd/system-generators
にあります。ジェネレータは起動時に実行され、マウントごとにネイティブの systemd ユニットを作成します。まず systemd-fstab-generator
が fstab を読み込んでユニットを生成します (スワップのユニットも)。次に systemd-gpt-auto-generator
が root ディスクを調査してユニットを生成します。後者は GPT ディスク上でのみ動作し、パーティションのタイプ GUID を見てスワップパーティションかどうかを識別します。さらなる情報については systemd#GPT パーティションの自動マウント を見てください。
スワップの無効化
特定のスワップ領域を無効にするには:
# 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#使用法 を見てください。
スワップファイルの削除
スワップファイルを削除するには、まずスワップファイルを無効にしなければなりません。その後、スワップファイルを削除できます:
# swapoff /swapfile # rm -f /swapfile
最後に /etc/fstab
から該当するエントリを削除してください。
RAM 内の圧縮ブロックデバイス
スワップファイルやスワップパーティションを使用している場合、zswap がデフォルトで利用可能になっていますが、zram を使用して RAM 内で圧縮ブロックデバイスを使うことにより、スワップファイルやスワップパーティションの使用を完全に避けることができます。zram と zswap の違いについての詳細は パフォーマンスの向上#Zram または zswap を参照してください。
スワップの暗号化
dm-crypt/スワップの暗号化を見て下さい。
パフォーマンス
通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。スワップを無効化すると仮想ファイルシステム(VFS)のキャッシュに利用できるメモリが減り、コストの高いディスクへのアクセスが増加するからです。
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
Swappiness
メモリ使用量が特定の閾値に達すると、カーネルはアクティブなメモリを調べ、何を解放できるかを確認し始めます。ファイルデータは (変更されている場合) ファイルシステムに書き出して、アンロードし、後で再ロードすることができます。他のデータは、アンロードする前にスワップに書き込まなければなりません。
Swappiness sysctl パラメータは、カーネルが書き込み先としてファイルよりもスワップを優先する度合いを表します。Swappiness は 0 から 200 の間の値にすることができます (Linux < 5.8 では 100 が最大)。デフォルトの値は 60 です。小さい値にすると、カーネルは開いているファイルの解放を優先し、大きい値にすると、カーネルはスワップ領域を使おうとします。100 にすると、IO コストが等しいとみなされます。十分なメモリを積んでいる場合に低い値を使うと、4.0 より前のカーネルを実行しているシステムではレスポンスが向上することが知られています。
現在の swappiness 値をチェックするには:
$ sysctl vm.swappiness
代わりに /sys/fs/cgroup/memory/memory.swappiness
(cgroup v1 固有) や /proc/sys/vm/swappiness
を読むことで生の整数値を得ることができます。
swappiness 値を一時的にセットするには:
# sysctl -w vm.swappiness=10
swappiness 値を永続的にセットするには、sysctl.d(5) 設定ファイルを作成します。例えば:
/etc/sysctl.d/99-swappiness.conf
vm.swappiness = 10
ブートローダーを使ってカーネルのロード時に swappiness を設定するには、カーネルパラメータを追加してください。例えば: sysctl.vm.swappiness=10
。
テストしたり、なぜこれが機能するのか知るには、この記事を見てください。より最近の反論は、この記事 (日本語訳) を見てください。
VFS cache pressure
スワップのパフォーマンスに影響を与えるもう1つの sysctl パラメーターは vm.vfs_cache_pressure
です。これは、VFS cache のキャッシングに使用されるメモリをページキャッシュとスワップに対して再利用するカーネルの傾向を制御します。この値を増やすと、VFS キャッシュが再利用される割合が上がります[1]。詳細については Linux カーネルドキュメント を参照してください。
優先度
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク (/dev/sda
) と低速なディスク (/dev/sdb
) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstab で pri
パラメータを使って設定できます:
/dev/sda1 none swap defaults,pri=100 0 0 /dev/sdb2 none swap defaults,pri=10 0 0
もしくは swapon の --priority
パラメータを使います:
# swapon --priority 100 /dev/sda1
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンドロビン方式でページが配分されます。
ストライピング
スワップの性能を上げるために RAID を使う必要はありません。/etc/fstab
ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは The Software-RAID HOWTO を参照してください。