From: Mike Yuan Date: Mon, 14 Apr 2025 12:07:59 +0000 (+0200) Subject: core: always enable CPU accounting X-Git-Tag: v258-rc1~595^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F37448%2Fhead;p=thirdparty%2Fsystemd.git core: always enable CPU accounting Our baseline is v5.4 and cgroup v2 is enforced now, which means CPU accounting is cheap everywhere without requiring any controller, hence just remove the directive. --- diff --git a/man/org.freedesktop.systemd1.xml b/man/org.freedesktop.systemd1.xml index 4c6b1a54d15..384d0aa3301 100644 --- a/man/org.freedesktop.systemd1.xml +++ b/man/org.freedesktop.systemd1.xml @@ -469,8 +469,6 @@ node /org/freedesktop/systemd1 { @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly u DefaultStartLimitBurst = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("const") - readonly b DefaultCPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly b DefaultIOAccounting = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly b DefaultIPAccounting = ...; @@ -707,8 +705,6 @@ node /org/freedesktop/systemd1 { - - @@ -1151,8 +1147,6 @@ node /org/freedesktop/systemd1 { - - @@ -2884,8 +2878,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -3525,8 +3517,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice { - - @@ -4179,8 +4169,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice { - - @@ -5037,8 +5025,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -5690,8 +5676,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket { - - @@ -6316,8 +6300,6 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket { - - @@ -7006,8 +6988,6 @@ node /org/freedesktop/systemd1/unit/home_2emount { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -7589,8 +7569,6 @@ node /org/freedesktop/systemd1/unit/home_2emount { - - @@ -8131,8 +8109,6 @@ node /org/freedesktop/systemd1/unit/home_2emount { - - @@ -8948,8 +8924,6 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -9513,8 +9487,6 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap { - - @@ -10037,8 +10009,6 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap { - - @@ -10713,8 +10683,6 @@ node /org/freedesktop/systemd1/unit/system_2eslice { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -10894,8 +10862,6 @@ node /org/freedesktop/systemd1/unit/system_2eslice { - - @@ -11082,8 +11048,6 @@ node /org/freedesktop/systemd1/unit/system_2eslice { - - @@ -11295,8 +11259,6 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope { @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly s DelegateSubgroup = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") - readonly b CPUAccounting = ...; - @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t CPUWeight = ...; @org.freedesktop.DBus.Property.EmitsChangedSignal("false") readonly t StartupCPUWeight = ...; @@ -11490,8 +11452,6 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope { - - @@ -11702,8 +11662,6 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope { - - diff --git a/man/systemd-cgtop.xml b/man/systemd-cgtop.xml index 9ed60e2edc6..d734ccd283b 100644 --- a/man/systemd-cgtop.xml +++ b/man/systemd-cgtop.xml @@ -46,11 +46,9 @@ given, is honored. This mode is suitable for scripting. Resource usage is only accounted for control groups with the appropriate controllers turned on: - cpu controller for CPU usage, memory controller for memory usage, - and io controller for disk I/O consumption. If resource monitoring for these resources - is required, it is recommended to add the CPUAccounting=1, - MemoryAccounting=1 and IOAccounting=1 settings in the unit files in - question. See + memory controller for memory usage and io controller for disk I/O consumption. + If resource monitoring for these resources is required, it is recommended to add the MemoryAccounting=1 + and IOAccounting=1 settings in the unit files in question. See systemd.resource-control5 for details. @@ -59,10 +57,9 @@ the CPU load value is going to be between 0% and 800%. The number of processors can be found in /proc/cpuinfo. - To emphasize: unless CPUAccounting=1, MemoryAccounting=1, and - IOAccounting=1 are enabled for the services in question, no resource accounting will - be available for system services and the data shown by systemd-cgtop will be - incomplete. + To emphasize: unless MemoryAccounting=1 and IOAccounting=1 + are enabled for the services in question, no resource accounting will be available for system services + and the data shown by systemd-cgtop will be incomplete. diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml index b42a49f6436..23c422df807 100644 --- a/man/systemd-system.conf.xml +++ b/man/systemd-system.conf.xml @@ -201,7 +201,6 @@ - DefaultCPUAccounting= DefaultMemoryAccounting= DefaultTasksAccounting= DefaultIOAccounting= @@ -209,14 +208,12 @@ Configure the default resource accounting settings, as configured per-unit by - CPUAccounting=, MemoryAccounting=, - TasksAccounting=, IOAccounting= and - IPAccounting=. See + MemoryAccounting=, TasksAccounting=, IOAccounting=, + and IPAccounting=. See systemd.resource-control5 for details on the per-unit settings. - DefaultCPUAccounting= defaults to yes when running on kernel ≥4.15, and no on older versions. - DefaultMemoryAccounting= defaults to &MEMORY_ACCOUNTING_DEFAULT;. + DefaultMemoryAccounting= defaults to &MEMORY_ACCOUNTING_DEFAULT;. DefaultTasksAccounting= defaults to yes. The other settings default to no. @@ -759,6 +756,15 @@ to the unified cgroup hierarchy. + + + + systemd 258 + + DefaultCPUAccounting= setting is deprecated, because CPU accounting + is always available on the unified cgroup hierarchy and such setting has no effect. + + diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml index aefee94cac5..07c2f617ca6 100644 --- a/man/systemd.resource-control.xml +++ b/man/systemd.resource-control.xml @@ -179,30 +179,10 @@ CPUWeight=20 DisableControllers=cpu / \ Units of the types listed above can have settings for resource control configuration: - CPU Accounting and Control + CPU Control - - CPUAccounting= - - - Turn on CPU usage accounting for this unit. Takes a - boolean argument. Note that turning on CPU accounting for - one unit will also implicitly turn it on for all units - contained in the same slice and for all its parent slices - and the units contained therein. The system default for this - setting may be controlled with - DefaultCPUAccounting= in - systemd-system.conf5. - - Under the unified cgroup hierarchy, CPU accounting is available for all units and this - setting has no effect. - - - - - CPUWeight=weight StartupCPUWeight=weight @@ -1707,6 +1687,15 @@ DeviceAllow=/dev/loop-control Please switch to the unified cgroup hierarchy. + + + + systemd 258 + + CPUAccounting= setting is deprecated, because it is always available + on the unified cgroup hierarchy and such setting has no effect. + + diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index cd13b705195..3287c11f7da 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -2181,57 +2181,6 @@ static const char *const cgroup_controller_table[_CGROUP_CONTROLLER_MAX] = { DEFINE_STRING_TABLE_LOOKUP(cgroup_controller, CGroupController); -CGroupMask get_cpu_accounting_mask(void) { - static CGroupMask needed_mask = (CGroupMask) -1; - - /* On kernel ≥4.15 with unified hierarchy, cpu.stat's usage_usec is - * provided externally from the CPU controller, which means we don't - * need to enable the CPU controller just to get metrics. This is good, - * because enabling the CPU controller comes at a minor performance - * hit, especially when it's propagated deep into large hierarchies. - * There's also no separate CPU accounting controller available within - * a unified hierarchy. - * - * This combination of factors results in the desired cgroup mask to - * enable for CPU accounting varying as follows: - * - * ╔═════════════════════╤═════════════════════╗ - * ║ Linux ≥4.15 │ Linux <4.15 ║ - * ╔═══════════════╬═════════════════════╪═════════════════════╣ - * ║ Unified ║ nothing │ CGROUP_MASK_CPU ║ - * ╟───────────────╫─────────────────────┼─────────────────────╢ - * ║ Hybrid/Legacy ║ CGROUP_MASK_CPUACCT │ CGROUP_MASK_CPUACCT ║ - * ╚═══════════════╩═════════════════════╧═════════════════════╝ - * - * We check kernel version here instead of manually checking whether - * cpu.stat is present for every cgroup, as that check in itself would - * already be fairly expensive. - * - * Kernels where this patch has been backported will therefore have the - * CPU controller enabled unnecessarily. This is more expensive than - * necessary, but harmless. ☺️ - */ - - if (needed_mask == (CGroupMask) -1) { - if (cg_all_unified()) { - struct utsname u; - assert_se(uname(&u) >= 0); - - if (strverscmp_improved(u.release, "4.15") < 0) - needed_mask = CGROUP_MASK_CPU; - else - needed_mask = 0; - } else - needed_mask = CGROUP_MASK_CPUACCT; - } - - return needed_mask; -} - -bool cpu_accounting_is_cheap(void) { - return get_cpu_accounting_mask() == 0; -} - static const char* const managed_oom_mode_table[_MANAGED_OOM_MODE_MAX] = { [MANAGED_OOM_AUTO] = "auto", [MANAGED_OOM_KILL] = "kill", diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index 24da02022fe..5af7643b6f0 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -86,9 +86,6 @@ static inline CGroupMask CGROUP_MASK_EXTEND_JOINED(CGroupMask mask) { return mask; } -CGroupMask get_cpu_accounting_mask(void); -bool cpu_accounting_is_cheap(void); - /* Special values for all weight knobs on unified hierarchy */ #define CGROUP_WEIGHT_INVALID UINT64_MAX #define CGROUP_WEIGHT_IDLE UINT64_C(0) diff --git a/src/core/cgroup.c b/src/core/cgroup.c index dbab38c3c08..2050494a859 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -477,7 +477,6 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) { startup_cpuset_mems = cpu_set_to_range_string(&c->startup_cpuset_mems); fprintf(f, - "%sCPUAccounting: %s\n" "%sIOAccounting: %s\n" "%sMemoryAccounting: %s\n" "%sTasksAccounting: %s\n" @@ -516,7 +515,6 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) { "%sManagedOOMPreference: %s\n" "%sMemoryPressureWatch: %s\n" "%sCoredumpReceive: %s\n", - prefix, yes_no(c->cpu_accounting), prefix, yes_no(c->io_accounting), prefix, yes_no(c->memory_accounting), prefix, yes_no(c->tasks_accounting), @@ -1698,9 +1696,6 @@ static CGroupMask unit_get_cgroup_mask(Unit *u) { /* Figure out which controllers we need, based on the cgroup context object */ - if (c->cpu_accounting) - mask |= get_cpu_accounting_mask(); - if (cgroup_context_has_cpu_weight(c) || c->cpu_quota_per_sec_usec != USEC_INFINITY) mask |= CGROUP_MASK_CPU; @@ -3628,10 +3623,6 @@ static int unit_get_cpu_usage_raw(const Unit *u, const CGroupRuntime *crt, nsec_ if (unit_has_host_root_cgroup(u)) return procfs_cpu_get_usage(ret); - /* Requisite controllers for CPU accounting are not enabled */ - if ((get_cpu_accounting_mask() & ~crt->cgroup_realized_mask) != 0) - return -ENODATA; - _cleanup_free_ char *val = NULL; uint64_t us; @@ -3660,9 +3651,6 @@ int unit_get_cpu_usage(Unit *u, nsec_t *ret) { * started. If the cgroup has been removed already, returns the last cached value. To cache the value, simply * call this function with a NULL return value. */ - if (!UNIT_CGROUP_BOOL(u, cpu_accounting)) - return -ENODATA; - CGroupRuntime *crt = unit_get_cgroup_runtime(u); if (!crt) return -ENODATA; diff --git a/src/core/cgroup.h b/src/core/cgroup.h index 88e90851524..bdd4a2236bb 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -123,7 +123,6 @@ typedef enum CGroupPressureWatch { * manager is running (except for an occasional SetProperty() configuration change), outside of reload * cycles. */ struct CGroupContext { - bool cpu_accounting; bool io_accounting; bool memory_accounting; bool tasks_accounting; diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 713bd30265c..326c440cf9f 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -384,7 +384,6 @@ const sd_bus_vtable bus_cgroup_vtable[] = { SD_BUS_PROPERTY("Delegate", "b", bus_property_get_bool, offsetof(CGroupContext, delegate), 0), SD_BUS_PROPERTY("DelegateControllers", "as", property_get_delegate_controllers, 0, 0), SD_BUS_PROPERTY("DelegateSubgroup", "s", NULL, offsetof(CGroupContext, delegate_subgroup), 0), - SD_BUS_PROPERTY("CPUAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, cpu_accounting), 0), SD_BUS_PROPERTY("CPUWeight", "t", NULL, offsetof(CGroupContext, cpu_weight), 0), SD_BUS_PROPERTY("StartupCPUWeight", "t", NULL, offsetof(CGroupContext, startup_cpu_weight), 0), SD_BUS_PROPERTY("CPUQuotaPerSecUSec", "t", bus_property_get_usec, offsetof(CGroupContext, cpu_quota_per_sec_usec), 0), @@ -441,6 +440,7 @@ const sd_bus_vtable bus_cgroup_vtable[] = { SD_BUS_PROPERTY("MemoryPressureThresholdUSec", "t", bus_property_get_usec, offsetof(CGroupContext, memory_pressure_threshold_usec), 0), SD_BUS_PROPERTY("NFTSet", "a(iiss)", property_get_cgroup_nft_set, 0, 0), SD_BUS_PROPERTY("CoredumpReceive", "b", bus_property_get_bool, offsetof(CGroupContext, coredump_receive), 0), + /* deprecated cgroup v1 properties */ SD_BUS_PROPERTY("MemoryLimit", "t", bus_property_get_uint64_max, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), SD_BUS_PROPERTY("CPUShares", "t", bus_property_get_uint64_max, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), @@ -451,6 +451,9 @@ const sd_bus_vtable bus_cgroup_vtable[] = { SD_BUS_PROPERTY("BlockIODeviceWeight", "a(st)", property_get_blockio_ast, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), SD_BUS_PROPERTY("BlockIOReadBandwidth", "a(st)", property_get_blockio_ast, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), SD_BUS_PROPERTY("BlockIOWriteBandwidth", "a(st)", property_get_blockio_ast, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), + /* since kernel v4.15 CPU accounting requires no controller, i.e. is available everywhere */ + SD_BUS_PROPERTY("CPUAccounting", "b", bus_property_get_bool_true, 0, SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), + SD_BUS_VTABLE_END }; @@ -1038,9 +1041,6 @@ int bus_cgroup_set_property( flags |= UNIT_PRIVATE; - if (streq(name, "CPUAccounting")) - return bus_cgroup_set_boolean(u, name, &c->cpu_accounting, get_cpu_accounting_mask(), message, flags, error); - if (streq(name, "CPUWeight")) return bus_cgroup_set_cpu_weight(u, name, &c->cpu_weight, message, flags, error); @@ -2038,7 +2038,8 @@ int bus_cgroup_set_property( "StartupBlockIOWeight", "BlockIODeviceWeight", "BlockIOReadBandwidth", - "BlockIOWriteBandwidth")) { + "BlockIOWriteBandwidth", + "CPUAccounting")) { /* see comment in bus_cgroup_vtable */ r = sd_bus_message_skip(message, NULL); if (r < 0) diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index b2705e04ce5..24b08b1a5d3 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -2887,7 +2887,6 @@ const sd_bus_vtable bus_manager_vtable[] = { SD_BUS_PROPERTY("DefaultStartLimitIntervalSec", "t", bus_property_get_usec, offsetof(Manager, defaults.start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN), SD_BUS_PROPERTY("DefaultStartLimitInterval", "t", bus_property_get_usec, offsetof(Manager, defaults.start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN), SD_BUS_PROPERTY("DefaultStartLimitBurst", "u", bus_property_get_unsigned, offsetof(Manager, defaults.start_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("DefaultCPUAccounting", "b", bus_property_get_bool, offsetof(Manager, defaults.cpu_accounting), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("DefaultIOAccounting", "b", bus_property_get_bool, offsetof(Manager, defaults.io_accounting), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("DefaultIPAccounting", "b", bus_property_get_bool, offsetof(Manager, defaults.ip_accounting), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("DefaultMemoryAccounting", "b", bus_property_get_bool, offsetof(Manager, defaults.memory_accounting), SD_BUS_VTABLE_PROPERTY_CONST), @@ -2932,8 +2931,11 @@ const sd_bus_vtable bus_manager_vtable[] = { SD_BUS_PROPERTY("DefaultOOMScoreAdjust", "i", property_get_oom_score_adjust, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("CtrlAltDelBurstAction", "s", bus_property_get_emergency_action, offsetof(Manager, cad_burst_action), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SoftRebootsCount", "u", bus_property_get_unsigned, offsetof(Manager, soft_reboots_count), SD_BUS_VTABLE_PROPERTY_CONST), + /* deprecated cgroup v1 property */ SD_BUS_PROPERTY("DefaultBlockIOAccounting", "b", bus_property_get_bool_false, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), + /* see comment in bus_cgroup_vtable */ + SD_BUS_PROPERTY("DefaultCPUAccounting", "b", bus_property_get_bool_true, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_DEPRECATED|SD_BUS_VTABLE_HIDDEN), SD_BUS_METHOD_WITH_ARGS("GetUnit", SD_BUS_ARGS("s", name), diff --git a/src/core/execute-serialize.c b/src/core/execute-serialize.c index 18ec06b6a49..2a91a6fadb1 100644 --- a/src/core/execute-serialize.c +++ b/src/core/execute-serialize.c @@ -34,10 +34,6 @@ static int exec_cgroup_context_serialize(const CGroupContext *c, FILE *f) { if (!c) return 0; - r = serialize_bool_elide(f, "exec-cgroup-context-cpu-accounting", c->cpu_accounting); - if (r < 0) - return r; - r = serialize_bool_elide(f, "exec-cgroup-context-io-accounting", c->io_accounting); if (r < 0) return r; @@ -445,12 +441,7 @@ static int exec_cgroup_context_deserialize(CGroupContext *c, FILE *f) { if (r == 0) /* eof or end marker */ break; - if ((val = startswith(l, "exec-cgroup-context-cpu-accounting="))) { - r = parse_boolean(val); - if (r < 0) - return r; - c->cpu_accounting = r; - } else if ((val = startswith(l, "exec-cgroup-context-io-accounting="))) { + if ((val = startswith(l, "exec-cgroup-context-io-accounting="))) { r = parse_boolean(val); if (r < 0) return r; diff --git a/src/core/load-fragment-gperf.gperf.in b/src/core/load-fragment-gperf.gperf.in index 2c0a0b629aa..aeccf07d55b 100644 --- a/src/core/load-fragment-gperf.gperf.in +++ b/src/core/load-fragment-gperf.gperf.in @@ -201,7 +201,7 @@ {{type}}.StartupAllowedCPUs, config_parse_allowed_cpuset, 0, offsetof({{type}}, cgroup_context.startup_cpuset_cpus) {{type}}.AllowedMemoryNodes, config_parse_allowed_cpuset, 0, offsetof({{type}}, cgroup_context.cpuset_mems) {{type}}.StartupAllowedMemoryNodes, config_parse_allowed_cpuset, 0, offsetof({{type}}, cgroup_context.startup_cpuset_mems) -{{type}}.CPUAccounting, config_parse_bool, 0, offsetof({{type}}, cgroup_context.cpu_accounting) +{{type}}.CPUAccounting, config_parse_warn_compat, DISABLED_LEGACY, 0 {{type}}.CPUWeight, config_parse_cg_cpu_weight, 0, offsetof({{type}}, cgroup_context.cpu_weight) {{type}}.StartupCPUWeight, config_parse_cg_cpu_weight, 0, offsetof({{type}}, cgroup_context.startup_cpu_weight) {{type}}.CPUShares, config_parse_warn_compat, DISABLED_LEGACY, 0 diff --git a/src/core/main.c b/src/core/main.c index 3ffacc8ccc6..cb846367c2f 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -791,7 +791,7 @@ static int parse_config_file(void) { { "Manager", "DefaultLimitNICE", config_parse_rlimit, RLIMIT_NICE, arg_defaults.rlimit }, { "Manager", "DefaultLimitRTPRIO", config_parse_rlimit, RLIMIT_RTPRIO, arg_defaults.rlimit }, { "Manager", "DefaultLimitRTTIME", config_parse_rlimit, RLIMIT_RTTIME, arg_defaults.rlimit }, - { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_defaults.cpu_accounting }, + { "Manager", "DefaultCPUAccounting", config_parse_warn_compat, DISABLED_LEGACY, NULL }, { "Manager", "DefaultIOAccounting", config_parse_bool, 0, &arg_defaults.io_accounting }, { "Manager", "DefaultIPAccounting", config_parse_bool, 0, &arg_defaults.ip_accounting }, { "Manager", "DefaultBlockIOAccounting", config_parse_warn_compat, DISABLED_LEGACY, NULL }, diff --git a/src/core/manager-varlink.c b/src/core/manager-varlink.c index bbf2368d56d..f53af0998c2 100644 --- a/src/core/manager-varlink.c +++ b/src/core/manager-varlink.c @@ -58,7 +58,6 @@ static int manager_context_build_json(sd_json_variant **ret, const char *name, v JSON_BUILD_PAIR_FINITE_USEC("DefaultDeviceTimeoutUSec", m->defaults.device_timeout_usec), JSON_BUILD_PAIR_FINITE_USEC("DefaultRestartUSec", m->defaults.restart_usec), JSON_BUILD_PAIR_RATELIMIT("DefaultStartLimit", &m->defaults.start_limit), - SD_JSON_BUILD_PAIR_BOOLEAN("DefaultCPUAccounting", m->defaults.cpu_accounting), SD_JSON_BUILD_PAIR_BOOLEAN("DefaultIOAccounting", m->defaults.io_accounting), SD_JSON_BUILD_PAIR_BOOLEAN("DefaultIPAccounting", m->defaults.ip_accounting), SD_JSON_BUILD_PAIR_BOOLEAN("DefaultMemoryAccounting", m->defaults.memory_accounting), diff --git a/src/core/manager.c b/src/core/manager.c index 8e75727bfdd..4f6232e8ad8 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -4197,7 +4197,6 @@ int manager_set_unit_defaults(Manager *m, const UnitDefaults *defaults) { m->defaults.start_limit = defaults->start_limit; - m->defaults.cpu_accounting = defaults->cpu_accounting; m->defaults.memory_accounting = defaults->memory_accounting; m->defaults.io_accounting = defaults->io_accounting; m->defaults.tasks_accounting = defaults->tasks_accounting; @@ -5095,9 +5094,6 @@ void unit_defaults_init(UnitDefaults *defaults, RuntimeScope scope) { .device_timeout_usec = manager_default_timeout(scope), .start_limit = { DEFAULT_START_LIMIT_INTERVAL, DEFAULT_START_LIMIT_BURST }, - /* On 4.15+ with unified hierarchy, CPU accounting is essentially free as it doesn't require the CPU - * controller to be enabled, so the default is to enable it unless we got told otherwise. */ - .cpu_accounting = cpu_accounting_is_cheap(), .memory_accounting = MEMORY_ACCOUNTING_DEFAULT, .io_accounting = false, .tasks_accounting = true, diff --git a/src/core/manager.h b/src/core/manager.h index 1c3eefd141d..31b4b59c0bc 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -149,7 +149,6 @@ typedef struct UnitDefaults { RateLimit start_limit; - bool cpu_accounting; bool memory_accounting; bool io_accounting; bool tasks_accounting; diff --git a/src/core/slice.c b/src/core/slice.c index a4a82118ddf..361ef84a38b 100644 --- a/src/core/slice.c +++ b/src/core/slice.c @@ -334,7 +334,6 @@ static void slice_enumerate_perpetual(Manager *m) { * means the kernel will track CPU/tasks/memory for us anyway, and it is all available in /proc. Let's * hence turn accounting on here, so that our APIs to query this data are available. */ - s->cgroup_context.cpu_accounting = true; s->cgroup_context.tasks_accounting = true; s->cgroup_context.memory_accounting = true; } diff --git a/src/core/system.conf.in b/src/core/system.conf.in index 1c08aa4d22d..051a18bd21c 100644 --- a/src/core/system.conf.in +++ b/src/core/system.conf.in @@ -54,7 +54,6 @@ #DefaultStartLimitIntervalSec=10s #DefaultStartLimitBurst=5 #DefaultEnvironment= -#DefaultCPUAccounting=yes #DefaultIOAccounting=no #DefaultIPAccounting=no #DefaultMemoryAccounting={{ 'yes' if MEMORY_ACCOUNTING_DEFAULT else 'no' }} diff --git a/src/core/unit.c b/src/core/unit.c index 7e3eaa4c92f..6b19947df06 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -173,7 +173,6 @@ static void unit_init(Unit *u) { * context, _before_ the rest of the settings have * been initialized */ - cc->cpu_accounting = u->manager->defaults.cpu_accounting; cc->io_accounting = u->manager->defaults.io_accounting; cc->memory_accounting = u->manager->defaults.memory_accounting; cc->tasks_accounting = u->manager->defaults.tasks_accounting; diff --git a/src/shared/bus-get-properties.c b/src/shared/bus-get-properties.c index de23611ac47..5be6bbc9067 100644 --- a/src/shared/bus-get-properties.c +++ b/src/shared/bus-get-properties.c @@ -8,6 +8,7 @@ #include "string-util.h" BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_bool_false, "b", 0); +BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_bool_true, "b", 1); BUS_DEFINE_PROPERTY_GET_GLOBAL(bus_property_get_uint64_max, "t", UINT64_MAX); int bus_property_get_bool( diff --git a/src/shared/bus-get-properties.h b/src/shared/bus-get-properties.h index 73e85cd2c86..95eab4a4bf1 100644 --- a/src/shared/bus-get-properties.h +++ b/src/shared/bus-get-properties.h @@ -5,10 +5,6 @@ #include "macro.h" -/* For deprecated properties. */ -int bus_property_get_bool_false(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); -int bus_property_get_uint64_max(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); - int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); int bus_property_set_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error); int bus_property_get_tristate(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); @@ -105,3 +101,8 @@ int bus_property_get_string_set(sd_bus *bus, const char *path, const char *inter #define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \ SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \ SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags)) + +/* For deprecated properties. */ +int bus_property_get_bool_false(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); +int bus_property_get_bool_true(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); +int bus_property_get_uint64_max(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); diff --git a/src/shared/varlink-io.systemd.Manager.c b/src/shared/varlink-io.systemd.Manager.c index 513ccb68f8c..c27eff6e21b 100644 --- a/src/shared/varlink-io.systemd.Manager.c +++ b/src/shared/varlink-io.systemd.Manager.c @@ -53,8 +53,6 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_DEFINE_FIELD(DefaultRestartUSec, SD_VARLINK_INT, 0), SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd-system.conf.html#DefaultStartLimit="), SD_VARLINK_DEFINE_FIELD_BY_TYPE(DefaultStartLimit, RateLimit, SD_VARLINK_NULLABLE), - SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd-system.conf.html#DefaultCPUAccounting="), - SD_VARLINK_DEFINE_FIELD(DefaultCPUAccounting, SD_VARLINK_BOOL, 0), SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd-system.conf.html#DefaultIOAccounting="), SD_VARLINK_DEFINE_FIELD(DefaultIOAccounting, SD_VARLINK_BOOL, 0), SD_VARLINK_FIELD_COMMENT("https://www.freedesktop.org/software/systemd/man/"PROJECT_VERSION_STR"/systemd-system.conf.html#DefaultIPAccounting="), diff --git a/src/test/test-cgroup-mask.c b/src/test/test-cgroup-mask.c index ac70bad8ba6..f73372d6314 100644 --- a/src/test/test-cgroup-mask.c +++ b/src/test/test-cgroup-mask.c @@ -31,7 +31,6 @@ TEST_RET(cgroup_mask, .sd_booted = true) { _cleanup_(manager_freep) Manager *m = NULL; Unit *son, *daughter, *parent, *root, *grandchild, *parent_deep, *nomem_parent, *nomem_leaf; int r; - CGroupMask cpu_accounting_mask = get_cpu_accounting_mask(); r = enter_cgroup_subroot(NULL); if (r == -ENOMEDIUM) @@ -53,8 +52,7 @@ TEST_RET(cgroup_mask, .sd_booted = true) { /* Turn off all kinds of default accounting, so that we can * verify the masks resulting of our configuration and nothing * else. */ - m->defaults.cpu_accounting = - m->defaults.memory_accounting = + m->defaults.memory_accounting = m->defaults.io_accounting = m->defaults.tasks_accounting = false; m->defaults.tasks_max = CGROUP_TASKS_MAX_UNSET; @@ -79,7 +77,6 @@ TEST_RET(cgroup_mask, .sd_booted = true) { /* Verify per-unit cgroups settings. */ ASSERT_CGROUP_MASK_JOINED(unit_get_own_mask(son), CGROUP_MASK_CPU); - ASSERT_CGROUP_MASK_JOINED(unit_get_own_mask(daughter), cpu_accounting_mask); ASSERT_CGROUP_MASK_JOINED(unit_get_own_mask(grandchild), 0); ASSERT_CGROUP_MASK_JOINED(unit_get_own_mask(parent_deep), CGROUP_MASK_MEMORY); ASSERT_CGROUP_MASK_JOINED(unit_get_own_mask(parent), (CGROUP_MASK_IO | CGROUP_MASK_BLKIO)); @@ -92,40 +89,40 @@ TEST_RET(cgroup_mask, .sd_booted = true) { ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(daughter), 0); ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(grandchild), 0); ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(parent_deep), 0); - ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(parent), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(parent), (CGROUP_MASK_CPU | CGROUP_MASK_MEMORY)); ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(nomem_parent), (CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(nomem_leaf), 0); - ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(root), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_members_mask(root), (CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); /* Verify aggregation of sibling masks. */ - ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(son), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY)); - ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(daughter), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(son), (CGROUP_MASK_CPU | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(daughter), (CGROUP_MASK_CPU | CGROUP_MASK_MEMORY)); ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(grandchild), 0); - ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(parent_deep), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY)); - ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(parent), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(parent_deep), (CGROUP_MASK_CPU | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(parent), (CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(nomem_parent), (CGROUP_MASK_CPU | CGROUP_MASK_CPUACCT | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(nomem_leaf), (CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); - ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(root), (CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); + ASSERT_CGROUP_MASK_JOINED(unit_get_siblings_mask(root), (CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY)); /* Verify aggregation of target masks. */ - ASSERT_CGROUP_MASK(unit_get_target_mask(son), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY) & m->cgroup_supported)); - ASSERT_CGROUP_MASK(unit_get_target_mask(daughter), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_target_mask(son), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_target_mask(daughter), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_MEMORY) & m->cgroup_supported)); ASSERT_CGROUP_MASK(unit_get_target_mask(grandchild), 0); - ASSERT_CGROUP_MASK(unit_get_target_mask(parent_deep), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY) & m->cgroup_supported)); - ASSERT_CGROUP_MASK(unit_get_target_mask(parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_target_mask(parent_deep), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_target_mask(parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); ASSERT_CGROUP_MASK(unit_get_target_mask(nomem_parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_CPUACCT | CGROUP_MASK_IO | CGROUP_MASK_BLKIO) & m->cgroup_supported)); ASSERT_CGROUP_MASK(unit_get_target_mask(nomem_leaf), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_IO | CGROUP_MASK_BLKIO) & m->cgroup_supported)); - ASSERT_CGROUP_MASK(unit_get_target_mask(root), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_target_mask(root), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); /* Verify aggregation of enable masks. */ ASSERT_CGROUP_MASK(unit_get_enable_mask(son), 0); ASSERT_CGROUP_MASK(unit_get_enable_mask(daughter), 0); ASSERT_CGROUP_MASK(unit_get_enable_mask(grandchild), 0); ASSERT_CGROUP_MASK(unit_get_enable_mask(parent_deep), 0); - ASSERT_CGROUP_MASK(unit_get_enable_mask(parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_enable_mask(parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_MEMORY) & m->cgroup_supported)); ASSERT_CGROUP_MASK(unit_get_enable_mask(nomem_parent), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_IO | CGROUP_MASK_BLKIO) & m->cgroup_supported)); ASSERT_CGROUP_MASK(unit_get_enable_mask(nomem_leaf), 0); - ASSERT_CGROUP_MASK(unit_get_enable_mask(root), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | cpu_accounting_mask | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); + ASSERT_CGROUP_MASK(unit_get_enable_mask(root), (CGROUP_MASK_EXTEND_JOINED(CGROUP_MASK_CPU | CGROUP_MASK_IO | CGROUP_MASK_BLKIO | CGROUP_MASK_MEMORY) & m->cgroup_supported)); return 0; } diff --git a/test/units/TEST-26-SYSTEMCTL.sh b/test/units/TEST-26-SYSTEMCTL.sh index 8e895aa9ae8..cc6b8449895 100755 --- a/test/units/TEST-26-SYSTEMCTL.sh +++ b/test/units/TEST-26-SYSTEMCTL.sh @@ -249,12 +249,12 @@ systemctl revert "$UNIT_NAME" (! grep -r "IPAccounting=" "/etc/systemd/system.control/${UNIT_NAME}.d/") (! grep -r "MemoryMax=" "/etc/systemd/system.control/${UNIT_NAME}.d/") # Same stuff, but with --runtime, which should use /run -systemctl set-property --runtime "$UNIT_NAME" CPUAccounting=no CPUQuota=10% +systemctl set-property --runtime "$UNIT_NAME" IOAccounting=no CPUQuota=10% systemctl cat "$UNIT_NAME" -grep -r "CPUAccounting=no" "/run/systemd/system.control/${UNIT_NAME}.d/" +grep -r "IOAccounting=no" "/run/systemd/system.control/${UNIT_NAME}.d/" grep -r "CPUQuota=10.00%" "/run/systemd/system.control/${UNIT_NAME}.d/" systemctl revert "$UNIT_NAME" -(! grep -r "CPUAccounting=" "/run/systemd/system.control/${UNIT_NAME}.d/") +(! grep -r "IOAccounting=" "/run/systemd/system.control/${UNIT_NAME}.d/") (! grep -r "CPUQuota=" "/run/systemd/system.control/${UNIT_NAME}.d/") # Failed-unit related tests diff --git a/test/units/TEST-55-OOMD-workload.slice b/test/units/TEST-55-OOMD-workload.slice index 15580736044..dae4e6ce668 100644 --- a/test/units/TEST-55-OOMD-workload.slice +++ b/test/units/TEST-55-OOMD-workload.slice @@ -3,7 +3,6 @@ Description=Test slice for memory pressure kills [Slice] -CPUAccounting=true MemoryAccounting=true IOAccounting=true TasksAccounting=true diff --git a/test/units/daughter.service b/test/units/daughter.service index 0ee4f24a4e9..bf02f8e9f69 100644 --- a/test/units/daughter.service +++ b/test/units/daughter.service @@ -6,4 +6,3 @@ Description=Daughter Service Slice=parent.slice Type=oneshot ExecStart=true -CPUAccounting=true