「メモリ使用率が100%近くになってシステムが重い…」 「アプリケーションが突然クラッシュする」 「大きなファイルを開くとフリーズしてしまう」
こんな経験はありませんか?
Linuxのスワップ領域は、物理メモリ(RAM)が不足した時の「保険」として機能する重要な仕組みです。適切に設定すれば、メモリ不足によるシステムクラッシュを防ぎ、より多くのアプリケーションを同時に実行できるようになります。
でも、「スワップって本当に必要?」「どれくらいのサイズにすればいい?」「SSDでも使って大丈夫?」など、疑問も多いですよね。
この記事では、Linuxスワップ領域について、基本的な仕組みから実践的な設定方法、パフォーマンスチューニングまで、すべてを分かりやすく解説します。これを読めば、あなたのLinuxシステムを最適化できるようになりますよ!
スワップ領域の基本を理解しよう

スワップとは何か?
スワップ領域を、図書館の書庫に例えてみましょう。
メモリとスワップの関係:
- RAM(物理メモリ):すぐ手に取れる本棚(高速アクセス)
- スワップ領域:地下の書庫(低速だが大容量)
- CPU:本を読む人
本棚がいっぱいになったら、あまり読まない本を書庫に移動。
必要になったらまた本棚に戻す。
これがスワップの基本的な仕組みです。
なぜスワップが必要なのか
スワップのメリット:
- メモリ不足対策:物理メモリを超えるデータを扱える
- システム安定性:OOM Killer(メモリ不足時の強制終了)を回避
- 休止状態(Hibernate):メモリ内容をディスクに保存
- メモリ最適化:使用頻度の低いデータを退避
スワップが特に重要な場面:
- メモリが少ないシステム(4GB以下)
- 大規模なコンパイル作業
- 仮想マシンの運用
- データベースサーバー
- デスクトップ環境での多重タスク
スワップ領域の確認方法
現在のスワップ状態を確認
# スワップの使用状況を確認
free -h
# 出力例
total used free shared buff/cache available
Mem: 7.7G 3.2G 1.8G 245M 2.7G 4.0G
Swap: 2.0G 512M 1.5G
# より詳細な情報
swapon --show
# 出力例
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 2G 512.3M -2
/proc/meminfoでの詳細確認
# スワップ関連の詳細情報
cat /proc/meminfo | grep -i swap
# 出力例
SwapCached: 45236 kB
SwapTotal: 2097148 kB
SwapFree: 1571892 kB
vmstatでリアルタイム監視
# 1秒ごとにメモリとスワップの状態を表示
vmstat 1
# si: スワップイン(ディスク→メモリ)
# so: スワップアウト(メモリ→ディスク)
スワップパーティションの作成

