From 5d9aa69b00ebe7add8c4b7704d2871d28d14f7bd Mon Sep 17 00:00:00 2001 From: Xiaochen Shen Date: Tue, 11 Sep 2018 17:54:42 +0800 Subject: [PATCH] config-linux: Add Intel RDT/MBA Linux support Add support for Intel Resource Director Technology (RDT) / Memory Bandwidth Allocation (MBA). Add memory bandwidth resource constraints in Linux-specific configuration. In this PR, the spec for memory bandwidth (memBwSchema) keeps the same format as existed spec for L3 cache (l3CacheSchema) for consistency and compatibility in runtime-spec 1.x. Example: "linux": { "intelRdt": { "closID": "guaranteed_group", "l3CacheSchema": "L3:0=7f0;1=1f", "memBwSchema": "MB:0=20;1=70" } } This is the prerequisite of this runc proposal: https://github.com/opencontainers/runc/issues/1596 For more information about Intel RDT/MBA, please refer to: https://github.com/opencontainers/runc/issues/1596 Signed-off-by: Xiaochen Shen --- config-linux.md | 25 +++++++++++++++++++------ schema/config-linux.json | 4 ++++ specs-go/config.go | 12 ++++++++---- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/config-linux.md b/config-linux.md index f84124e88..a52eb5961 100644 --- a/config-linux.md +++ b/config-linux.md @@ -491,7 +491,7 @@ You MUST specify at least one of the `hcaHandles` or `hcaObjects` in a given ent If `intelRdt` is set, the runtime MUST write the container process ID to the `tasks` file in a proper sub-directory in a mounted `resctrl` pseudo-filesystem. That sub-directory name is specified by `closID` parameter. If no mounted `resctrl` pseudo-filesystem is available in the [runtime mount namespace](glossary.md#runtime-namespace), the runtime MUST [generate an error](runtime.md#errors). - If `intelRdt` is not set, the runtime MUST NOT manipulate any `resctrl` pseudo-filesystems. +If `intelRdt` is not set, the runtime MUST NOT manipulate any `resctrl` pseudo-filesystems. The following parameters can be specified for the container: @@ -499,20 +499,33 @@ The following parameters can be specified for the container: If `closID` is set, runtimes MUST create `closID` directory in a mounted `resctrl` pseudo-filesystem if it doesn't exist. If not set, runtimes MUST use the container ID from [`start`](runtime.md#start) and create the `` directory. * **`l3CacheSchema`** *(string, OPTIONAL)* - specifies the schema for L3 cache id and capacity bitmask (CBM). - If `l3CacheSchema` is set, runtimes MUST write the value to the `schemata` file in that sub-directory discussed in `closID`. If not set, runtimes MUST NOT write to `schemata` files in any `resctrl` pseudo-filesystems. + The value SHOULD start with `L3:` and SHOULD NOT contain newlines. +* **`memBwSchema`** *(string, OPTIONAL)* - specifies the schema of memory bandwidth percentage per L3 cache id. + The value MUST start with `MB:` and MUST NOT contain newlines. - If `closID` and `l3CacheSchema` both are set, runtimes MUST compare `l3CacheSchema` value with `schemata` file, and [generate an error](runtime.md#errors) if doesn't match. + If both `l3CacheSchema` and `memBwSchema` are set, runtimes MUST write the combined value to the `schemata` file in that sub-directory discussed in `closID`. + If `l3CacheSchema` contains a line beginning with `MB:`, the value written to `schemata` file MUST be the non-`MB:` line(s) from `l3CacheSchema` and the line from `memBWSchema`. + + If either `l3CacheSchema` or `memBwSchema` is set, runtimes MUST write the value to the `schemata` file in the that sub-directory discussed in `closID`. + + If neither `l3CacheSchema` nor `memBwSchema` is set, runtimes MUST NOT write to `schemata` files in any `resctrl` pseudo-filesystems. + + If `closID` is set, `l3CacheSchema` and/or `memBwSchema` is set, runtimes MUST compare `l3CacheSchema` and/or `memBwSchema` value with `schemata` file, and [generate an error](runtime.md#errors) if doesn't match. ### Example -Consider a two-socket machine with two L3 caches where the default CBM is 0xfffff and the max CBM length is 20 bits. -Tasks inside the container only have access to the "upper" 80% of L3 cache id 0 and the "lower" 50% L3 cache id 1: +Consider a two-socket machine with two L3 caches where the default CBM is 0x7ff and the max CBM length is 11 bits, +and minimum memory bandwidth of 10% with a memory bandwidth granularity of 10%. + +Tasks inside the container only have access to the "upper" 7/11 of L3 cache on socket 0 and the "lower" 5/11 L3 cache on socket 1, +and may use a maximum memory bandwidth of 20% on socket 0 and 70% on socket 1. ```json "linux": { "intelRdt": { "closID": "guaranteed_group", - "l3CacheSchema": "L3:0=ffff0;1=3ff" + "l3CacheSchema": "L3:0=7f0;1=1f", + "memBwSchema": "MB:0=20;1=70" } } ``` diff --git a/schema/config-linux.json b/schema/config-linux.json index 54f1ff44d..f9cc35b13 100644 --- a/schema/config-linux.json +++ b/schema/config-linux.json @@ -233,6 +233,10 @@ }, "l3CacheSchema": { "type": "string" + }, + "memBwSchema": { + "type": "string", + "pattern": "^MB:[^\\n]*$" } } } diff --git a/specs-go/config.go b/specs-go/config.go index c8bcda4ef..9984bbce3 100644 --- a/specs-go/config.go +++ b/specs-go/config.go @@ -160,8 +160,8 @@ type Linux struct { ReadonlyPaths []string `json:"readonlyPaths,omitempty"` // MountLabel specifies the selinux context for the mounts in the container. MountLabel string `json:"mountLabel,omitempty"` - // IntelRdt contains Intel Resource Director Technology (RDT) information - // for handling resource constraints (e.g., L3 cache) for the container + // IntelRdt contains Intel Resource Director Technology (RDT) information for + // handling resource constraints (e.g., L3 cache, memory bandwidth) for the container IntelRdt *LinuxIntelRdt `json:"intelRdt,omitempty"` } @@ -623,12 +623,16 @@ type LinuxSyscall struct { Args []LinuxSeccompArg `json:"args,omitempty"` } -// LinuxIntelRdt has container runtime resource constraints -// for Intel RDT/CAT which introduced in Linux 4.10 kernel +// LinuxIntelRdt has container runtime resource constraints for Intel RDT +// CAT and MBA features which introduced in Linux 4.10 and 4.12 kernel type LinuxIntelRdt struct { // The identity for RDT Class of Service ClosID string `json:"closID,omitempty"` // The schema for L3 cache id and capacity bitmask (CBM) // Format: "L3:=;=;..." L3CacheSchema string `json:"l3CacheSchema,omitempty"` + + // The schema of memory bandwidth percentage per L3 cache id + // Format: "MB:=bandwidth0;=bandwidth1;..." + MemBwSchema string `json:"memBwSchema,omitempty"` }