メモリの食いつぶしを防ぐ
概要
- Linux では、システムの物理メモリの使用率が 100% を超えると、スワップ領域が使われる。
- スワップ領域の使用率が 100% となると、OOM killer (Out of Memory Killer) と呼ばれる機能によってメモリを多く使っているアプリケーションやプロセスが強制的に終了される。
- しかし、GUI で操作可能なシステムでは、スワップ領域が使い尽くされるまでの間、メモリを新たに確保することができないため、実質ほぼ何もできない状態となる (システムモニタを既に開いていた場合や端末で該当プロセスを実行中の場合を除く)。
- 物理メモリが使い尽くされた時点で、OOM killer のようにメモリを大量に使っているプロセスを強制終了することができれば、何らかの対処が可能である。
- 特に開発しているプログラムが、誤って無限ループや大量にメモリを使うコードになっているときに助かる。
- ここでは、物理メモリの使用率に応じて、メモリを消費しているプロセスを強制的に終了させる方法を紹介する。
手順
- earlyoom をインストールする。
$ sudo apt install earlyoom
- サービスを有効化する。
$ sudo systemctl --enable --now earlyoom
- 設定を変更するため、
/etc/default/earlyoomを開く。
$ sudoedit /etc/default/earlyoom
EARLYOOM_ARGSの値を以下に変更する。
EARLYOOM_ARGS="-r 3600 -m 5,2 --avoid '(^|/)(Xorg|wayland|gdm3|sddm|lightdm)$'"
-r 3600: 3600 秒ごと (1 時間ごと) にログを出力する。-m 5,2: 空きメモリ 5% 未満で SIGTERM (通常終了)、2% 未満で SIGKILL (強制終了) するようにする。–avoid '(^|/)(Xorg|wayland|gdm3|sddm|lightdm)$': マッチしたプロセス (ここでは、GUI 関連) を終了しにくくする。
- 設定を反映する。
$ sudo systemctl restart earlyoom