新規パーティションの作成
# 1. パーティションツールを起動
sudo fdisk /dev/sdb
# 2. fdisk内での操作
n # 新規パーティション作成
p # プライマリパーティション
1 # パーティション番号
# 開始セクタ(Enter)
+4G # サイズ指定(4GBの例)
t # タイプ変更
82 # Linux swap
w # 書き込み
# 3. スワップ領域として初期化
sudo mkswap /dev/sdb1
# 4. スワップを有効化
sudo swapon /dev/sdb1
# 5. 優先度を指定して有効化(オプション)
sudo swapon -p 10 /dev/sdb1
/etc/fstabへの登録
# 永続化のため/etc/fstabに追加
echo '/dev/sdb1 none swap sw 0 0' | sudo tee -a /etc/fstab
# またはUUIDを使用(推奨)
sudo blkid /dev/sdb1 # UUIDを確認
# UUID=xxx-xxx-xxx none swap sw 0 0
スワップファイルの作成
スワップファイル vs スワップパーティション
スワップファイルのメリット:
- サイズ変更が簡単
- パーティション分割不要
- 動的な追加・削除が可能
スワップパーティションのメリット:
- わずかに高速
- 休止状態(Hibernate)により適している
- 従来からの標準的な方法
スワップファイルの作成手順
# 1. スワップファイルを作成(4GBの例)
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
# または高速な方法(fallocateを使用)
sudo fallocate -l 4G /swapfile
# 2. 適切な権限を設定
sudo chmod 600 /swapfile
# 3. スワップ領域として初期化
sudo mkswap /swapfile
# 4. スワップを有効化
sudo swapon /swapfile
# 5. 確認
swapon --show
# 6. /etc/fstabに追加(永続化)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
複数のスワップファイル管理
# 追加のスワップファイル作成
sudo fallocate -l 2G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon -p 5 /swapfile2 # 優先度5で追加
適切なスワップサイズの決め方
従来の推奨サイズ
一般的なガイドライン:
物理メモリ | 推奨スワップサイズ | 休止状態を使う場合 |
---|---|---|
2GB以下 | メモリの2倍 | メモリの3倍 |
2-8GB | メモリと同じ | メモリの2倍 |
8-64GB | 最低4GB | メモリの1.5倍 |
64GB以上 | 最低4GB | 非推奨 |
用途別の推奨設定
デスクトップ環境:
# 一般的な使用(8GB RAM)
スワップ: 4-8GB
# 動画編集・3D作業(16GB RAM)
スワップ: 8-16GB
サーバー環境:
# Webサーバー(軽量)
スワップ: 2-4GB
# データベースサーバー
スワップ: メモリの25-50%
# コンテナホスト(Docker/Kubernetes)
スワップ: 最小限またはなし
動的なサイズ調整
# 現在のスワップサイズを確認
free -h
# 一時的にスワップを無効化
sudo swapoff /swapfile
# サイズを変更(例:8GBに拡張)
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
sudo mkswap /swapfile
sudo swapon /swapfile
スワップの優先順位とswappiness
swappinessパラメータ
swappinessは、カーネルがどれくらい積極的にスワップを使うかを制御します(0-100)。
# 現在の値を確認
cat /proc/sys/vm/swappiness
# 一時的に変更(例:10に設定)
sudo sysctl vm.swappiness=10
# 永続的に変更
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
推奨値:
- デスクトップ(SSD): 10
- デスクトップ(HDD): 60(デフォルト)
- サーバー: 30-60
- データベースサーバー: 1-10
スワップの優先順位設定
# 優先順位付きで複数スワップを設定
sudo swapon -p 100 /dev/sda2 # 最高優先度
sudo swapon -p 50 /swapfile # 中優先度
sudo swapon -p 10 /dev/sdb1 # 低優先度
# /etc/fstabでの設定
/dev/sda2 none swap sw,pri=100 0 0
/swapfile none swap sw,pri=50 0 0
zswapとzramの活用

