スワップファイルとは?Linuxでの作成・設定方法、swappinessチューニングとSSD/ハイバネーション対策ガイド

スワップファイルとは — 基礎と役割

スワップファイル(swap file)は、物理メモリ(RAM)が不足した際にオペレーティングシステム(OS)が一時的にメモリ内容の一部を退避させるために使うファイルです。仮想メモリ管理の一部として機能し、RAM とディスク領域の組み合わせで「見かけ上のメモリ容量」を拡張します。スワップはプロセスのアドレス空間の一部をディスクに追い出し、必要になれば再び読み戻すことで、同時に多くのプロセスを実行できるようにします。

なぜスワップが必要か(メリット)

  • メモリ不足時の緊急避難先:物理メモリが枯渇してもシステムが極端に落ちるのを防ぐ。
  • 多重稼働のサポート:多数のプロセスを並列に実行できる(全プロセスが常時RAMに載る必要がない)。
  • メモリ管理の柔軟性:活発に使われないページをディスクに移動することで、ホットデータにRAMを優先的に割り当てられる。

スワップが動作する仕組み(ざっくり)

OS はプロセスごとに仮想アドレス空間を持ち、ページ単位(通常4KiBなど)で物理メモリと紐付けます。プロセスが参照したページがRAM上にないと「ページフォールト」が発生し、OS はそのページをディスク(スワップ領域)から読み直すか、新たに空いたRAMに割り当てます。逆に、RAMが不足すると、OS はアクセスの低いページを選んでスワップ領域へ書き出します。

スワップファイルとスワップパーティションの違い

  • スワップパーティション:専用のパーティションをスワップ用に割り当てる方法。初期のUNIX/Linuxで一般的。ブロックデバイスとして扱われ、ブート時の設定が簡単で一貫性がある。
  • スワップファイル:一般のファイルシステム上に作成するファイルをスワップとして利用する方法。容量変更や管理が容易で、ファイルシステムの機能(例:LVMやサナップショット運用)と親和性が高い。近年のカーネルではスワップファイルの性能差はほとんどなく、広く使われている。
  • 注意点:古いカーネルや特殊な状況ではスワップファイル利用に制限があったり、ハイバネーション(休止)時に再開(resume)を確実にするためにはスワップパーティションが扱いやすいことがある。

主要OSにおけるスワップの実装例

  • Linux:スワップパーティションおよびスワップファイルの両方をサポート。swapon / swapoff、/proc/meminfo、swappiness などで挙動を制御/監視できる。zswap/zram などの圧縮スワップ機能もある。
  • Windows:ページファイル(pagefile.sys)がスワップの役割を担う。既定で自動管理されるが、手動サイズ指定や無効化も可能(注意が必要)。
  • macOS:仮想メモリ管理は自動で、必要に応じて /private/var/vm にスワップファイルを作成する。ディスク暗号化(FileVault)を有効にするとスワップもディスク暗号化の対象となる。

Linuxでの実践:スワップファイルの作成(例)

代表的な手順(root 権限で実行):

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永続化: /etc/fstab に以下を追加
/swapfile none swap sw 0 0

注意点:fallocate が使えないファイルシステムでは、dd を用いることがあります(例:dd if=/dev/zero of=/swapfile bs=1M count=4096)。またスワップファイルは chmod 600 にして他ユーザーからの読取を防ぎます。

スワップのチューニングと設定項目

  • swappiness(Linux):カーネルパラメータ vm.swappiness(0〜100)。0 に近いと極力スワップしない、100 に近いと積極的にスワップする。デフォルトは多くのディストリで 60。
  • スワップ優先度(Linux):複数のスワップ領域を併用する際に優先度を指定できる(swapon -p)。
  • ページ圧縮/RAM内スワップ:zswap(圧縮キャッシュ)、zram(圧縮ブロックデバイス)により、ディスクスワップを減らしつつメモリ有効活用ができる。
  • ページファイルの自動管理(Windows):Windows は自動でページファイルサイズを調整する。手動設定は注意が必要。

スワップサイズの目安

「RAMの2倍」などの古い経験則は必ずしも適切ではありません。目的に応じた決定が必要です。

  • ハイバネーションを使う場合:一般に物理RAM以上のスワップ容量(少なくとも RAM と同等、余裕を見て RAM + 数百MB)が必要。
  • デスクトップ/サーバ用途:普段のワークロードでスワップをほとんど使わないなら小さめでも可。大量の一括処理や突発的メモリ需要があるなら余裕をもったサイズに。
  • クラウド/コンテナ環境:一般的にはメモリ確保を優先し、スワップは限定的にすることも多い(コンテナではホストのスワップポリシーに依存)。

パフォーマンスとSSDへの影響

スワップは本質的にディスクI/Oを伴うため、RAMに比べて遅い(レイテンシが大きい)。SSD はHDD より高速だが、スワップ頻度が高いと書き込み量が増え、理論上は寿命に影響する可能性があります。ただし近年の SSD は耐久性が向上しており、通常のデスクトップ用途で直ちに寿命が尽きることは稀です。パフォーマンス面では、必要であればメモリ増設や zram/zswap の導入を検討するとよいでしょう。

セキュリティ上の注意点

  • スワップに機密データが一時的に書き出される可能性があるため、機密性が重要な環境ではスワップ領域の暗号化を検討する(Linux の場合は LUKS で暗号化したスワップを作る、またはディスク全体を暗号化する)。
  • Windows ではシャットダウン時にページファイルをクリアするポリシー設定がある(パフォーマンスに影響)。
  • スワップを削除するときは mkswap(上書き)や安全に消去する手順を踏むのが望ましい。

監視とトラブルシューティング

  • Linux の基本コマンド:free -h、swapon --show、cat /proc/meminfo、vmstat、top/htop などでスワップ使用量やスワップイン/アウトを監視。
  • 頻繁にスワップアウトが発生し「スラッシング(thrashing)」に陥るとシステム全体の応答性が著しく低下する。対策はメモリ増設、不要サービス停止、スワップポリシー調整(swappiness の低下)、アプリケーションのメモリ最適化など。
  • スワップ用ファイルを作ったのに有効にならない場合:ファイルパーミッションや mkswap の実行、ファイルシステムの種類(例:一部古いファイルシステムで問題)を確認。

ハイバネーション(休止)とスワップの関係

ハイバネーションでは、メモリ内容全体をスワップ領域に保存して電源を切り、再起動時に復元します。そのため、ハイバネーションを確実に使うにはスワップ容量が RAM と同等以上であることが推奨されます。スワップファイルでのハイバネーションは設定がやや複雑になることがあるため、ハイバネーションを多用するなら専用のスワップパーティションを利用するほうが簡単な場合があります。

まとめ(実務的な推奨)

  • まずは自分の用途とワークロードを把握する。常時スワップが発生しているならまずは物理メモリ増設を検討。
  • スワップはシステムの安定性確保に有用だが、パフォーマンスの代償がある。SSD 搭載環境では通常のデスクトップ用途での使用は問題になりにくいが、極端なスワッピングは避ける。
  • 機密性が重要なシステムではスワップ暗号化やディスク全体の暗号化を行う。
  • Linux では swappiness の調整、zswap/zram の導入、スワップファイル作成の手順把握が運用上重要。

参考文献