Documentation ¶
Overview ¶
Package rdt implements an API for managing Intel® RDT technologies via the resctrl pseudo-filesystem of the Linux kernel. It provides flexible configuration with a hierarchical approach for easy management of exclusive cache allocations.
Goresctrl supports all available RDT technologies, i.e. L2 and L3 Cache Allocation (CAT) with Code and Data Prioritization (CDP) and Memory Bandwidth Allocation (MBA) plus Cache Monitoring (CMT) and Memory Bandwidth Monitoring (MBM).
Basic usage example:
rdt.SetLogger(logrus.New()) if err := rdt.Initialize(""); err != nil { return fmt.Errorf("RDT not supported: %v", err) } if err := rdt.SetConfigFromFile("/path/to/rdt.conf.yaml", false); err != nil { return fmt.Errorf("RDT configuration failed: %v", err) } if cls, ok := rdt.GetClass("my-class"); ok { // Set PIDs 12345 and 12346 to class "my-class" if err := cls.AddPids("12345", "12346"); err != nil { return fmt.Errorf("failed to add PIDs to RDT class: %v", err) } }
Index ¶
- Constants
- func ContainerClassFromAnnotations(containerName string, containerAnnotations, podAnnotations map[string]string) (string, error)
- func DiscoverClasses(resctrlGroupPrefix string) error
- func GetMonFeatures() map[MonResource][]string
- func Initialize(resctrlGroupPrefix string) error
- func IsQualifiedClassName(name string) bool
- func MonSupported() bool
- func NewCollector() (prometheus.Collector, error)
- func RegisterCustomPrometheusLabels(names ...string)
- func SetConfig(c *Config, force bool) error
- func SetConfigFromData(data []byte, force bool) error
- func SetConfigFromFile(path string, force bool) error
- func SetLogger(l grclog.Logger)
- type CacheIdCatConfig
- type CacheIdMbaConfig
- type CacheProportion
- type CatConfig
- type CatOptions
- type Config
- type CtrlGroup
- type KubernetesOptions
- type MbOptions
- type MbProportion
- type MbaConfig
- type MonData
- type MonGroup
- type MonL3Data
- type MonLeafData
- type MonResource
- type Options
- type ResctrlGroup
Constants ¶
const ( L2 cacheLevel = "L2" L3 cacheLevel = "L3" )
const ( // RdtContainerAnnotation is the CRI level container annotation for setting // the RDT class (CLOS) of a container RdtContainerAnnotation = "io.kubernetes.cri.rdt-class" // RdtPodAnnotation is a Pod annotation for setting the RDT class (CLOS) of // all containers of the pod RdtPodAnnotation = "rdt.resources.beta.kubernetes.io/pod" // RdtPodAnnotationContainerPrefix is prefix for per-container Pod annotation // for setting the RDT class (CLOS) of one container of the pod RdtPodAnnotationContainerPrefix = "rdt.resources.beta.kubernetes.io/container." )
const ( // RootClassName is the name we use in our config for the special class // that configures the "root" resctrl group of the system RootClassName = "system/default" // RootClassAlias is an alternative name for the root class RootClassAlias = "" )
const CacheIdAll = "all"
CacheIdAll is a special cache id used to denote a default, used as a fallback for all cache ids that are not explicitly specified.
Variables ¶
This section is empty.
Functions ¶
func ContainerClassFromAnnotations ¶
func ContainerClassFromAnnotations(containerName string, containerAnnotations, podAnnotations map[string]string) (string, error)
ContainerClassFromAnnotations determines the effective RDT class of a container from the Pod annotations and CRI level container annotations of a container. Verifies that the class exists in goresctrl configuration and that it is allowed to be used.
func DiscoverClasses ¶
DiscoverClasses discovers existing classes from the resctrl filesystem. Makes it possible to discover gropus with another prefix than was set with Initialize(). The original prefix is still used for monitoring groups.
func GetMonFeatures ¶
func GetMonFeatures() map[MonResource][]string
GetMonFeatures returns the available monitoring stats of each available monitoring technology.
func Initialize ¶
Initialize detects RDT from the system and initializes control interface of the package.
func IsQualifiedClassName ¶
IsQualifiedClassName returns true if given string qualifies as a class name
func MonSupported ¶
func MonSupported() bool
MonSupported returns true if RDT monitoring features are available.
func NewCollector ¶
func NewCollector() (prometheus.Collector, error)
NewCollector creates new Prometheus collector of RDT metrics
func RegisterCustomPrometheusLabels ¶
func RegisterCustomPrometheusLabels(names ...string)
RegisterCustomPrometheusLabels registers monitor group annotations to be exported as Prometheus metrics labels
func SetConfig ¶
SetConfig (re-)configures the resctrl filesystem according to the specified configuration.
func SetConfigFromData ¶
SetConfigFromData takes configuration as raw data, parses it and reconfigures the resctrl filesystem.
func SetConfigFromFile ¶
SetConfigFromFile reads configuration from the filesystem and reconfigures the resctrl filesystem.
Types ¶
type CacheIdCatConfig ¶
type CacheIdCatConfig struct { Unified CacheProportion Code CacheProportion Data CacheProportion }
CacheIdCatConfig is the cache allocation configuration for one cache id. Code and Data represent an optional configuration for separate code and data paths and only have effect when RDT CDP (Code and Data Prioritization) is enabled in the system. Code and Data go in tandem so that both or neither must be specified - only specifying the other is considered a configuration error.
func (*CacheIdCatConfig) UnmarshalJSON ¶
func (c *CacheIdCatConfig) UnmarshalJSON(data []byte) error
UnmarshalJSON implements the Unmarshaler interface of "encoding/json"
type CacheIdMbaConfig ¶
type CacheIdMbaConfig []MbProportion
CacheIdMbaConfig is the memory bandwidth configuration for one cache id. It's an array of at most two values, specifying separate values to be used for percentage based and MBps based memory bandwidth allocation. For example, `{"80%", "1000MBps"}` would allocate 80% if percentage based allocation is used by the Linux kernel, or 1000 MBps in case MBps based allocation is in use.
type CacheProportion ¶
type CacheProportion string
CacheProportion specifies a share of the available cache lines. Supported formats:
- percentage, e.g. `50%` - percentage range, e.g. `50-60%` - bit numbers, e.g. `0-5`, `2,3`, must contain one contiguous block of bits set - hex bitmask, e.g. `0xff0`, must contain one contiguous block of bits set
type CatConfig ¶
type CatConfig map[string]CacheIdCatConfig
CatConfig contains the L2 or L3 cache allocation configuration for one partition or class.
func (*CatConfig) UnmarshalJSON ¶
UnmarshalJSON implements the Unmarshaler interface of "encoding/json"
type CatOptions ¶
type CatOptions struct {
Optional bool
}
CatOptions contains the common settings for cache allocation.
type Config ¶
type Config struct { Options Options `json:"options"` Partitions map[string]struct { L2Allocation CatConfig `json:"l2Allocation"` L3Allocation CatConfig `json:"l3Allocation"` MBAllocation MbaConfig `json:"mbAllocation"` Classes map[string]struct { L2Allocation CatConfig `json:"l2Allocation"` L3Allocation CatConfig `json:"l3Allocation"` MBAllocation MbaConfig `json:"mbAllocation"` Kubernetes KubernetesOptions `json:"kubernetes"` } `json:"classes"` } `json:"partitions"` }
Config is the user-specified RDT configuration.
type CtrlGroup ¶
type CtrlGroup interface { ResctrlGroup // CreateMonGroup creates a new monitoring group under this CtrlGroup. CreateMonGroup(name string, annotations map[string]string) (MonGroup, error) // DeleteMonGroup deletes a monitoring group from this CtrlGroup. DeleteMonGroup(name string) error // DeleteMonGroups deletes all monitoring groups from this CtrlGroup. DeleteMonGroups() error // GetMonGroup returns a specific monitoring group under this CtrlGroup. GetMonGroup(name string) (MonGroup, bool) // GetMonGroups returns all monitoring groups under this CtrlGroup. GetMonGroups() []MonGroup }
CtrlGroup defines the interface of one goresctrl managed RDT class. It maps to one CTRL group directory in the goresctrl pseudo-filesystem.
type KubernetesOptions ¶
type KubernetesOptions struct { DenyPodAnnotation bool `json:"denyPodAnnotation"` DenyContainerAnnotation bool `json:"denyContainerAnnotation"` }
KubernetesOptions contains per-class settings for the Kubernetes-related functionality.
type MbOptions ¶
type MbOptions struct {
Optional bool
}
MbOptions contains the common settings for memory bandwidth allocation.
type MbProportion ¶
type MbProportion string
MbProportion specifies a share of available memory bandwidth. It's an integer value followed by a unit. Two units are supported:
- percentage, e.g. `80%` - MBps, e.g. `1000MBps`
type MbaConfig ¶
type MbaConfig map[string]CacheIdMbaConfig
MbaConfig contains the memory bandwidth configuration for one partition or class.
func (*MbaConfig) UnmarshalJSON ¶
UnmarshalJSON implements the Unmarshaler interface of "encoding/json"
type MonData ¶
type MonData struct {
L3 MonL3Data
}
MonData contains monitoring stats of one monitoring group.
type MonGroup ¶
type MonGroup interface { ResctrlGroup // Parent returns the CtrlGroup under which the monitoring group exists. Parent() CtrlGroup // GetAnnotations returns the annotations stored to the monitoring group. GetAnnotations() map[string]string }
MonGroup represents the interface to a RDT monitoring group. It maps to one MON group in the goresctrl filesystem.
type MonL3Data ¶
type MonL3Data map[uint64]MonLeafData
MonL3Data contains L3 monitoring stats of one monitoring group.
type MonLeafData ¶
MonLeafData represents the raw numerical stats from one RDT monitor data leaf.
type MonResource ¶
type MonResource string
MonResource is the type of RDT monitoring resource.
const ( // MonResourceL3 is the RDT L3 cache monitor resource. MonResourceL3 MonResource = "l3" )
type Options ¶
type Options struct { L2 CatOptions `json:"l2"` L3 CatOptions `json:"l3"` MB MbOptions `json:"mb"` }
Options contains common settings.
type ResctrlGroup ¶
type ResctrlGroup interface { // Name returns the name of the group. Name() string // GetPids returns the process ids assigned to the group. GetPids() ([]string, error) // AddPids assigns the given process ids to the group. AddPids(pids ...string) error // GetMonData retrieves the monitoring data of the group. GetMonData() MonData }
ResctrlGroup is the generic interface for resctrl CTRL and MON groups. It maps to one CTRL or MON group directory in the goresctrl pseudo-filesystem.