zswap(圧縮スワップキャッシュ)
zswapは、スワップアウトする前にメモリ内で圧縮する機能です。
# zswapを有効化
echo 1 | sudo tee /sys/module/zswap/parameters/enabled
# 圧縮アルゴリズムを確認
cat /sys/module/zswap/parameters/compressor
# ブート時に有効化(GRUB設定)
sudo nano /etc/default/grub
# GRUB_CMDLINE_LINUX_DEFAULT に追加
# zswap.enabled=1 zswap.compressor=lz4
sudo update-grub
zram(圧縮RAMディスク)
# zram-toolsをインストール(Ubuntu/Debian)
sudo apt install zram-tools
# 設定ファイルを編集
sudo nano /etc/default/zramswap
# 設定例
ALGO=lz4
PERCENT=50 # メモリの50%をzramに
PRIORITY=100
# サービスを再起動
sudo systemctl restart zramswap
パフォーマンスチューニング
カーネルパラメータの最適化
# /etc/sysctl.confに追加
vm.swappiness=10 # スワップ使用頻度
vm.vfs_cache_pressure=50 # キャッシュ解放頻度
vm.dirty_background_ratio=5 # バックグラウンド書き込み開始
vm.dirty_ratio=10 # 書き込み開始閾値
vm.min_free_kbytes=65536 # 最小空きメモリ
# 適用
sudo sysctl -p
I/Oスケジューラの調整
# 現在のスケジューラを確認
cat /sys/block/sda/queue/scheduler
# SSD向けの設定(deadline/noop)
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# HDD向けの設定(cfq)
echo cfq | sudo tee /sys/block/sda/queue/scheduler
トラブルシューティング
スワップが使われすぎる場合
# 原因調査
# 1. メモリ使用量の多いプロセスを特定
ps aux --sort=-%mem | head -10
# 2. スワップ使用プロセスを確認
for file in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file
done | sort -k 2 -n -r | head -10
# 対策
# swappinessを下げる
sudo sysctl vm.swappiness=1
スワップが有効にならない
# 診断手順
# 1. スワップ状態確認
sudo swapon --show
# 2. dmesgでエラー確認
dmesg | grep -i swap
# 3. 権限確認
ls -l /swapfile
# 4. ファイルシステム確認
df -h /
# 5. 手動で有効化を試みる
sudo swapoff -a
sudo swapon -a
システムが重い(スラッシング)
# スラッシング(過度のスワップ)の確認
vmstat 1 5
# si/soの値が継続的に高い場合はスラッシング
# 対策
# 1. 不要なプロセスを停止
# 2. メモリを増設
# 3. OOM Killerの調整
echo 1000 | sudo tee /proc/[PID]/oom_score_adj
SSDでのスワップ使用
SSD寿命への影響
考慮事項:
- 現代のSSDは耐久性が向上
- TRIMサポートで寿命延長
- 適切な設定で影響を最小化
# TRIMを有効化(スワップファイルの場合)
sudo fstrim -v /
# SSD向け最適化
# swappinessを低く設定
echo 'vm.swappiness=1' | sudo tee -a /etc/sysctl.conf
# ディスクキャッシュを調整
echo 'vm.dirty_background_ratio=3' | sudo tee -a /etc/sysctl.conf
echo 'vm.dirty_ratio=5' | sudo tee -a /etc/sysctl.conf
監視とメンテナンス
監視スクリプト
#!/bin/bash
# swap_monitor.sh
THRESHOLD=80 # 警告閾値(%)
while true; do
SWAP_USAGE=$(free | grep Swap | awk '{print ($3/$2)*100}')
if (( $(echo "$SWAP_USAGE > $THRESHOLD" | bc -l) )); then
echo "警告: スワップ使用率が${SWAP_USAGE}%です"
# メール通知やログ記録
fi
sleep 60
done
定期メンテナンス
# スワップのクリア(メモリに余裕がある時)
sudo swapoff -a && sudo swapon -a
# スワップ使用統計のリセット
echo 3 | sudo tee /proc/sys/vm/drop_caches
よくある質問と回答
Q: スワップは必須?RAMが十分あれば不要?
A: 少量でも設定を推奨します。緊急時の保険として機能し、カーネルのメモリ管理を最適化します。最低2-4GBは確保しましょう。
Q: スワップパーティションとファイル、どちらがいい?
A: 性能差はわずかです。柔軟性を重視するならファイル、休止状態を使うならパーティションがおすすめです。
Q: Dockerコンテナでスワップは使える?
A: ホストのスワップを共有します。コンテナ個別の制限は --memory-swap
オプションで設定できます。
Q: スワップを完全に無効化してもいい?
A: 可能ですが推奨しません。OOM Killerが頻発し、システムが不安定になる可能性があります。
Q: NVMe SSDでもスワップは遅い?
A: RAMより遅いですが、従来のHDDと比べれば格段に高速です。適度な使用なら問題ありません。
まとめ:適切なスワップ設定で安定運用を
Linuxのスワップ領域は、システムの安定性と柔軟性を提供する重要な機能です。
設定のポイント:
- 用途に応じた適切なサイズを設定
- swappinessでバランスを調整
- SSDでは控えめな設定に
- 定期的な監視でトラブルを予防
- zswap/zramで効率化
推奨構成:
- メモリ8GB以下:スワップ必須(4-8GB)
- メモリ16GB以上:最小限のスワップ(2-4GB)
- サーバー:用途に応じて調整
- SSD環境:swappiness=1-10
適切に設定されたスワップは、メモリ不足の緊急時にシステムを守る「保険」として機能します。この記事を参考に、あなたのLinuxシステムに最適なスワップ設定を見つけてください。
快適で安定したLinux環境を構築して、生産性を向上させましょう!
コメント