やりたかったこと

VPSのRAMが1GBしかなく、DockerやNode.jsを動かしたらOOM Killerが発動してプロセスが落ちた。 スワップ領域を追加してメモリ不足を緩和したかった。

スワップとは

実メモリ(RAM)が不足したとき、ディスクの一部をメモリの代わりに使う仕組み。 RAMより遅いが、プロセスが強制終了されるよりはマシ。

スワップファイルを作成する

# 2GBのスワップファイルを作成(bs=1M × count=2048)
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

# パーミッションを設定(rootのみ読み書き可能)
sudo chmod 600 /swapfile

# スワップ領域としてフォーマット
sudo mkswap /swapfile

スワップを有効にする

# スワップを有効化
sudo swapon /swapfile

# 有効になっているか確認
sudo swapon --show

以下のように表示されれば成功。

NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

スワップの使用状況を確認する

# メモリとスワップの使用状況
free -h
              total        used        free      shared  buff/cache   available
Mem:          980Mi       400Mi       100Mi        10Mi       480Mi       450Mi
Swap:         2.0Gi         0B       2.0Gi
# より詳細な確認
cat /proc/meminfo | grep -i swap

再起動後も自動でマウントする

このままだと再起動するとスワップが無効になる。/etc/fstab に追記して永続化する。

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

設定が正しいか確認する。

cat /etc/fstab | grep swap
/swapfile none swap sw 0 0

swappinessを調整する

swappiness はRAMとスワップをどれくらい積極的に切り替えるかの設定値(0〜100)。 VPSではデフォルト60になっていることが多いが、サーバー用途では低めにすることが多い。

# 現在の値を確認
cat /proc/sys/vm/swappiness

# 一時的に変更(再起動で元に戻る)
sudo sysctl vm.swappiness=10

# 永続化
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

スワップを削除したいとき

# スワップを無効化
sudo swapoff /swapfile

# ファイルを削除
sudo rm /swapfile

# /etc/fstab からも該当行を削除する
sudo vim /etc/fstab

ハマったポイント

  • chmod 600 を忘れると mkswap がエラーになる
  • /etc/fstab に追記しないと再起動のたびにスワップが消える
  • スワップのサイズはRAMの1〜2倍が目安(RAM 1GBなら2GBのスワップ)
  • SSDのVPSでは書き込み回数を増やすので swappiness を低くする(10前後)がおすすめ
  • free -h で Swap行が 0 のままなら swapon ができていない

スワップを設定してもディスク容量が足りない場合はLinuxでディスク使用量を確認する方法(df/du)で大きなファイルを探して削除するとよい。

関連記事

おすすめのVPS/ドメイン

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。