スワップアウトとは|仕組み・スラッシング対策・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など)を踏まえた上で設計・運用することが重要です。

参考文献