summary refs log tree commit diff
path: root/nixos/modules/services/system/earlyoom.nix
blob: ddd5bcebcdd5ffc339e8e7fa751984764514d7c5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
{ config, lib, pkgs, ... }:

let
  cfg = config.services.earlyoom;

  inherit (lib)
    mkDefault mkEnableOption mkIf mkOption types
    mkRemovedOptionModule
    concatStringsSep optional;

in
{
  options.services.earlyoom = {
    enable = mkEnableOption "Early out of memory killing";

    freeMemThreshold = mkOption {
      type = types.ints.between 1 100;
      default = 10;
      description = ''
        Minimum of availabe memory (in percent).
        If the free memory falls below this threshold and the analog is true for
        <option>services.earlyoom.freeSwapThreshold</option>
        the killing begins.
      '';
    };

    freeSwapThreshold = mkOption {
      type = types.ints.between 1 100;
      default = 10;
      description = ''
        Minimum of availabe swap space (in percent).
        If the available swap space falls below this threshold and the analog
        is true for <option>services.earlyoom.freeMemThreshold</option>
        the killing begins.
      '';
    };

    # TODO: remove or warn after 1.7 (https://github.com/rfjakob/earlyoom/commit/7ebc4554)
    ignoreOOMScoreAdjust = mkOption {
      type = types.bool;
      default = false;
      description = ''
        Ignore oom_score_adjust values of processes.
      '';
    };

    enableDebugInfo = mkOption {
      type = types.bool;
      default = false;
      description = ''
        Enable debugging messages.
      '';
    };

    enableNotifications = mkOption {
      type = types.bool;
      default = false;
      description = ''
        Send notifications about killed processes via the system d-bus.

        WARNING: enabling this option (while convenient) should *not* be done on a
        machine where you do not trust the other users as it allows any other
        local user to DoS your session by spamming notifications.

        To actually see the notifications in your GUI session, you need to have
        <literal>systembus-notify</literal> running as your user which this
        option handles.

        See <link xlink:href="https://github.com/rfjakob/earlyoom#notifications">README</link> for details.
      '';
    };
  };

  imports = [
    (mkRemovedOptionModule [ "services" "earlyoom" "useKernelOOMKiller" ] ''
      This option is deprecated and ignored by earlyoom since 1.2.
    '')
    (mkRemovedOptionModule [ "services" "earlyoom" "notificationsCommand" ] ''
      This option is deprecated and ignored by earlyoom since 1.6.
    '')
  ];

  config = mkIf cfg.enable {
    services.systembus-notify.enable = mkDefault cfg.enableNotifications;

    systemd.services.earlyoom = {
      description = "Early OOM Daemon for Linux";
      wantedBy = [ "multi-user.target" ];
      path = optional cfg.enableNotifications pkgs.dbus;
      serviceConfig = {
        StandardError = "journal";
        ExecStart = concatStringsSep " " ([
          "${pkgs.earlyoom}/bin/earlyoom"
          "-m ${toString cfg.freeMemThreshold}"
          "-s ${toString cfg.freeSwapThreshold}"
        ]
        ++ optional cfg.ignoreOOMScoreAdjust "-i"
        ++ optional cfg.enableDebugInfo "-d"
        ++ optional cfg.enableNotifications "-n"
        );
      };
    };
  };
}