nixpkgs/nixos/modules/services/scheduling/scx.nix
John Titor 3e710e6d15
nixos/scx: init
This adds a `services.scx.enable` option to enable sched-ext schedulers.

Requires a kernel with sched-ext enabled (6.12+) or a kernel with the patchset.

requiredKernelConfigs are taken from https://cateee.net/lkddb/web-lkddb/SCHED_CLASS_EXT.html
2024-11-19 23:09:53 +05:30

111 lines
3.0 KiB
Nix

{
lib,
pkgs,
config,
...
}:
let
cfg = config.services.scx;
in
{
options.services.scx = {
enable = lib.mkEnableOption null // {
description = ''
Whether to enable SCX service, a daemon to run schedulers from userspace.
::: {.note}
This service requires a kernel with the Sched-ext feature.
Generally, kernel version 6.12 and later are supported.
:::
'';
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.scx.full;
defaultText = lib.literalExpression "pkgs.scx.full";
example = lib.literalExpression "pkgs.scx.rustland";
description = ''
`scx` package to use. `scx.full`, which includes all schedulers, is the default.
You may choose a minimal package, such as `pkgs.scx.rustland`, if only one specific scheduler is needed.
::: {.note}
Overriding this does not change the default scheduler; you should set `services.scx.scheduler` for it.
:::
'';
};
scheduler = lib.mkOption {
type = lib.types.enum [
"scx_bpfland"
"scx_central"
"scx_flatcg"
"scx_lavd"
"scx_layered"
"scx_nest"
"scx_pair"
"scx_qmap"
"scx_rlfifo"
"scx_rustland"
"scx_rusty"
"scx_simple"
"scx_userland"
];
default = "scx_rustland";
example = "scx_bpfland";
description = ''
Which scheduler to use. See [SCX documentation](https://github.com/sched-ext/scx/tree/main/scheds)
for details on each scheduler and guidance on selecting the most suitable one.
'';
};
extraArgs = lib.mkOption {
type = lib.types.listOf lib.types.singleLineStr;
example = [
"--slice-us 5000"
"--verbose"
];
description = ''
Parameters passed to the chosen scheduler at runtime.
::: {.note}
Run `chosen-scx-scheduler --help` to see the available options. Generally,
each scheduler has its own set of options, and they are incompatible with each other.
:::
'';
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ cfg.package ];
systemd.services.scx = {
description = "SCX scheduler daemon";
# SCX service should be started only if the kernel supports sched-ext
unitConfig.ConditionPathIsDirectory = "/sys/kernel/sched_ext";
startLimitIntervalSec = 30;
startLimitBurst = 2;
serviceConfig = {
Type = "simple";
ExecStart = "${lib.getExe' cfg.package cfg.scheduler} ${lib.concatStringsSep " " cfg.extraArgs}";
Restart = "on-failure";
StandardError = "journal";
};
wantedBy = [ "multi-user.target" ];
};
assertions = [
{
assertion = lib.versionAtLeast config.boot.kernelPackages.kernel.version "6.12";
message = "SCX is only supported on kernel version >= 6.12.";
}
];
};
meta.maintainers = with lib.maintainers; [ johnrtitor ];
}