Linuxスワップ領域の完全ガイド:種類・設定・swappiness・zramで性能と安定性を最適化

スワップ領域とは何か — 基本の説明

スワップ領域(swap領域)は、物理メモリ(RAM)が不足したときに、一時的にメモリ内容の一部を退避させるためのディスク上の領域です。一般に「スワップする」「スワップアウト/スワップイン」「ページング」といった用語で表現されます。Linuxではスワップ領域を使って匿名メモリ(プロセスが直接確保したメモリ)の一部をディスク上に置き、物理メモリの使用効率を高めます。

なぜスワップが必要か — 目的と利点

  • メモリ不足への緩衝:一時的にメモリ不足になってもシステムが完全に停止するのを防ぐ。
  • メモリの有効活用:長時間使われないページをディスクに追い出して、頻繁にアクセスされるページにRAMを割り当てられる。
  • ハイバネーション(休止)対応:システムのメモリ状態をディスクに保存して電源を切るため、スワップ領域(または専用のスワップパーティション)が必要になる。
  • 低メモリ環境の安定化:組み込み機器やメモリが限られる仮想マシンで有効。

スワップの種類

  • スワップパーティション:ディスク上の専用パーティション。従来からある一般的な方法で、パーティション分割時に確保する。
  • スワップファイル:ファイルとして作成する方法。柔軟にサイズ変更でき、最近のディストリビューションでは標準的に使える。
  • zram(圧縮RAMスワップ):RAM上で圧縮領域を作り、そこにページを格納する。ディスクI/Oを伴わず高速で、低メモリ環境で有効。
  • zswap:圧縮キャッシュとしてRAM内でページを保持し、必要に応じてディスクスワップにフォールバックする仕組み。
  • 暗号化スワップ:プライバシー保護のためにスワップ領域を暗号化して利用する(起動ごとにランダムキーを使うことが多い)。

Linuxでの具体的な取り扱い(コマンドと設定)

代表的なコマンドと確認方法:

  • swapon --show:有効なスワップ領域の一覧を表示
  • free -h:メモリとスワップの使用状況を簡潔に表示
  • cat /proc/meminfo:スワップ総量(SwapTotal)や使用量(SwapFree)を表示
  • mkswap /path/to/swapfile:スワップファイルを初期化
  • swapon /path/to/swapfileswapoff /path/to/swapfile:スワップの有効化/無効化

スワップファイル作成の一般的な手順(例):

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

注:ファイルシステムの種類によっては追加の注意が必要です(例えば古いカーネルではBtrfs上のスワップファイルに制約があった)。

スワップのチューニング — swappiness と優先度

Linuxには vm.swappiness というカーネルパラメータがあり、0〜100の値でスワップをどの程度積極的に使うかを制御します。デフォルトはディストリビューションによって異なりますが、多くは60です。低い値(例:10)はできるだけRAMを使い、スワップ使用を抑える設定です。高い値はより積極的にスワップを利用します。

一時的に変更するには:

sysctl vm.swappiness=10
# 永続化するには /etc/sysctl.conf に設定を追加

また、複数のスワップ領域がある場合は swapon -p 優先度 で優先度を指定できます。

パフォーマンスと注意点

  • 速度低下のリスク:スワップはディスクI/Oを伴うため、RAMに比べてアクセスが遅く、スワップが頻発するとシステム全体が著しく遅くなる(スラッシング)。
  • SSDへの影響:SSDはHDDより高速だが、書き込み回数に制限があるため、過度のスワップは寿命を縮める可能性がある。ただし現代のSSDは耐久性が上がっており、必ずしも大きな問題になるとは限らない。
  • ハイバネーション要件:休止状態(メモリ内容をディスクにダンプ)を使う場合、スワップ領域の容量は物理メモリ以上が推奨される(OSや設定によってはRAMサイズ+αが必要)。
  • ファイルシステムとの相性:一部のファイルシステムではスワップファイルに制約がある(古いカーネルとBtrfsなど)。運用環境に合わせて検証すること。

スワップが原因で発生する問題と対処法

  • スラッシング(頻繁なスワップ) → メモリ増設、swappinessを下げる、不要プロセスの削減
  • ディスクI/O増加 → I/OスケジューラやQoSの調整、zram導入でI/O削減
  • プライバシーリスク(スワップに機密データが残る) → 暗号化スワップ、起動時にランダムキーでマウント
  • ハイバネーション失敗 → スワップ容量不足の可能性。スワップパーティションを用意するかスワップファイルのサイズを確保

モニタリングの実践例

スワップ使用を監視する基本コマンド:

  • free -h:短時間での確認に便利
  • vmstat 1:リアルタイムにページング(si/s_o)やプロセス・I/Oを観察
  • top / htop:プロセス単位でメモリ使用状況を確認(スワップ使用が多いプロセスを特定)
  • 長期監視 → Prometheus + node_exporter で node_memory_SwapTotal 等を収集してアラート設定

設計上のガイドライン(目安)

  • デスクトップやサーバで十分なRAMがあればスワップは最小限で良い(スワップは保険)。
  • ハイバネーションを使う場合は、スワップ容量 >= 物理RAM(+余裕)を確保。
  • メモリが限定される環境では zram を活用し、物理ディスクへのスワップを抑える。
  • 性能重視のサーバ(データベース等)ではスワップを避け、メモリ増設で対応することが多い。

まとめ

スワップ領域はシステムの安定性を保つための重要な仕組みであり、用途や環境に応じて適切に構成・監視・チューニングする必要があります。スワップを単に「遅い代替メモリ」として扱うのではなく、zramやswappinessの調整、暗号化、ハイバネーション要件などを含めた総合的な設計が求められます。

参考文献