スワップアウトとは|仕組み・スラッシング対策・Linuxチューニング完全ガイド
スワップアウトとは — 概要
スワップアウト(swap out)は、主に仮想メモリ管理における動作の一つで、メインメモリ(RAM)上にあるメモリページの内容を二次記憶(一般には「スワップ領域」=スワップファイルやスワップパーティション)へ書き出し、RAM上の領域を解放する処理を指します。一般にはページ単位で行われ、逆の動作(スワップインまたはページイン)でディスクから読み戻されます。
スワップアウトが必要になる背景
実行中のプロセス群のメモリ需要が物理RAMの供給を超えると、OSは新たなメモリ割り当てのためにRAMを確保する必要に迫られます。使用頻度の低いページや変更が少ない(あるいはすでにディスクにコピー済みの)ページを選んでスワップアウトし、メモリの空きを作ります。これにより、プロセスのクラッシュを防ぎ、仮想メモリ空間全体の利用を可能にします。
スワップとページングの違い
- スワップ(歴史的用語):初期のUNIXなどではプロセス全体をディスクへ退避(suspend)してメモリを空ける「スワップ」が使われていました。
- ページング:現代のOSはページ(通常4KBなど)単位で入出力を行い、必要最小限の単位でメモリ管理をします。これが一般に「ページアウト/ページイン」と呼ばれ、日常的には「スワップアウト」と同義に使われることが多いです。
スワップアウトの仕組み(技術的観点)
典型的なスワップアウトの流れは次のとおりです。
- メモリ圧力の検出:OSは空きメモリやページの参照頻度を監視します。
- 候補ページの選定:ページ置換アルゴリズム(LRUやClockの近似など)でスワップ対象を決定します。
- ダーティ判定:そのページが書き換えられている(dirty)かどうかを確認。cleanなら既にディスクに同一内容が存在する場合があり、書き出す必要がないこともあります。
- 書き出し:選ばれたページをスワップ領域へ書き込み(I/O)、完了後にその物理フレームを解放します。
- 後続アクセス:スワップアウトしたページへアクセスが起きるとページフォルトが生じ、スワップインしてメモリに戻します。
ページ置換アルゴリズム
性能に直結する重要な要素です。主な方式は以下。
- LRU(最終参照が最も古いものを置換)— 理想だが完全なLRUは高コスト。
- Clockアルゴリズム(参照ビットを用いる近似LRU)— 実装コストと効果のバランスが良く、採用例が多い。
- NRU、FIFOなど — 特殊用途や歴史的実装。
スワップの種類と配置
- スワップパーティション:専用のディスク領域。パフォーマンスや管理面で安定。
- スワップファイル:ファイルシステム上のファイルをスワップ領域として使う方式。柔軟性が高い(サイズ変更が容易)
- 圧縮スワップ(zswap, zramなど):RAM内で圧縮して一時的に保持、実ディスクI/Oを減らす工夫。
スワップによる性能影響と注意点
スワップはメモリ不足時の回避策ですが、ディスクI/OはRAMに比べて圧倒的に遅いため、頻繁なスワップ(スラッシング)はシステム全体の応答性を著しく低下させます。特に小さなI/O遅延が積み重なるとレイテンシが増大します。
近年のSSDはランダムアクセス性能が向上したため、従来よりは「スワップの痛み」が軽減されていますが、フラッシュの書き込み寿命や、依然としてRAMより遅いという点は変わりません。
Linuxにおけるチューニング
- vm.swappiness:スワップアウトの積極度を決めるカーネルパラメータ(0〜100)。0に近いほどスワップを避け、100に近いほど積極的にスワップする。デフォルトは多くのディストリで60。調整によりパフォーマンスが改善するケースがある。
- zswap/zram:スワップ圧縮やRAM上の圧縮スワップでI/Oを減らす。メモリが一時的に逼迫するがディスクI/O負荷を下げられる。
- オーバーコミット設定やOOM-killerの挙動も合わせて確認・調整。
運用上の実務的ポイント
- 監視:free -h、swapon --show、cat /proc/swaps、vmstat、top/htopなどでスワップ使用量やページフォルト率を監視。
- スワップサイズの決め方:用途による。デスクトップでは小さめ+スワップファイルで柔軟に。サーバーでスリープ/ハイバネーションを使う場合はRAM容量以上のスワップが必要なことがある(ハイバネーションはメモリ内容をスワップへ保存する実装が多いため)。
- セキュリティ:スワップ領域には機密データが含まれる可能性があるため、暗号化(LinuxならLUKSや暗号化スワップの設定)を検討する。
トラブルシューティング:スラッシングとその対策
頻繁なページイン/アウトでCPUとI/Oが占有される状態をスラッシングと呼びます。原因と対策は次の通り。
- 原因:物理メモリ不足、メモリリーク、過剰な同時負荷。
- 対策:メモリ増設、プロセスの調整(不要プロセス停止)、vm.swappiness調整、zswap/zram導入、ワークロードの分散。
OS別の実装差(概要)
- Linux:ページングベース。swappinessやzswap/zram等の機能がある。swaponで管理。
- Windows:pagefile.sysを用いる。仮想メモリ(Virtual Memory)設定でサイズや自動管理を指定可能。
- macOS:動的にスワップファイルを生成する仕組み(dynamic_pager)を持つ。
まとめ
スワップアウトは仮想メモリの重要な機能で、メモリ不足時にシステムを安定させる役割を果たします。しかしディスクI/Oを伴うため、過度のスワップは性能悪化(スラッシング)を招きます。現代の運用では、適切な監視、スワップのサイズと配置の方針、vm.swappinessなどのチューニング、必要に応じた圧縮スワップや暗号化の導入が求められます。用途とハードウェア特性(HDD/SSD、RAIDなど)を踏まえた上で設計・運用することが重要です。
参考文献
- Swapping (computer science) — Wikipedia
- Linux kernel documentation — Swap
- vm.swappiness — kernel sysctl documentation
- ArchWiki — Swap
- ArchWiki — Zswap
- Microsoft Docs — Defining virtual memory


