diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml
index c11f420fe5..10aefbe0c5 100644
--- a/man/systemd.resource-control.xml
+++ b/man/systemd.resource-control.xml
@@ -140,10 +140,10 @@
- To ease the transition, there is best-effort translation between the two versions of settings. If all
- settings of a unit for a given resource type are for the other hierarchy type, the settings are translated and
- applied. If there are any valid settings for the hierarchy in use, all translations are disabled for the resource
- type. Mixing the two types of settings on a unit can lead to confusing results.
+ To ease the transition, there is best-effort translation between the two versions of settings. For each
+ controller, if any of the settings for the unified hierarchy are present, all settings for the legacy hierarchy are
+ ignored. If the resulting settings are for the other type of hierarchy, the configurations are translated before
+ application.
Legacy control group hierarchy (see cgroups.txt), also called cgroup-v1,
@@ -196,30 +196,7 @@
Implies CPUAccounting=true.
- These settings are supported only if the unified control group hierarchy is used.
-
-
-
-
- CPUShares=weight
- StartupCPUShares=weight
-
-
- Assign the specified CPU time share weight to the processes executed. These options take an integer
- value and control the cpu.shares control group attribute. The allowed range is 2 to
- 262144. Defaults to 1024. For details about this control group attribute, see sched-design-CFS.txt.
- The available CPU time is split up among all units within one slice relative to their CPU time share
- weight.
-
- While StartupCPUShares= only applies to the startup phase of the system,
- CPUShares= applies to normal runtime of the system, and if the former is not set also to
- the startup phase. Using StartupCPUShares= allows prioritizing specific services at
- boot-up differently than during normal runtime.
-
- Implies CPUAccounting=true.
-
- These settings are supported only if the legacy control group hierarchy is used.
+ These settings replace CPUShares= and StartupCPUShares=.
@@ -239,8 +216,6 @@
20% CPU time on one CPU.
Implies CPUAccounting=true.
-
- This setting is supported on both unified and legacy control group hierarchies.
@@ -276,7 +251,8 @@
Implies MemoryAccounting=true.
- This setting is supported only if the unified control group hierarchy is used.
+ This setting is supported only if the unified control group hierarchy is used and disables
+ MemoryLimit=.
@@ -298,7 +274,8 @@
Implies MemoryAccounting=true.
- This setting is supported only if the unified control group hierarchy is used.
+ This setting is supported only if the unified control group hierarchy is used and disables
+ MemoryLimit=.
@@ -320,8 +297,7 @@
Implies MemoryAccounting=true.
- This setting is supported only if the unified control group hierarchy is used. Use
- MemoryLimit= on systems using the legacy control group hierarchy.
+ This setting replaces MemoryLimit=.
@@ -339,28 +315,8 @@
Implies MemoryAccounting=true.
- This setting is supported only if the unified control group hierarchy is used.
-
-
-
-
- MemoryLimit=bytes
-
-
- Specify the limit on maximum memory usage of the executed processes. The limit specifies how much
- process and kernel memory can be used by tasks in this unit. Takes a memory size in bytes. If the value is
- suffixed with K, M, G or T, the specified memory size is parsed as Kilobytes, Megabytes, Gigabytes, or
- Terabytes (with the base 1024), respectively. Alternatively, a percentage value may be specified, which is
- taken relative to the installed physical memory on the system. If assigned the special value
- infinity, no memory limit is applied. This controls the
- memory.limit_in_bytes control group attribute. For details about this control group
- attribute, see memory.txt.
-
- Implies MemoryAccounting=true.
-
- This setting is supported only if the legacy control group hierarchy is used. Use
- MemoryMax= on systems using the unified control group hierarchy.
+ This setting is supported only if the unified control group hierarchy is used and disables
+ MemoryLimit=.
@@ -412,8 +368,8 @@
in
systemd-system.conf5.
- This setting is supported only if the unified control group hierarchy is used. Use
- BlockIOAccounting= on systems using the legacy control group hierarchy.
+ This setting replaces BlockIOAccounting= and disables settings prefixed with
+ BlockIO or StartupBlockIO.
@@ -438,9 +394,8 @@
Implies IOAccounting=true.
- This setting is supported only if the unified control group hierarchy is used. Use
- BlockIOWeight= and StartupBlockIOWeight= on systems using the legacy
- control group hierarchy.
+ These settings replace BlockIOWeight= and StartupBlockIOWeight=
+ and disable settings prefixed with BlockIO or StartupBlockIO.
@@ -459,8 +414,8 @@
Implies IOAccounting=true.
- This setting is supported only if the unified control group hierarchy is used. Use
- BlockIODeviceWeight= on systems using the legacy control group hierarchy.
+ This setting replaces BlockIODeviceWeight= and disables settings prefixed with
+ BlockIO or StartupBlockIO.
@@ -484,8 +439,9 @@
Implies IOAccounting=true.
- This setting is supported only if the unified control group hierarchy is used. Use
- BlockIOAccounting= on systems using the legacy control group hierarchy.
+ These settings replace BlockIOReadBandwidth= and
+ BlockIOWriteBandwidth= and disable settings prefixed with BlockIO or
+ StartupBlockIO.
@@ -509,100 +465,8 @@
Implies IOAccounting=true.
- This setting is supported only if the unified control group hierarchy is used.
-
-
-
-
- BlockIOAccounting=
-
-
- Turn on Block I/O accounting for this unit, if the legacy control group hierarchy is used on the
- system. Takes a boolean argument. Note that turning on block I/O accounting for one unit will also implicitly
- turn it on for all units contained in the same slice and all for its parent slices and the units contained
- therein. The system default for this setting may be controlled with
- DefaultBlockIOAccounting= in
- systemd-system.conf5.
-
- This setting is supported only if the legacy control group hierarchy is used. Use
- IOAccounting= on systems using the unified control group hierarchy.
-
-
-
-
- BlockIOWeight=weight
- StartupBlockIOWeight=weight
-
- Set the default overall block I/O weight for the executed processes, if the legacy control
- group hierarchy is used on the system. Takes a single weight value (between 10 and 1000) to set the default
- block I/O weight. This controls the blkio.weight control group attribute, which defaults to
- 500. For details about this control group attribute, see blkio-controller.txt.
- The available I/O bandwidth is split up among all units within one slice relative to their block I/O
- weight.
-
- While StartupBlockIOWeight= only
- applies to the startup phase of the system,
- BlockIOWeight= applies to the later runtime
- of the system, and if the former is not set also to the
- startup phase. This allows prioritizing specific services at
- boot-up differently than during runtime.
-
- Implies
- BlockIOAccounting=true.
-
- This setting is supported only if the legacy control group hierarchy is used. Use
- IOWeight= and StartupIOWeight= on systems using the unified control group
- hierarchy.
-
-
-
-
-
- BlockIODeviceWeight=device weight
-
-
- Set the per-device overall block I/O weight for the executed processes, if the legacy control group
- hierarchy is used on the system. Takes a space-separated pair of a file path and a weight value to specify
- the device specific weight value, between 10 and 1000. (Example: "/dev/sda 500"). The file path may be
- specified as path to a block device node or as any other file, in which case the backing block device of the
- file system of the file is determined. This controls the blkio.weight_device control group
- attribute, which defaults to 1000. Use this option multiple times to set weights for multiple devices. For
- details about this control group attribute, see blkio-controller.txt.
-
- Implies
- BlockIOAccounting=true.
-
- This setting is supported only if the legacy control group hierarchy is used. Use
- IODeviceWeight= on systems using the unified control group hierarchy.
-
-
-
-
- BlockIOReadBandwidth=device bytes
- BlockIOWriteBandwidth=device bytes
-
-
- Set the per-device overall block I/O bandwidth limit for the executed processes, if the legacy control
- group hierarchy is used on the system. Takes a space-separated pair of a file path and a bandwidth value (in
- bytes per second) to specify the device specific bandwidth. The file path may be a path to a block device
- node, or as any other file in which case the backing block device of the file system of the file is used. If
- the bandwidth is suffixed with K, M, G, or T, the specified bandwidth is parsed as Kilobytes, Megabytes,
- Gigabytes, or Terabytes, respectively, to the base of 1000. (Example:
- "/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0 5M"). This controls the
- blkio.throttle.read_bps_device and blkio.throttle.write_bps_device
- control group attributes. Use this option multiple times to set bandwidth limits for multiple devices. For
- details about these control group attributes, see blkio-controller.txt.
-
-
- Implies
- BlockIOAccounting=true.
-
- This setting is supported only if the legacy control group hierarchy is used. Use
- IOReadBandwidthMax= and IOWriteBandwidthMax= on systems using the
- unified control group hierarchy.
+ These settings are supported only if the unified control group hierarchy is used and disable settings
+ prefixed with BlockIO or StartupBlockIO.
@@ -733,6 +597,149 @@
+
+ Deprecated Options
+
+ The following options are deprecated. Use the indicated superseding options instead:
+
+
+
+
+ CPUShares=weight
+ StartupCPUShares=weight
+
+
+ Assign the specified CPU time share weight to the processes executed. These options take an integer
+ value and control the cpu.shares control group attribute. The allowed range is 2 to
+ 262144. Defaults to 1024. For details about this control group attribute, see sched-design-CFS.txt.
+ The available CPU time is split up among all units within one slice relative to their CPU time share
+ weight.
+
+ While StartupCPUShares= only applies to the startup phase of the system,
+ CPUShares= applies to normal runtime of the system, and if the former is not set also to
+ the startup phase. Using StartupCPUShares= allows prioritizing specific services at
+ boot-up differently than during normal runtime.
+
+ Implies CPUAccounting=true.
+
+ These settings are deprecated. Use CPUWeight= and
+ StartupCPUWeight= instead.
+
+
+
+
+ MemoryLimit=bytes
+
+
+ Specify the limit on maximum memory usage of the executed processes. The limit specifies how much
+ process and kernel memory can be used by tasks in this unit. Takes a memory size in bytes. If the value is
+ suffixed with K, M, G or T, the specified memory size is parsed as Kilobytes, Megabytes, Gigabytes, or
+ Terabytes (with the base 1024), respectively. Alternatively, a percentage value may be specified, which is
+ taken relative to the installed physical memory on the system. If assigned the special value
+ infinity, no memory limit is applied. This controls the
+ memory.limit_in_bytes control group attribute. For details about this control group
+ attribute, see memory.txt.
+
+ Implies MemoryAccounting=true.
+
+ This setting is deprecated. Use MemoryMax= instead.
+
+
+
+
+ BlockIOAccounting=
+
+
+ Turn on Block I/O accounting for this unit, if the legacy control group hierarchy is used on the
+ system. Takes a boolean argument. Note that turning on block I/O accounting for one unit will also implicitly
+ turn it on for all units contained in the same slice and all for its parent slices and the units contained
+ therein. The system default for this setting may be controlled with
+ DefaultBlockIOAccounting= in
+ systemd-system.conf5.
+
+ This setting is deprecated. Use IOAccounting= instead.
+
+
+
+
+ BlockIOWeight=weight
+ StartupBlockIOWeight=weight
+
+ Set the default overall block I/O weight for the executed processes, if the legacy control
+ group hierarchy is used on the system. Takes a single weight value (between 10 and 1000) to set the default
+ block I/O weight. This controls the blkio.weight control group attribute, which defaults to
+ 500. For details about this control group attribute, see blkio-controller.txt.
+ The available I/O bandwidth is split up among all units within one slice relative to their block I/O
+ weight.
+
+ While StartupBlockIOWeight= only
+ applies to the startup phase of the system,
+ BlockIOWeight= applies to the later runtime
+ of the system, and if the former is not set also to the
+ startup phase. This allows prioritizing specific services at
+ boot-up differently than during runtime.
+
+ Implies
+ BlockIOAccounting=true.
+
+ These settings are deprecated. Use IOWeight= and StartupIOWeight=
+ instead.
+
+
+
+
+
+ BlockIODeviceWeight=device weight
+
+
+ Set the per-device overall block I/O weight for the executed processes, if the legacy control group
+ hierarchy is used on the system. Takes a space-separated pair of a file path and a weight value to specify
+ the device specific weight value, between 10 and 1000. (Example: "/dev/sda 500"). The file path may be
+ specified as path to a block device node or as any other file, in which case the backing block device of the
+ file system of the file is determined. This controls the blkio.weight_device control group
+ attribute, which defaults to 1000. Use this option multiple times to set weights for multiple devices. For
+ details about this control group attribute, see blkio-controller.txt.
+
+ Implies
+ BlockIOAccounting=true.
+
+ This setting is deprecated. Use IODeviceWeight= instead.
+
+
+
+
+ BlockIOReadBandwidth=device bytes
+ BlockIOWriteBandwidth=device bytes
+
+
+ Set the per-device overall block I/O bandwidth limit for the executed processes, if the legacy control
+ group hierarchy is used on the system. Takes a space-separated pair of a file path and a bandwidth value (in
+ bytes per second) to specify the device specific bandwidth. The file path may be a path to a block device
+ node, or as any other file in which case the backing block device of the file system of the file is used. If
+ the bandwidth is suffixed with K, M, G, or T, the specified bandwidth is parsed as Kilobytes, Megabytes,
+ Gigabytes, or Terabytes, respectively, to the base of 1000. (Example:
+ "/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0 5M"). This controls the
+ blkio.throttle.read_bps_device and blkio.throttle.write_bps_device
+ control group attributes. Use this option multiple times to set bandwidth limits for multiple devices. For
+ details about these control group attributes, see blkio-controller.txt.
+
+
+ Implies
+ BlockIOAccounting=true.
+
+ These settings are deprecated. Use IOReadBandwidthMax= and
+ IOWriteBandwidthMax= instead.
+
+
+
+
+
+
See Also
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 20bdbc39d0..23a92f9651 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -687,16 +687,16 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
} else {
uint64_t shares;
- if (has_shares)
- shares = cgroup_context_cpu_shares(c, state);
- else if (has_weight) {
+ if (has_weight) {
uint64_t weight = cgroup_context_cpu_weight(c, state);
shares = cgroup_cpu_weight_to_shares(weight);
log_cgroup_compat(u, "Applying [Startup]CpuWeight %" PRIu64 " as [Startup]CpuShares %" PRIu64 " on %s",
weight, shares, path);
- } else
+ } else if (has_shares)
+ shares = cgroup_context_cpu_shares(c, state);
+ else
shares = CGROUP_CPU_SHARES_DEFAULT;
cgroup_apply_legacy_cpu_config(u, shares, c->cpu_quota_per_sec_usec);
@@ -788,16 +788,16 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
char buf[DECIMAL_STR_MAX(uint64_t)+1];
uint64_t weight;
- if (has_blockio)
- weight = cgroup_context_blkio_weight(c, state);
- else if (has_io) {
+ if (has_io) {
uint64_t io_weight = cgroup_context_io_weight(c, state);
weight = cgroup_weight_io_to_blkio(cgroup_context_io_weight(c, state));
log_cgroup_compat(u, "Applying [Startup]IOWeight %" PRIu64 " as [Startup]BlockIOWeight %" PRIu64,
io_weight, weight);
- } else
+ } else if (has_blockio)
+ weight = cgroup_context_blkio_weight(c, state);
+ else
weight = CGROUP_BLKIO_WEIGHT_DEFAULT;
xsprintf(buf, "%" PRIu64 "\n", weight);
@@ -806,13 +806,7 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
"Failed to set blkio.weight: %m");
- if (has_blockio) {
- CGroupBlockIODeviceWeight *w;
-
- /* FIXME: no way to reset this list */
- LIST_FOREACH(device_weights, w, c->blockio_device_weights)
- cgroup_apply_blkio_device_weight(u, w->path, w->weight);
- } else if (has_io) {
+ if (has_io) {
CGroupIODeviceWeight *w;
/* FIXME: no way to reset this list */
@@ -824,18 +818,17 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
cgroup_apply_blkio_device_weight(u, w->path, weight);
}
+ } else if (has_blockio) {
+ CGroupBlockIODeviceWeight *w;
+
+ /* FIXME: no way to reset this list */
+ LIST_FOREACH(device_weights, w, c->blockio_device_weights)
+ cgroup_apply_blkio_device_weight(u, w->path, w->weight);
}
}
/* Apply limits and free ones without config. */
- if (has_blockio) {
- CGroupBlockIODeviceBandwidth *b, *next;
-
- LIST_FOREACH_SAFE(device_bandwidths, b, next, c->blockio_device_bandwidths) {
- if (!cgroup_apply_blkio_device_limit(u, b->path, b->rbps, b->wbps))
- cgroup_context_free_blockio_device_bandwidth(c, b);
- }
- } else if (has_io) {
+ if (has_io) {
CGroupIODeviceLimit *l, *next;
LIST_FOREACH_SAFE(device_limits, l, next, c->io_device_limits) {
@@ -845,13 +838,19 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
if (!cgroup_apply_blkio_device_limit(u, l->path, l->limits[CGROUP_IO_RBPS_MAX], l->limits[CGROUP_IO_WBPS_MAX]))
cgroup_context_free_io_device_limit(c, l);
}
+ } else if (has_blockio) {
+ CGroupBlockIODeviceBandwidth *b, *next;
+
+ LIST_FOREACH_SAFE(device_bandwidths, b, next, c->blockio_device_bandwidths)
+ if (!cgroup_apply_blkio_device_limit(u, b->path, b->rbps, b->wbps))
+ cgroup_context_free_blockio_device_bandwidth(c, b);
}
}
if ((mask & CGROUP_MASK_MEMORY) && !is_root) {
if (cg_all_unified() > 0) {
- uint64_t max = c->memory_max;
- uint64_t swap_max = c->memory_swap_max;
+ uint64_t max;
+ uint64_t swap_max = CGROUP_LIMIT_MAX;
if (cgroup_context_has_unified_memory_config(c)) {
max = c->memory_max;
@@ -869,14 +868,13 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
cgroup_apply_unified_memory_limit(u, "memory.swap.max", swap_max);
} else {
char buf[DECIMAL_STR_MAX(uint64_t) + 1];
- uint64_t val = c->memory_limit;
+ uint64_t val;
- if (val == CGROUP_LIMIT_MAX) {
+ if (cgroup_context_has_unified_memory_config(c)) {
val = c->memory_max;
-
- if (val != CGROUP_LIMIT_MAX)
- log_cgroup_compat(u, "Applying MemoryMax %" PRIi64 " as MemoryLimit", c->memory_max);
- }
+ log_cgroup_compat(u, "Applying MemoryMax %" PRIi64 " as MemoryLimit", val);
+ } else
+ val = c->memory_limit;
if (val == CGROUP_LIMIT_MAX)
strncpy(buf, "-1\n", sizeof(buf));