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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎USB デバイスとスワップ: 削除。このセクションには追加の情報はないし、デバイスがマウント/利用できなかった場合の挙動が不明。)
153行目: 153行目:
 
[[dm-crypt/スワップの暗号化]]を見て下さい。
 
[[dm-crypt/スワップの暗号化]]を見て下さい。
   
== パフォーマンスチューニング ==
+
== パフォーマンス ==
  +
  +
通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。スワップを無効化すると仮想ファイルシステム(VFS)のキャッシュに利用できるメモリが減り、コストの高いディスクへのアクセスが増加するからです。
   
 
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
 
スワップ値を変えることでパフォーマンスを向上できるかもしれません。
159行目: 161行目:
 
=== Swappiness ===
 
=== Swappiness ===
   
''swappiness'' [[sysctl]] パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 100 の間の値にすることができます。デフォルトの値は60です。このパラメータを低い値に設定すると RAM からのスワッピングが減り、多くのシステムでレスポンスが向上することが知られています。
+
''swappiness'' [[sysctl]] パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 200 の間の値にすることができます(Linux < 5.8 では 100 が最大)。デフォルトの値は60です。このパラメータを低い値に設定するとスワッピングが減り、高い値にするとスワップ領域を使おうとし、100 の値は IO コストが等しいと仮定されることを意味します。十分なメモリを積んでいる場合に低い値を使うことは多くのシステムでレスポンスが向上することが知られています。
   
 
現在の swappiness 値をチェックするには:
 
現在の swappiness 値をチェックするには:
   
$ cat /proc/sys/vm/swappiness
+
$ sysctl vm.swappiness
  +
  +
代わりに {{ic|/sys/fs/cgroup/memory/memory.swappiness}} や {{ic|/proc/sys/vm/swappiness}} を読むことで生の整数値を得ることができます。
  +
  +
{{Note|{{ic|/proc}} は整理されておらず、互換性のためだけに残されているので {{ic|/sys}} を代わりに使うことをおすすめします。}}
   
 
swappiness 値を一時的にセットするには:
 
swappiness 値を一時的にセットするには:
   
# sysctl vm.swappiness=10
+
# sysctl -w vm.swappiness=10
   
swappiness 値を永続的にセットするには、''sysctl'' 設定ファイルを編集します:
+
swappiness 値を永続的にセットするには、{{man|5|sysctl.d}} 設定ファイルを作成します:
   
{{hc|/etc/sysctl.d/99-sysctl.conf|2=
+
{{hc|/etc/sysctl.d/99-swappiness.conf|2=
 
vm.swappiness=10
 
vm.swappiness=10
 
}}
 
}}
   
テストしたり、なぜこれが働くのか知るには、[http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事] を見て下さい。
+
テストしたり、なぜこれが働くのか知るには、 [https://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that この記事]を見て下さい。
 
[https://askubuntu.com/questions/103915/how-do-i-configure-swappiness この] Q&A には swappiness について多くの情報が載っています。
 
 
他にもスワップのパフォーマンスに影響する ''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 カーネルドキュメント] を見て下さい。
 
   
 
=== VFS cache pressure ===
 
=== 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カーネルドキュメント] を参照してください。
+
スワップのパフォーマンスに影響を与えるもう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 ===
   
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は fstab で {{Ic|1=pri}} パラメータを使って設定できます:
+
複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。例えば、もしあなたが高速なディスク ({{ic|/dev/sda}}) と低速なディスク ({{ic|/dev/sdb}}) を持っている場合、高速なデバイス上のスワップ領域に高い優先度をあててください。priority は [[fstab]] で {{ic|pri}} パラメータを使って設定できます:
   
 
/dev/sda1 none swap defaults,pri=100 0 0
 
/dev/sda1 none swap defaults,pri=100 0 0
 
/dev/sdb2 none swap defaults,pri=10 0 0
 
/dev/sdb2 none swap defaults,pri=10 0 0
   
もしくは swapon の {{Ic|-p}} (もしくは {{Ic|--priority}}) パラメータを使います:
+
もしくは swapon の {{Ic|--priority}} パラメータを使います:
   
# swapon -p 100 /dev/sda1
+
# swapon --priority 100 /dev/sda1
   
 
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。
 
もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。
200行目: 202行目:
 
=== zswap または zram の使用 ===
 
=== zswap または zram の使用 ===
   
[[Zswap]] は、スワップされたページに圧縮されたライトバックキャッシュを提供する Linux カーネル機能です。 これにより、パフォーマンスが向上し、IO 操作が減少します。
+
[[Zswap]] は、スワップされたページに圧縮されたライトバックキャッシュを提供する Linux カーネル機能です。 これにより、パフォーマンスが向上し、IO 操作が減少します。[[ZRAM]] は、ディスク上のスワップファイルの代わりに、メモリ内に仮想圧縮スワップファイルを作成します。
 
[[ZRAM]] は、ディスク上のスワップファイルの代わりに、メモリ内に仮想圧縮スワップファイルを作成します。
 
   
 
=== ストライピング ===
 
=== ストライピング ===

2022年4月19日 (火) 21:25時点における版

関連記事

このページでは 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 コマンドが使われます。例えば:

# mkswap /dev/sdxy
警告: 指定したパーティションに保存されている全てのデータが消失します。

