2022-04-21 19:54:50 +02:00
|
|
|
{ config, lib, ... }:
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.systemd.oomd;
|
|
|
|
|
|
|
|
in
|
|
|
|
{
|
2023-12-13 16:39:04 +08:00
|
|
|
imports = [
|
2024-01-01 22:32:22 +01:00
|
|
|
(lib.mkRenamedOptionModule
|
|
|
|
[ "systemd" "oomd" "enableUserServices" ]
|
|
|
|
[ "systemd" "oomd" "enableUserSlices" ]
|
|
|
|
)
|
2023-12-13 16:39:04 +08:00
|
|
|
];
|
|
|
|
|
2022-04-21 19:54:50 +02:00
|
|
|
options.systemd.oomd = {
|
2022-09-28 16:03:39 +02:00
|
|
|
enable = lib.mkEnableOption "the `systemd-oomd` OOM killer" // {
|
|
|
|
default = true;
|
|
|
|
};
|
2022-04-21 19:54:50 +02:00
|
|
|
|
|
|
|
# Fedora enables the first and third option by default. See the 10-oomd-* files here:
|
2023-12-13 15:58:49 +08:00
|
|
|
# https://src.fedoraproject.org/rpms/systemd/tree/806c95e1c70af18f81d499b24cd7acfa4c36ffd6
|
2022-09-28 16:03:39 +02:00
|
|
|
enableRootSlice = lib.mkEnableOption "oomd on the root slice (`-.slice`)";
|
|
|
|
enableSystemSlice = lib.mkEnableOption "oomd on the system slice (`system.slice`)";
|
2023-12-13 15:58:49 +08:00
|
|
|
enableUserSlices = lib.mkEnableOption "oomd on all user slices (`user@.slice`) and all user owned slices";
|
2022-04-21 19:54:50 +02:00
|
|
|
|
|
|
|
extraConfig = lib.mkOption {
|
|
|
|
type =
|
|
|
|
with lib.types;
|
|
|
|
attrsOf (oneOf [
|
|
|
|
str
|
|
|
|
int
|
|
|
|
bool
|
|
|
|
]);
|
|
|
|
default = { };
|
|
|
|
example = lib.literalExpression ''{ DefaultMemoryPressureDurationSec = "20s"; }'';
|
2022-09-28 16:03:39 +02:00
|
|
|
description = ''
|
|
|
|
Extra config options for `systemd-oomd`. See {command}`man oomd.conf`
|
2022-04-21 19:54:50 +02:00
|
|
|
for available options.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
|
|
systemd.additionalUpstreamSystemUnits = [
|
|
|
|
"systemd-oomd.service"
|
|
|
|
"systemd-oomd.socket"
|
|
|
|
];
|
|
|
|
systemd.services.systemd-oomd.wantedBy = [ "multi-user.target" ];
|
|
|
|
|
|
|
|
environment.etc."systemd/oomd.conf".text = lib.generators.toINI { } {
|
|
|
|
OOM = cfg.extraConfig;
|
|
|
|
};
|
|
|
|
|
|
|
|
systemd.oomd.extraConfig.DefaultMemoryPressureDurationSec = lib.mkDefault "20s"; # Fedora default
|
|
|
|
|
|
|
|
users.users.systemd-oom = {
|
|
|
|
description = "systemd-oomd service user";
|
|
|
|
group = "systemd-oom";
|
|
|
|
isSystemUser = true;
|
|
|
|
};
|
|
|
|
users.groups.systemd-oom = { };
|
|
|
|
|
|
|
|
systemd.slices."-".sliceConfig = lib.mkIf cfg.enableRootSlice {
|
2023-12-13 15:58:49 +08:00
|
|
|
ManagedOOMMemoryPressure = "kill";
|
2024-02-15 09:41:26 -08:00
|
|
|
ManagedOOMMemoryPressureLimit = lib.mkDefault "80%";
|
2022-04-21 19:54:50 +02:00
|
|
|
};
|
|
|
|
systemd.slices."system".sliceConfig = lib.mkIf cfg.enableSystemSlice {
|
2023-12-13 15:58:49 +08:00
|
|
|
ManagedOOMMemoryPressure = "kill";
|
2024-02-15 09:41:26 -08:00
|
|
|
ManagedOOMMemoryPressureLimit = lib.mkDefault "80%";
|
2022-04-21 19:54:50 +02:00
|
|
|
};
|
2023-12-13 15:58:49 +08:00
|
|
|
systemd.slices."user-".sliceConfig = lib.mkIf cfg.enableUserSlices {
|
2022-04-21 19:54:50 +02:00
|
|
|
ManagedOOMMemoryPressure = "kill";
|
2024-02-15 09:41:26 -08:00
|
|
|
ManagedOOMMemoryPressureLimit = lib.mkDefault "80%";
|
2023-12-13 15:58:49 +08:00
|
|
|
};
|
|
|
|
systemd.user.units."slice" = lib.mkIf cfg.enableUserSlices {
|
|
|
|
text = ''
|
2024-01-03 02:45:38 +01:00
|
|
|
[Slice]
|
2023-12-13 15:58:49 +08:00
|
|
|
ManagedOOMMemoryPressure=kill
|
|
|
|
ManagedOOMMemoryPressureLimit=80%
|
|
|
|
'';
|
|
|
|
overrideStrategy = "asDropin";
|
2022-04-21 19:54:50 +02:00
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|