mirror of
https://github.com/systemd/systemd.git
synced 2024-11-24 10:43:35 +08:00
core: add support for IOReadIOPSMax and IOWriteIOPSMax
cgroup IO controller supports maximum limits for both bandwidth and IOPS but systemd resource control currently only supports bandwidth limits. This patch adds support for IOReadIOPSMax and IOWriteIOPSMax when unified cgroup hierarchy is in use. It isn't difficult to also add BlockIOReadIOPS and BlockIOWriteIOPS for legacy hierarchies but IO control on legacy hierarchies is half-broken anyway, so let's leave it alone for now.
This commit is contained in:
parent
9be572497d
commit
ac06a0cf8a
@ -336,6 +336,30 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>IOReadIOPSMax=<replaceable>device</replaceable> <replaceable>IOPS</replaceable></varname></term>
|
||||
<term><varname>IOWriteIOPSMax=<replaceable>device</replaceable> <replaceable>IOPS</replaceable></varname></term>
|
||||
|
||||
<listitem>
|
||||
<para>Set the per-device overall block I/O IOs-Per-Second maximum limit for the executed processes, if the
|
||||
unified control group hierarchy is used on the system. This limit is not work-conserving and the executed
|
||||
processes are not allowed to use more even if the device has idle capacity. Takes a space-separated pair of
|
||||
a file path and an IOPS value to specify the device specific IOPS. 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 IOPS is suffixed with K, M, G, or T, the specified IOPS is parsed as KiloIOPS, MegaIOPS,
|
||||
GigaIOPS, or TeraIOPS, respectively, to the base of 1000. (Example:
|
||||
"/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0 1K"). This controls the <literal>io.max</literal> control
|
||||
group attributes. Use this option multiple times to set IOPS limits for multiple devices. For details about
|
||||
this control group attribute, see <ulink
|
||||
url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.
|
||||
</para>
|
||||
|
||||
<para>Implies <literal>IOAccounting=true</literal>.</para>
|
||||
|
||||
<para>This setting is supported only if the unified control group hierarchy is used.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>BlockIOAccounting=</varname></term>
|
||||
|
||||
|
@ -2272,11 +2272,15 @@ int cg_weight_parse(const char *s, uint64_t *ret) {
|
||||
const uint64_t cgroup_io_limit_defaults[_CGROUP_IO_LIMIT_TYPE_MAX] = {
|
||||
[CGROUP_IO_RBPS_MAX] = CGROUP_LIMIT_MAX,
|
||||
[CGROUP_IO_WBPS_MAX] = CGROUP_LIMIT_MAX,
|
||||
[CGROUP_IO_RIOPS_MAX] = CGROUP_LIMIT_MAX,
|
||||
[CGROUP_IO_WIOPS_MAX] = CGROUP_LIMIT_MAX,
|
||||
};
|
||||
|
||||
static const char* const cgroup_io_limit_type_table[_CGROUP_IO_LIMIT_TYPE_MAX] = {
|
||||
[CGROUP_IO_RBPS_MAX] = "IOReadBandwidthMax",
|
||||
[CGROUP_IO_WBPS_MAX] = "IOWriteBandwidthMax",
|
||||
[CGROUP_IO_RIOPS_MAX] = "IOReadIOPSMax",
|
||||
[CGROUP_IO_WIOPS_MAX] = "IOWriteIOPSMax",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(cgroup_io_limit_type, CGroupIOLimitType);
|
||||
|
@ -76,6 +76,8 @@ static inline bool CGROUP_WEIGHT_IS_OK(uint64_t x) {
|
||||
typedef enum CGroupIOLimitType {
|
||||
CGROUP_IO_RBPS_MAX,
|
||||
CGROUP_IO_WBPS_MAX,
|
||||
CGROUP_IO_RIOPS_MAX,
|
||||
CGROUP_IO_WIOPS_MAX,
|
||||
|
||||
_CGROUP_IO_LIMIT_TYPE_MAX,
|
||||
_CGROUP_IO_LIMIT_TYPE_INVALID = -1
|
||||
|
@ -439,7 +439,7 @@ void cgroup_context_apply(CGroupContext *c, CGroupMask mask, const char *path, M
|
||||
|
||||
LIST_FOREACH_SAFE(device_limits, l, next, c->io_device_limits) {
|
||||
char limit_bufs[_CGROUP_IO_LIMIT_TYPE_MAX][DECIMAL_STR_MAX(uint64_t)];
|
||||
char buf[DECIMAL_STR_MAX(dev_t)*2+2+(5+DECIMAL_STR_MAX(uint64_t)+1)*2];
|
||||
char buf[DECIMAL_STR_MAX(dev_t)*2+2+(6+DECIMAL_STR_MAX(uint64_t)+1)*4];
|
||||
CGroupIOLimitType type;
|
||||
dev_t dev;
|
||||
unsigned n = 0;
|
||||
@ -458,8 +458,9 @@ void cgroup_context_apply(CGroupContext *c, CGroupMask mask, const char *path, M
|
||||
}
|
||||
}
|
||||
|
||||
xsprintf(buf, "%u:%u rbps=%s wbps=%s\n", major(dev), minor(dev),
|
||||
limit_bufs[CGROUP_IO_RBPS_MAX], limit_bufs[CGROUP_IO_WBPS_MAX]);
|
||||
xsprintf(buf, "%u:%u rbps=%s wbps=%s riops=%s wiops=%s\n", major(dev), minor(dev),
|
||||
limit_bufs[CGROUP_IO_RBPS_MAX], limit_bufs[CGROUP_IO_WBPS_MAX],
|
||||
limit_bufs[CGROUP_IO_RIOPS_MAX], limit_bufs[CGROUP_IO_WIOPS_MAX]);
|
||||
r = cg_set_attribute("io", path, "io.max", buf);
|
||||
if (r < 0)
|
||||
log_full_errno(IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
|
||||
|
@ -213,6 +213,8 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
|
||||
SD_BUS_PROPERTY("IODeviceWeight", "a(st)", property_get_io_device_weight, 0, 0),
|
||||
SD_BUS_PROPERTY("IOReadBandwidthMax", "a(st)", property_get_io_device_limits, 0, 0),
|
||||
SD_BUS_PROPERTY("IOWriteBandwidthMax", "a(st)", property_get_io_device_limits, 0, 0),
|
||||
SD_BUS_PROPERTY("IOReadIOPSMax", "a(st)", property_get_io_device_limits, 0, 0),
|
||||
SD_BUS_PROPERTY("IOWriteIOPSMax", "a(st)", property_get_io_device_limits, 0, 0),
|
||||
SD_BUS_PROPERTY("BlockIOAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, blockio_accounting), 0),
|
||||
SD_BUS_PROPERTY("BlockIOWeight", "t", NULL, offsetof(CGroupContext, blockio_weight), 0),
|
||||
SD_BUS_PROPERTY("StartupBlockIOWeight", "t", NULL, offsetof(CGroupContext, startup_blockio_weight), 0),
|
||||
|
@ -126,6 +126,8 @@ $1.StartupIOWeight, config_parse_io_weight, 0,
|
||||
$1.IODeviceWeight, config_parse_io_device_weight, 0, offsetof($1, cgroup_context)
|
||||
$1.IOReadBandwidthMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
||||
$1.IOWriteBandwidthMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
||||
$1.IOReadIOPSMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
||||
$1.IOWriteIOPSMax, config_parse_io_limit, 0, offsetof($1, cgroup_context)
|
||||
$1.BlockIOAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.blockio_accounting)
|
||||
$1.BlockIOWeight, config_parse_blockio_weight, 0, offsetof($1, cgroup_context.blockio_weight)
|
||||
$1.StartupBlockIOWeight, config_parse_blockio_weight, 0, offsetof($1, cgroup_context.startup_blockio_weight)
|
||||
|
Loading…
Reference in New Issue
Block a user