VPSにSwapを追加してOOM対策した話
ある日管理しているサイトが落ちていました。
原因を調べてみると、PostgreSQLがOOMキラーに強制終了させられていました。
Swapファイルを追加したので、その一連を書き残しておきます。
Swapとは
ClaudeにSwapとはなんなのか、ざっくり説明してもらいました。
Swapを一言で言うと、RAMが足りなくなったときの一時退避場所。
RAM = 作業机(速い、容量が小さい)
Swap = 机の横の棚(遅い、容量が大きい)机がいっぱいになったら、しばらく使っていないものを棚に移して作業スペースを確保する。Swapはその棚にあたる。
# 仕組み
RAMが足りなくなる
Linuxが「しばらく使っていないメモリ」をSwap(ディスク上のファイル)に書き出す
RAMに空きができる
そのデータが必要になったらRAMに読み戻す# 注意点
SwapはRAMと比べて圧倒的に遅い。RAMがナノ秒単位なのに対し、Swapはディスクを使うためマイクロ〜ミリ秒単位になる。# そのため:
Swapを頻繁に使っている状態 = メモリ不足のサイン
SwapはあくまでOOMキラーを防ぐ保険
根本的な解決はRAM増設やプロセスの最適化が必要今回のケースでは、Swap 0の状態ではメモリが少し溢れただけで即OOMキラーが発動していた。2GB追加したことで「溢れても即死しない」状態になった。
# VPSのデフォルト設定について
多くのVPSはデフォルトでSwapが設定されていない。RAM 2GB以下のVPSを運用している場合は、念のため確認しておくことをおすすめする。
まさに今回落ちていたVPSはデフォルト設定のままでしたので、Swapは追加されていませんでした。
OOMキラーにPostgreSQLが殺された
状況確認
サイトが落ちていたので、まずPostgreSQLのクラスター状態を確認しました。
pg_lsclusters
// 結果
Ver Cluster Port Status
16 main 5432 downdown になっていたので起動しようとしましたが、その前にログを確認するとOOMキラーの痕跡が見つかりました。
sudo grep -i "killed process" /var/log/syslog | tail -20
// 結果
Out of memory: Killed process [PID] (postgres) total-vm:220416kB, ...原因
メモリ状況を確認すると原因は明白でした。
free -h
// 結果
total used free shared buff/cache available
Mem: 1.9Gi 726Mi 633Mi 146Mi 914Mi 1.2Gi
Swap: 0B 0B 0B
RAM 1.9GB、Swap 0B。Swapが存在しないため、メモリが一時的にひっ迫した瞬間、Linuxカーネルが「このままではシステム全体が死ぬ」と判断し、メモリを多く使っていたPostgreSQLを強制終了。
OOMキラー(Out of Memory Killer)。なるほど。
Swap追加
2GBのSwapファイルを追加しました。
2GBのSwapファイル作成
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile再起動後も有効にする
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab確認
free -h
// 結果
total used free shared buff/cache available
Mem: 1.9Gi 739Mi 617Mi 148Mi 919Mi 1.2Gi
Swap: 2.0Gi 0B 2.0GiSwap 2GBが有効になった。swapon した時点で即時有効になるため、再起動は不要です。
まとめ
free -h上記のコマンドを打ってSwap: 0B と表示されていたら、この記事の手順でSwapを追加しておくといいかもしれません。
このカテゴリの最新記事
2024.12.13
2024.01.12
2024.05.30
2023.11.22