systemd-oomd

systemdに同梱されているユーザースペースのOOM (Out Of Memory) デーモン。cgroup v2とPSI (Pressure Stall Information) を使い、カーネル空間で本来のOOM killerが発動する前に、プロセスをkillしてシステムの応答性を保つ。earlyoomと目的は同じだが、PSIベースで「どれだけタスクがリソース待ちで遅延しているか」を見て判断する点が異なる。

動作原理

  • cgroup単位でPSIのmemory.pressureとswap使用率を定期的にポーリングする。
  • 監視対象になるのは、systemdのUnit設定でManagedOOMSwap=killまたはManagedOOMMemoryPressure=killが指定されたcgroupのみ(デフォルトのautoでは監視対象にならない)。
  • 判定基準は2種類:
    • swapベース: メモリとスワップの使用率が両方ともSwapUsedLimit(デフォルト90%)を超えるとkill対象を探す。
    • PSIベース: cgroupのmemory.pressureDefaultMemoryPressureLimit(デフォルト60%、10秒ウィンドウでの遅延割合)をDefaultMemoryPressureDurationSec(デフォルト30秒)継続して超過するとkill対象を探す。
  • kill候補の中からリソース使用量が最大のcgroup/プロセスを選んで終了させる。

必要要件

  • 統一cgroup階層(cgroup v2)
  • メモリアカウンティング有効化(DefaultMemoryAccounting=trueが推奨)
  • PSI対応カーネル(Linux 4.20以降)
  • swapの有効化が強く推奨される(swapがないとPSIが反応する前に一気にOOMへ突入しやすいため)

設定ファイル: oomd.conf

[OOM]セクションの主なオプション:

オプション デフォルト値 意味
SwapUsedLimit= 90% メモリ+スワップ使用率がこの値を超えたら動作開始
DefaultMemoryPressureLimit= 60% cgroupのメモリ圧力(10秒ウィンドウ内の遅延割合)の閾値
DefaultMemoryPressureDurationSec= 30秒 閾値超過がこの秒数継続したら発動
PrekillHookTimeoutSec= 0(無効) kill前フックの完了を待つ時間

Unit側の設定 (systemd.resource-control)

.service/.slice等のUnitファイルで指定する:

  • ManagedOOMSwap=auto|kill — swapベース監視の対象にするか。ルートスライス(-.slice)にkillを設定するのが定石。
  • ManagedOOMMemoryPressure=auto|kill — PSIベース監視の対象にするか。
  • ManagedOOMMemoryPressureLimit= — Unit単位でDefaultMemoryPressureLimitを上書き。システムスライスは60%、ユーザーサービスは40%など用途で調整することが推奨される。
  • ManagedOOMPreference=none|avoid|omit — kill候補選択時の優先度。avoidは他に選択肢がなければ選ばれる、omitは候補から完全除外。

earlyoomとの違い

systemd-oomd earlyoom
判定基準 PSI (memory.pressure) + swap使用率 available memory + free swap の割合
監視粒度 cgroup単位 プロセス単位(oom_score)
依存 systemd, cgroup v2, PSI対応カーネル(4.20+) なし(依存最小・軽量)
設定 Unit単位でopt-in方式(ManagedOOM*=kill) コマンドラインオプションで全体設定

systemdディストリビューション(Fedora Workstation/Server等)では標準で有効化されていることが多い。

出典

作成日時: 2026-08-19 14:27 / 更新日時: 2026-08-19 14:27