やりたかったこと
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)で大きなファイルを探して削除するとよい。
関連記事
- Linuxの基本コマンド(ls/cd/mkdir/rm)まとめ
- Linuxのディスク使用量を確認するコマンド(df/du)
- Linuxのプロセス管理(ps/kill/top)
- VPSにDockerをインストールして使い始める方法
おすすめのVPS/ドメイン
VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。