デバイスのページングを有効にするには:

# swapon /dev/sdxy

起動時にスワップパーティションを有効にするには、エントリを /etc/fstab に追加します:

UUID=device_UUID none swap defaults 0 0

device_UUID の部分はスワップ領域の UUID に変更してください。

ファイルの構文については fstab を見てください。

ノート: GPT を使用しているデバイス上にスワップパーティションを配置した場合は fstab のエントリを作成するかどうかは任意です。次のサブセクション を見てください。
警告: swapon を使用している場合、mdadm を使用する RAID セットアップで discard を有効にすると起動時や起動中にシステムがフリーズします。

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) はこちらが理想的でしょう。

手動設定

スワップファイルの作成

ノート: Linux カーネルバージョン5.0 以降、Btrfsは制限付きでスワップファイルをサポートしています。Btrfs#スワップファイル の指示に従って、Btrfs 上のスワップを初期化してください。

dd を使ってお望みのサイズのスワップファイルを作成してください。例えば、512 MiB のスワップファイルを作成するには:

# dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress
ノート: dd はスワップファイルを作成する手段として最も移植性の高い方法です。詳細は swapon(8) § Files with holes を見てください。

正しいパーミッションを設定します (スワップファイルを全てのユーザーが読めるようにすると深刻な脆弱性になります):

# chmod 600 /swapfile

正確なサイズのファイルを作成した後、ファイルをスワップにフォーマット:

# mkswap -U clear /swapfile

スワップファイルを有効に:

# swapon /swapfile

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

/etc/fstab
/swapfile none swap defaults 0 0

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

ノート:
  • スワップファイルは、UUID や ラベルではなくファイルシステム上の位置により指定されなければなりません。
  • Btrfs を使用しているときは作成したサブボリュームもリストに追加し、discard,autodefrag と圧縮オプションを削除することを忘れないでください。

スワップファイルの削除

スワップファイルを削除するには、現在使っているスワップファイルを無効にしなければなりません。

root 権限で:

# swapoff /swapfile

スワップファイルの削除:

# rm -f /swapfile

最後に /etc/fstab からエントリを削除します。

自動設定

systemd-swap

systemd-swap は、zram スワップ、スワップファイル、およびスワップパーティションからハイブリッドスワップスペースを作成するためのスクリプトです。 systemd プロジェクトとは提携していません。

インストールsystemd-swap パッケージです。 /etc/systemd/swap.confスワップファイルチャンク セクションで、コメントを解除して swapfc_enabled=1 を設定し、 systemd-swap サービスを 起動有効化 します。

詳細と設定については、 authors GitHub ページにアクセスしてください about-構成推奨構成

ノート:
  • ジャーナルに次の警告 systemd-swap[..]: WARN: swapFC: ENOSPC が表示され続け、スワップファイルが作成されていない場合は、次のコメントを解除して swapfc_force_preallocated=1/etc/systemd/swap.conf に設定してください。
  • systemd-swap で作成したスワップファイルは、ハイバネーション には簡単に使用できません。 systemd-swap issue85 を参照してください。

スワップの暗号化

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

パフォーマンス

通常、スワップに対する操作は RAM 上のデータに対する直接アクセスよりも断然遅くなります。しかし、パフォーマンスを向上させようとしてスワップを全体的に無効化するとパフォーマンスの劣化を招くことがあります。スワップを無効化すると仮想ファイルシステム(VFS)のキャッシュに利用できるメモリが減り、コストの高いディスクへのアクセスが増加するからです。

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

Swappiness

swappiness sysctl パラメータはカーネルのスワップ領域の優先(もしくは回避)を表しています。Swappiness は 0 から 200 の間の値にすることができます(Linux < 5.8 では 100 が最大)。デフォルトの値は60です。このパラメータを低い値に設定するとスワッピングが減り、高い値にするとスワップ領域を使おうとし、100 の値は IO コストが等しいと仮定されることを意味します。十分なメモリを積んでいる場合に低い値を使うことは多くのシステムでレスポンスが向上することが知られています。

現在の swappiness 値をチェックするには:

$ sysctl vm.swappiness

代わりに /sys/fs/cgroup/memory/memory.swappiness/proc/sys/vm/swappiness を読むことで生の整数値を得ることができます。

ノート: /proc は整理されておらず、互換性のためだけに残されているので /sys を代わりに使うことをおすすめします。

swappiness 値を一時的にセットするには:

# sysctl -w vm.swappiness=10

swappiness 値を永続的にセットするには、sysctl.d(5) 設定ファイルを作成します:

/etc/sysctl.d/99-swappiness.conf
vm.swappiness=10

テストしたり、なぜこれが働くのか知るには、 この記事を見て下さい。

VFS cache pressure

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

Priority

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

/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 の場合、その領域間ではラウンド・ロビン方式でページが配分されます。

zswap または zram の使用

Zswap は、スワップされたページに圧縮されたライトバックキャッシュを提供する Linux カーネル機能です。 これにより、パフォーマンスが向上し、IO 操作が減少します。ZRAM は、ディスク上のスワップファイルの代わりに、メモリ内に仮想圧縮スワップファイルを作成します。

ストライピング

スワップの性能を上げるために RAID を使う必要はありません。/etc/fstab ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。詳しくは The Software-RAID HOWTO を参照してください。